forked from GNUsocial/gnu-social
		
	
		
			
	
	
		
			196 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			196 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|   | <?php | ||
|  | /* | ||
|  |  * StatusNet - the distributed open-source microblogging tool | ||
|  |  * Copyright (C) 2008, 2009, StatusNet, Inc. | ||
|  |  * | ||
|  |  * This program is free software: you can redistribute it and/or modify | ||
|  |  * it under the terms of the GNU Affero General Public License as published by | ||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||
|  |  * (at your option) any later version. | ||
|  |  * | ||
|  |  * This program is distributed in the hope that it will be useful, | ||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||
|  |  * GNU Affero General Public License for more details. | ||
|  |  * | ||
|  |  * You should have received a copy of the GNU Affero General Public License | ||
|  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||
|  |  */ | ||
|  | 
 | ||
|  | if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } | ||
|  | 
 | ||
|  | require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; | ||
|  | 
 | ||
|  | abstract class Plugin_DataObject extends Memcached_DataObject | ||
|  | { | ||
|  |     function table() { | ||
|  |         static $table = null; | ||
|  |         if($table == null) { | ||
|  |             $table = array(); | ||
|  |             $DB = $this->getDatabaseConnection(); | ||
|  |             $dbtype = $DB->phptype; | ||
|  |             $tableDef = $this->tableDef(); | ||
|  |             foreach($tableDef->columns as $columnDef){ | ||
|  |                 switch(strtoupper($columnDef->type)) { | ||
|  |                     /*shamelessly copied from DB_DataObject_Generator*/ | ||
|  |                     case 'INT': | ||
|  |                     case 'INT2':    // postgres
 | ||
|  |                     case 'INT4':    // postgres
 | ||
|  |                     case 'INT8':    // postgres
 | ||
|  |                     case 'SERIAL4': // postgres
 | ||
|  |                     case 'SERIAL8': // postgres
 | ||
|  |                     case 'INTEGER': | ||
|  |                     case 'TINYINT': | ||
|  |                     case 'SMALLINT': | ||
|  |                     case 'MEDIUMINT': | ||
|  |                     case 'BIGINT': | ||
|  |                         $type = DB_DATAOBJECT_INT; | ||
|  |                         if ($columnDef->size == 1) { | ||
|  |                             $type +=  DB_DATAOBJECT_BOOL; | ||
|  |                         } | ||
|  |                         break; | ||
|  |                     | ||
|  |                     case 'REAL': | ||
|  |                     case 'DOUBLE': | ||
|  |                     case 'DOUBLE PRECISION': // double precision (firebird)
 | ||
|  |                     case 'FLOAT': | ||
|  |                     case 'FLOAT4': // real (postgres)
 | ||
|  |                     case 'FLOAT8': // double precision (postgres)
 | ||
|  |                     case 'DECIMAL': | ||
|  |                     case 'MONEY':  // mssql and maybe others
 | ||
|  |                     case 'NUMERIC': | ||
|  |                     case 'NUMBER': // oci8 
 | ||
|  |                         $type = DB_DATAOBJECT_INT; // should really by FLOAT!!! / MONEY...
 | ||
|  |                         break; | ||
|  |                          | ||
|  |                     case 'YEAR': | ||
|  |                         $type = DB_DATAOBJECT_INT;  | ||
|  |                         break; | ||
|  |                          | ||
|  |                     case 'BIT': | ||
|  |                     case 'BOOL':    | ||
|  |                     case 'BOOLEAN':    | ||
|  |                      | ||
|  |                         $type = DB_DATAOBJECT_BOOL; | ||
|  |                         // postgres needs to quote '0'
 | ||
|  |                         if ($dbtype == 'pgsql') { | ||
|  |                             $type +=  DB_DATAOBJECT_STR; | ||
|  |                         } | ||
|  |                         break; | ||
|  |                          | ||
|  |                     case 'STRING': | ||
|  |                     case 'CHAR': | ||
|  |                     case 'VARCHAR': | ||
|  |                     case 'VARCHAR2': | ||
|  |                     case 'TINYTEXT': | ||
|  |                      | ||
|  |                     case 'ENUM': | ||
|  |                     case 'SET':         // not really but oh well
 | ||
|  |                      | ||
|  |                     case 'POINT':       // mysql geometry stuff - not really string - but will do..
 | ||
|  |                      | ||
|  |                     case 'TIMESTAMPTZ': // postgres
 | ||
|  |                     case 'BPCHAR':      // postgres
 | ||
|  |                     case 'INTERVAL':    // postgres (eg. '12 days')
 | ||
|  |                      | ||
|  |                     case 'CIDR':        // postgres IP net spec
 | ||
|  |                     case 'INET':        // postgres IP
 | ||
|  |                     case 'MACADDR':     // postgress network Mac address.
 | ||
|  |                      | ||
|  |                     case 'INTEGER[]':   // postgres type
 | ||
|  |                     case 'BOOLEAN[]':   // postgres type
 | ||
|  |                      | ||
|  |                         $type = DB_DATAOBJECT_STR; | ||
|  |                         break; | ||
|  |                      | ||
|  |                     case 'TEXT': | ||
|  |                     case 'MEDIUMTEXT': | ||
|  |                     case 'LONGTEXT': | ||
|  |                          | ||
|  |                         $type = DB_DATAOBJECT_STR + DB_DATAOBJECT_TXT; | ||
|  |                         break; | ||
|  |                      | ||
|  |                      | ||
|  |                     case 'DATE':     | ||
|  |                         $type = DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE; | ||
|  |                         break; | ||
|  |                          | ||
|  |                     case 'TIME':     | ||
|  |                         $type = DB_DATAOBJECT_STR + DB_DATAOBJECT_TIME; | ||
|  |                         break;     | ||
|  |                          | ||
|  |                      | ||
|  |                     case 'DATETIME':  | ||
|  |                           | ||
|  |                         $type = DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME; | ||
|  |                         break;     | ||
|  |                          | ||
|  |                     case 'TIMESTAMP': // do other databases use this???
 | ||
|  |                          | ||
|  |                         $type = ($dbtype == 'mysql') ? | ||
|  |                             DB_DATAOBJECT_MYSQLTIMESTAMP :  | ||
|  |                             DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME; | ||
|  |                         break;     | ||
|  |                          | ||
|  |                      | ||
|  |                     case 'BLOB':       /// these should really be ignored!!!???
 | ||
|  |                     case 'TINYBLOB': | ||
|  |                     case 'MEDIUMBLOB': | ||
|  |                     case 'LONGBLOB': | ||
|  |                      | ||
|  |                     case 'CLOB': // oracle character lob support
 | ||
|  |                      | ||
|  |                     case 'BYTEA':   // postgres blob support..
 | ||
|  |                         $type = DB_DATAOBJECT_STR + DB_DATAOBJECT_BLOB; | ||
|  |                         break; | ||
|  |                          | ||
|  |                     default: | ||
|  |                         throw new Exception("Cannot handle datatype: $columnDef->type"); | ||
|  |                 } | ||
|  |                 if(! $columnDef->nullable) { | ||
|  |                     $type+=DB_DATAOBJECT_NOTNULL; | ||
|  |                 } | ||
|  |                 $table[$columnDef->name]=$type; | ||
|  |             } | ||
|  |         } | ||
|  |         return $table; | ||
|  |     } | ||
|  | 
 | ||
|  |     function keys() { | ||
|  |         static $keys = null; | ||
|  |         if($keys == null) { | ||
|  |             $keys = array(); | ||
|  |             $tableDef = $this->tableDef(); | ||
|  |             foreach($tableDef->columns as $columnDef){ | ||
|  |                 if($columnDef->key != null){ | ||
|  |                     $keys[] = $columnDef->name; | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |         return $keys; | ||
|  |     } | ||
|  | 
 | ||
|  |     function sequenceKey() { | ||
|  |         static $sequenceKey = null; | ||
|  |         if($sequenceKey == null) { | ||
|  |             $sequenceKey = array(false,false); | ||
|  |             $tableDef = $this->tableDef(); | ||
|  |             foreach($tableDef->columns as $columnDef){ | ||
|  |                 if($columnDef->key == 'PRI' && $columnDef->auto_increment){ | ||
|  |                     $sequenceKey=array($columnDef->name,true); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |         return $sequenceKey; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |     * Get the TableDef object that represents the table backing this class | ||
|  |     * Ideally, this function would a static function, but PHP doesn't allow | ||
|  |     * abstract static functions | ||
|  |     * @return TableDef TableDef instance | ||
|  |     */ | ||
|  |     abstract function tableDef(); | ||
|  | } | ||
|  | 
 |