. */ 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(); }