]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Allow plugin DB_DataObject classes to not have to use the .ini file by overriding...
authorCraig Andrews <candrews@integralblue.com>
Mon, 16 Nov 2009 20:24:25 +0000 (15:24 -0500)
committerCraig Andrews <candrews@integralblue.com>
Mon, 16 Nov 2009 20:24:25 +0000 (15:24 -0500)
classes/Plugin_DataObject.php [new file with mode: 0644]
classes/statusnet.ini
lib/schema.php
plugins/Authentication/AuthenticationPlugin.php
plugins/Authentication/User_username.php
plugins/OpenID/OpenIDPlugin.php
plugins/OpenID/User_openid.php
plugins/OpenID/User_openid_trustroot.php
plugins/UserFlag/UserFlagPlugin.php
plugins/UserFlag/User_flag_profile.php

diff --git a/classes/Plugin_DataObject.php b/classes/Plugin_DataObject.php
new file mode 100644 (file)
index 0000000..d5cecf0
--- /dev/null
@@ -0,0 +1,195 @@
+<?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();
+}
+
index 19ab7bf975d6694bcc50f6b9a45fe33de8dd0032..8572ea8ac5335ea9b27f9d37d0993ff48447259d 100644 (file)
@@ -526,27 +526,6 @@ modified = 384
 [user_group__keys]
 id = N
 
-[user_openid]
-canonical = 130
-display = 130
-user_id = 129
-created = 142
-modified = 384
-
-[user_openid__keys]
-canonical = K
-display = U
-
-[user_openid_trustroot]
-trustroot = 130
-user_id = 129
-created = 142
-modified = 384
-
-[user_openid__keys]
-trustroot = K
-user_id = K
-
 [user_role]
 user_id = 129
 role = 130
@@ -566,13 +545,3 @@ modified = 384
 user_id = K
 token = K
 
-[user_username]
-user_id = 129
-provider_name = 130
-username = 130
-created = 142
-modified = 384
-
-[user_username__keys]
-provider_name = K
-username = K
index 1e0c1f3e98dccab5a564d9506e140695c87b81ad..560884d9f7347137a61619a35e0b2494a4e57847 100644 (file)
@@ -372,6 +372,26 @@ class Schema
         return true;
     }
 
+    /**
+     * Ensures that the table that backs a given
+     * Plugin_DataObject class exists.
+     *
+     * If the table does not yet exist, it will
+     * create the table. If it does exist, it will
+     * alter the table to match the column definitions.
+     *
+     * @param Plugin_DataObject $dataObjectClass
+     *
+     * @return boolean success flag
+     */
+
+    public function ensureDataObject($dataObjectClass)
+    {
+        $obj = new $dataObjectClass();
+        $tableDef = $obj->tableDef();
+        return $this->ensureTable($tableDef->name,$tableDef->columns);
+    }
+
     /**
      * Ensures that a table exists with the given
      * name and the given column definitions.
@@ -544,6 +564,19 @@ class TableDef
     public $name;
     /** array of ColumnDef objects for the columns. */
     public $columns;
+    
+    /**
+     * Constructor.
+     *
+     * @param string  $name     name of the table
+     * @param array   $columns  columns in the table
+     */
+
+    function __construct($name=null,$columns=null)
+    {
+        $this->name = $name;
+        $this->columns = $columns;
+    }
 }
 
 /**
@@ -576,6 +609,8 @@ class ColumnDef
     /** 'extra' stuff. Returned by MySQL, largely
      * unused. */
     public $extra;
+    /** auto increment this field if no value is specific for it during an insert **/
+    public $auto_increment;
 
     /**
      * Constructor.
@@ -591,7 +626,7 @@ class ColumnDef
 
     function __construct($name=null, $type=null, $size=null,
                          $nullable=true, $key=null, $default=null,
-                         $extra=null)
+                         $extra=null, $auto_increment=false)
     {
         $this->name     = strtolower($name);
         $this->type     = strtolower($type);
@@ -600,6 +635,7 @@ class ColumnDef
         $this->key      = $key;
         $this->default  = $default;
         $this->extra    = $extra;
+        $this->auto_increment = $auto_increment;
     }
 
     /**
@@ -617,7 +653,8 @@ class ColumnDef
                 $this->_typeMatch($other) &&
                 $this->_defaultMatch($other) &&
                 $this->_nullMatch($other) &&
-                $this->key == $other->key);
+                $this->key == $other->key &&
+                $this->auto_increment == $other->auto_increment);
     }
 
     /**
index a76848b04e09f5bb4fe4a0473b840a971e9de35c..a80da901cf4954b4daa4753ae2a5c620255baded 100644 (file)
@@ -204,16 +204,7 @@ abstract class AuthenticationPlugin extends Plugin
 
     function onCheckSchema() {
         $schema = Schema::get();
-        $schema->ensureTable('user_username',
-                             array(new ColumnDef('provider_name', 'varchar',
-                                                 '255', false, 'PRI'),
-                                   new ColumnDef('username', 'varchar',
-                                                 '255', false, 'PRI'),
-                                   new ColumnDef('user_id', 'integer',
-                                                 null, false),
-                                   new ColumnDef('created', 'datetime',
-                                                 null, false),
-                                   new ColumnDef('modified', 'timestamp')));
+        $schema->ensureDataObject(User_username);
         return true;
     }
 
index f30f60d839a6462bd706d49c1548188e827ba9ae..6826f268175984415775563d5a90b878e92afc2b 100644 (file)
@@ -2,9 +2,9 @@
 /**
  * Table Definition for user_username
  */
-require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
+require_once INSTALLDIR.'/classes/Plugin_DataObject.php';
 
-class User_username extends Memcached_DataObject
+class User_username extends Plugin_DataObject
 {
     ###START_AUTOCODE
     /* the code below is auto generated do not remove the above tag */
@@ -43,4 +43,22 @@ class User_username extends Memcached_DataObject
             return false;
         }
     }
+
+    /**
+    * Get the TableDef object that represents the table backing this class
+    * @return TableDef TableDef instance
+    */
+    function tableDef()
+    {
+        return new TableDef($this->__table,
+                             array(new ColumnDef('provider_name', 'varchar',
+                                                 '255', false, 'PRI'),
+                                   new ColumnDef('username', 'varchar',
+                                                 '255', false, 'PRI'),
+                                   new ColumnDef('user_id', 'integer',
+                                                 null, false),
+                                   new ColumnDef('created', 'datetime',
+                                                 null, false),
+                                   new ColumnDef('modified', 'timestamp')));
+    }
 }
index 55c0eadaf3ea1d00b04ec933daa922aa88c472b3..88e23ea3e5611308972fb8a1864633785499b9fd 100644 (file)
@@ -156,6 +156,9 @@ class OpenIDPlugin extends Plugin
          case 'User_openid':
             require_once(INSTALLDIR.'/plugins/OpenID/User_openid.php');
             return false;
+         case 'User_openid_trustroot':
+            require_once(INSTALLDIR.'/plugins/OpenID/User_openid_trustroot.php');
+            return false;
          default:
             return true;
         }
@@ -278,24 +281,8 @@ class OpenIDPlugin extends Plugin
 
     function onCheckSchema() {
         $schema = Schema::get();
-        $schema->ensureTable('user_openid',
-                             array(new ColumnDef('canonical', 'varchar',
-                                                 '255', false, 'PRI'),
-                                   new ColumnDef('display', 'varchar',
-                                                 '255', false),
-                                   new ColumnDef('user_id', 'integer',
-                                                 null, false, 'MUL'),
-                                   new ColumnDef('created', 'datetime',
-                                                 null, false),
-                                   new ColumnDef('modified', 'timestamp')));
-        $schema->ensureTable('user_openid_trustroot',
-                             array(new ColumnDef('trustroot', 'varchar',
-                                                 '255', false, 'PRI'),
-                                   new ColumnDef('user_id', 'integer',
-                                                 null, false, 'PRI'),
-                                   new ColumnDef('created', 'datetime',
-                                                 null, false),
-                                   new ColumnDef('modified', 'timestamp')));
+        $schema->ensureDataObject(User_openid);
+        $schema->ensureDataObject(User_openid_trustroot);
         return true;
     }
 
index 338e0f6e92c441990e30f2a9af672e06dddc645e..c3624118e7b6991ae4b684a68614854ab8c9e1ee 100644 (file)
@@ -2,9 +2,9 @@
 /**
  * Table Definition for user_openid
  */
-require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
+require_once INSTALLDIR.'/classes/Plugin_DataObject.php';
 
-class User_openid extends Memcached_DataObject
+class User_openid extends Plugin_DataObject
 {
     ###START_AUTOCODE
     /* the code below is auto generated do not remove the above tag */
@@ -33,4 +33,22 @@ class User_openid extends Memcached_DataObject
 
         return ($cnt > 0);
     }
+
+    /**
+    * Get the TableDef object that represents the table backing this class
+    * @return TableDef TableDef instance
+    */
+    function tableDef()
+    {
+        return new TableDef($this->__table,
+                             array(new ColumnDef('canonical', 'varchar',
+                                                 '255', false, 'PRI'),
+                                   new ColumnDef('display', 'varchar',
+                                                 '255', false),
+                                   new ColumnDef('user_id', 'integer',
+                                                 null, false, 'MUL'),
+                                   new ColumnDef('created', 'datetime',
+                                                 null, false),
+                                   new ColumnDef('modified', 'timestamp')));
+    }
 }
index 4654b72df70da17de3db7a633f43c2241c67c9bc..b208dddfdc6464f8605ce9e85f65440377fa70e2 100644 (file)
@@ -2,9 +2,9 @@
 /**
  * Table Definition for user_openid_trustroot
  */
-require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
+require_once INSTALLDIR.'/classes/Plugin_DataObject.php';
 
-class User_openid_trustroot extends Memcached_DataObject
+class User_openid_trustroot extends Plugin_DataObject
 {
     ###START_AUTOCODE
     /* the code below is auto generated do not remove the above tag */
@@ -26,4 +26,20 @@ class User_openid_trustroot extends Memcached_DataObject
     {
         return Memcached_DataObject::pkeyGet('User_openid_trustroot', $kv);
     }
+
+    /**
+    * Get the TableDef object that represents the table backing this class
+    * @return TableDef TableDef instance
+    */
+    function tableDef()
+    {
+        return new TableDef($this->__table,
+                             array(new ColumnDef('trustroot', 'varchar',
+                                                 '255', false, 'PRI'),
+                                   new ColumnDef('user_id', 'integer',
+                                                 null, false, 'PRI'),
+                                   new ColumnDef('created', 'datetime',
+                                                 null, false),
+                                   new ColumnDef('modified', 'timestamp')));
+    }
 }
index 6410ee1ce68fd5e00842ccf47e8ade476a1ec315..df7eac7a2b521c3b51e4a533c0614c702fdec03b 100644 (file)
@@ -48,16 +48,7 @@ class UserFlagPlugin extends Plugin
         $schema = Schema::get();
 
         // For storing user-submitted flags on profiles
-
-        $schema->ensureTable('user_flag_profile',
-                             array(new ColumnDef('profile_id', 'integer', null,
-                                                 false, 'PRI'),
-                                   new ColumnDef('user_id', 'integer', null,
-                                                 false, 'PRI'),
-                                   new ColumnDef('created', 'datetime', null,
-                                                 false, 'MUL'),
-                                   new ColumnDef('cleared', 'datetime', null,
-                                                 true, 'MUL')));
+        $schema->ensureDataObject(User_flag_profile);
 
         return true;
     }
index 30bd4ae68de75aee12a7b5271ba653a909a54a08..2fb27912d284f1f87674aa18939dbe2a30597f26 100644 (file)
@@ -21,9 +21,9 @@ if (!defined('STATUSNET')) {
     exit(1);
 }
 
-require_once INSTALLDIR . '/classes/Memcached_DataObject.php';
+require_once INSTALLDIR.'/classes/Plugin_DataObject.php';
 
-class User_flag_profile extends Memcached_DataObject
+class User_flag_profile extends Plugin_DataObject
 {
     ###START_AUTOCODE
     /* the code below is auto generated do not remove the above tag */
@@ -65,4 +65,21 @@ class User_flag_profile extends Memcached_DataObject
 
         return !empty($ufp);
     }
+
+    /**
+    * Get the TableDef object that represents the table backing this class
+    * @return TableDef TableDef instance
+    */
+    function tableDef()
+    {
+        return new TableDef($this->__table,
+                             array(new ColumnDef('profile_id', 'integer', null,
+                                                 false, 'PRI'),
+                                   new ColumnDef('user_id', 'integer', null,
+                                                 false, 'PRI'),
+                                   new ColumnDef('created', 'datetime', null,
+                                                 false, 'MUL'),
+                                   new ColumnDef('cleared', 'datetime', null,
+                                                 true, 'MUL')));
+    }
 }