]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/schema.php
Merge branch 'master' into testing
[quix0rs-gnu-social.git] / lib / schema.php
index 560884d9f7347137a61619a35e0b2494a4e57847..137b814e0269ed727978e11e55ce25cca763a199 100644 (file)
@@ -75,64 +75,14 @@ class Schema
 
     static function get()
     {
+        $type = common_config('db', 'type');
         if (empty(self::$_single)) {
-            self::$_single = new Schema();
+            $schemaClass = ucfirst($type).'Schema';
+            self::$_single = new $schemaClass();
         }
         return self::$_single;
     }
 
-    /**
-     * Returns a TableDef object for the table
-     * in the schema with the given name.
-     *
-     * Throws an exception if the table is not found.
-     *
-     * @param string $name Name of the table to get
-     *
-     * @return TableDef tabledef for that table.
-     */
-
-    public function getTableDef($name)
-    {
-        $res =& $this->conn->query('DESCRIBE ' . $name);
-
-        if (PEAR::isError($res)) {
-            throw new Exception($res->getMessage());
-        }
-
-        $td = new TableDef();
-
-        $td->name    = $name;
-        $td->columns = array();
-
-        $row = array();
-
-        while ($res->fetchInto($row, DB_FETCHMODE_ASSOC)) {
-
-            $cd = new ColumnDef();
-
-            $cd->name = $row['Field'];
-
-            $packed = $row['Type'];
-
-            if (preg_match('/^(\w+)\((\d+)\)$/', $packed, $match)) {
-                $cd->type = $match[1];
-                $cd->size = $match[2];
-            } else {
-                $cd->type = $packed;
-            }
-
-            $cd->nullable = ($row['Null'] == 'YES') ? true : false;
-            $cd->key      = $row['Key'];
-            $cd->default  = $row['Default'];
-            $cd->extra    = $row['Extra'];
-
-            $td->columns[] = $cd;
-        }
-
-        return $td;
-    }
-
     /**
      * Gets a ColumnDef object for a single column.
      *
@@ -213,7 +163,7 @@ class Schema
 
         $sql .= "); ";
 
-        $res =& $this->conn->query($sql);
+        $res = $this->conn->query($sql);
 
         if (PEAR::isError($res)) {
             throw new Exception($res->getMessage());
@@ -234,7 +184,7 @@ class Schema
 
     public function dropTable($name)
     {
-        $res =& $this->conn->query("DROP TABLE $name");
+        $res = $this->conn->query("DROP TABLE $name");
 
         if (PEAR::isError($res)) {
             throw new Exception($res->getMessage());
@@ -269,7 +219,7 @@ class Schema
             $name = "$table_".implode("_", $columnNames)."_idx";
         }
 
-        $res =& $this->conn->query("ALTER TABLE $table ".
+        $res = $this->conn->query("ALTER TABLE $table ".
                                    "ADD INDEX $name (".
                                    implode(",", $columnNames).")");
 
@@ -291,7 +241,7 @@ class Schema
 
     public function dropIndex($table, $name)
     {
-        $res =& $this->conn->query("ALTER TABLE $table DROP INDEX $name");
+        $res = $this->conn->query("ALTER TABLE $table DROP INDEX $name");
 
         if (PEAR::isError($res)) {
             throw new Exception($res->getMessage());
@@ -314,7 +264,7 @@ class Schema
     {
         $sql = "ALTER TABLE $table ADD COLUMN " . $this->_columnSql($columndef);
 
-        $res =& $this->conn->query($sql);
+        $res = $this->conn->query($sql);
 
         if (PEAR::isError($res)) {
             throw new Exception($res->getMessage());
@@ -339,7 +289,7 @@ class Schema
         $sql = "ALTER TABLE $table MODIFY COLUMN " .
           $this->_columnSql($columndef);
 
-        $res =& $this->conn->query($sql);
+        $res = $this->conn->query($sql);
 
         if (PEAR::isError($res)) {
             throw new Exception($res->getMessage());
@@ -363,7 +313,7 @@ class Schema
     {
         $sql = "ALTER TABLE $table DROP COLUMN $columnName";
 
-        $res =& $this->conn->query($sql);
+        $res = $this->conn->query($sql);
 
         if (PEAR::isError($res)) {
             throw new Exception($res->getMessage());
@@ -372,26 +322,6 @@ 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.
@@ -466,7 +396,7 @@ class Schema
 
         $sql = 'ALTER TABLE ' . $tableName . ' ' . implode(', ', $phrase);
 
-        $res =& $this->conn->query($sql);
+        $res = $this->conn->query($sql);
 
         if (PEAR::isError($res)) {
             throw new Exception($res->getMessage());
@@ -544,174 +474,14 @@ class Schema
             $sql .= ($cd->nullable) ? "null " : "not null ";
         }
 
-        return $sql;
-    }
-}
-
-/**
- * A class encapsulating the structure of a table.
- *
- * @category Database
- * @package  StatusNet
- * @author   Evan Prodromou <evan@status.net>
- * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
- * @link     http://status.net/
- */
-
-class TableDef
-{
-    /** name of the table */
-    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;
-    }
-}
-
-/**
- * A class encapsulating the structure of a column in a table.
- *
- * @category Database
- * @package  StatusNet
- * @author   Evan Prodromou <evan@status.net>
- * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
- * @link     http://status.net/
- */
-
-class ColumnDef
-{
-    /** name of the column. */
-    public $name;
-    /** type of column, e.g. 'int', 'varchar' */
-    public $type;
-    /** size of the column. */
-    public $size;
-    /** boolean flag; can it be null? */
-    public $nullable;
-    /**
-     * type of key: null = no key; 'PRI' => primary;
-     * 'UNI' => unique key; 'MUL' => multiple values.
-     */
-    public $key;
-    /** default value if any. */
-    public $default;
-    /** '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.
-     *
-     * @param string  $name     name of the column
-     * @param string  $type     type of the column
-     * @param int     $size     size of the column
-     * @param boolean $nullable can this be null?
-     * @param string  $key      type of key
-     * @param value   $default  default value
-     * @param value   $extra    unused
-     */
-
-    function __construct($name=null, $type=null, $size=null,
-                         $nullable=true, $key=null, $default=null,
-                         $extra=null, $auto_increment=false)
-    {
-        $this->name     = strtolower($name);
-        $this->type     = strtolower($type);
-        $this->size     = $size+0;
-        $this->nullable = $nullable;
-        $this->key      = $key;
-        $this->default  = $default;
-        $this->extra    = $extra;
-        $this->auto_increment = $auto_increment;
-    }
-
-    /**
-     * Compares this columndef with another to see
-     * if they're functionally equivalent.
-     *
-     * @param ColumnDef $other column to compare
-     *
-     * @return boolean true if equivalent, otherwise false.
-     */
-
-    function equals($other)
-    {
-        return ($this->name == $other->name &&
-                $this->_typeMatch($other) &&
-                $this->_defaultMatch($other) &&
-                $this->_nullMatch($other) &&
-                $this->key == $other->key &&
-                $this->auto_increment == $other->auto_increment);
-    }
-
-    /**
-     * Does the type of this column match the
-     * type of the other column?
-     *
-     * Checks the type and size of a column. Tries
-     * to ignore differences between synonymous
-     * data types, like 'integer' and 'int'.
-     *
-     * @param ColumnDef $other other column to check
-     *
-     * @return boolean true if they're about equivalent
-     */
-
-    private function _typeMatch($other)
-    {
-        switch ($this->type) {
-        case 'integer':
-        case 'int':
-            return ($other->type == 'integer' ||
-                    $other->type == 'int');
-            break;
-        default:
-            return ($this->type == $other->type &&
-                    $this->size == $other->size);
+        if (!empty($cd->auto_increment)) {
+            $sql .= " auto_increment ";
         }
-    }
-
-    /**
-     * Does the default behaviour of this column match
-     * the other?
-     *
-     * @param ColumnDef $other other column to check
-     *
-     * @return boolean true if defaults are effectively the same.
-     */
-
-    private function _defaultMatch($other)
-    {
-        return ((is_null($this->default) && is_null($other->default)) ||
-                ($this->default == $other->default));
-    }
 
-    /**
-     * Does the null behaviour of this column match
-     * the other?
-     *
-     * @param ColumnDef $other other column to check
-     *
-     * @return boolean true if these columns 'null' the same.
-     */
+        if (!empty($cd->extra)) {
+            $sql .= "{$cd->extra} ";
+        }
 
-    private function _nullMatch($other)
-    {
-        return ((!is_null($this->default) && !is_null($other->default) &&
-                 $this->default == $other->default) ||
-                ($this->nullable == $other->nullable));
+        return $sql;
     }
 }