]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
first pass at columndef->drupal-style array converter (need to handle some more thing...
authorBrion Vibber <brion@pobox.com>
Mon, 16 Aug 2010 22:14:16 +0000 (15:14 -0700)
committerBrion Vibber <brion@pobox.com>
Mon, 16 Aug 2010 22:14:16 +0000 (15:14 -0700)
classes/Managed_DataObject.php
lib/schema.php

index 3bc99c2eba9cafd501705c15c65db9fa86186941..31aa7c359314a3584d38abbb3912a61d39dbae80 100644 (file)
@@ -21,9 +21,9 @@
  * Wrapper for Memcached_DataObject which knows its own schema definition.
  * Builds its own damn settings from a schema definition.
  *
- * @author brion
+ * @author Brion Vibber <brion@status.net>
  */
-class Managed_DataObject extends Memcached_DataObject
+abstract class Managed_DataObject extends Memcached_DataObject
 {
     /**
      * The One True Thingy that must be defined and declared.
index e5def514e31ddbc227ecb2a6afaec272c9c5d2dc..9ebef8aa26e3e8e2955e66c8a2340865943fcd3e 100644 (file)
@@ -41,6 +41,7 @@ if (!defined('STATUSNET')) {
  * @category Database
  * @package  StatusNet
  * @author   Evan Prodromou <evan@status.net>
+ * @author   Brion Vibber <brion@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/
  */
@@ -491,6 +492,75 @@ class Schema
 
         return $sql;
     }
+
+    /**
+     * Convert an old-style set of ColumnDef objects into the current
+     * Drupal-style schema definition array, for backwards compatibility
+     * with plugins written for 0.9.x.
+     *
+     * @param string $tableName
+     * @param array $defs
+     * @return array
+     */
+    function oldToNew($tableName, $defs)
+    {
+        $table = array();
+        $prefixes = array(
+            'tiny',
+            'small',
+            'medium',
+            'big',
+        );
+        foreach ($defs as $cd) {
+            $cd->addToTableDef($table);
+            $column = array();
+            $column['type'] = $cd->type;
+            foreach ($prefixes as $prefix) {
+                if (substr($cd->type, 0, strlen($prefix)) == $prefix) {
+                    $column['type'] = substr($cd->type, strlen($prefix));
+                    $column['size'] = $prefix;
+                    break;
+                }
+            }
+
+            if ($cd->size) {
+                if ($cd->type == 'varchar' || $cd->type == 'char') {
+                    $column['length'] = $cd->size;
+                }
+            }
+            if (!$cd->nullable) {
+                $column['not null'] = true;
+            }
+            if ($cd->autoincrement) {
+                $column['type'] = 'serial';
+            }
+            if ($cd->default) {
+                $column['default'] = $cd->default;
+            }
+            $table['fields'][$cd->name] = $column;
+
+            if ($cd->key == 'PRI') {
+                // If multiple columns are defined as primary key,
+                // we'll pile them on in sequence.
+                if (!isset($table['primary key'])) {
+                    $table['primary key'] = array();
+                }
+                $table['primary key'][] = $cd->name;
+            } else if ($cd->key == 'MUL') {
+                // Individual multiple-value indexes are only per-column
+                // using the old ColumnDef syntax.
+                $idx = "{$tableName}_{$cd->name}_idx";
+                $table['indexes'][$idx] = array($cd->name);
+            } else if ($cd->key == 'UNI') {
+                // Individual unique-value indexes are only per-column
+                // using the old ColumnDef syntax.
+                $idx = "{$tableName}_{$cd->name}_idx";
+                $table['unique keys'][$idx] = array($cd->name);
+            }
+        }
+
+        return $table;
+    }
 }
 
 class SchemaTableMissingException extends Exception