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