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