inc/DBSchema/mysql.php
authorAlan Knowles <alan@akbkhome.com>
Thu, 27 Jan 2011 14:25:01 +0000 (22:25 +0800)
committerAlan Knowles <alan@akbkhome.com>
Thu, 27 Jan 2011 14:25:01 +0000 (22:25 +0800)
inc/DBSchema/mysql.php

index e69de29..882bd8b 100644 (file)
@@ -0,0 +1,69 @@
+<?php
+
+
+require_once 'DBSchema/Generic.php';
+
+class MTrackDBSchema_mysql extends MTrackDBSchema_Generic {
+  var $typemap = array(
+    'autoinc' => 'SERIAL UNIQUE',
+    'timestamp' => 'timestamp with time zone',
+    'blob' => 'bytea',
+  );
+
+  function alterTable(MTrackDBSchema_Table $from, MTrackDBSchema_Table $to)
+  {
+    $sql = array();
+    $actions = array();
+
+    /* if keys have changed, we drop the old key definitions before changing the columns */
+    if (is_array($from->keys)) foreach ($from->keys as $k) {
+      if (!isset($to->keys[$k->name]) || $to->keys[$k->name] != $k) {
+        if ($k->type == 'primary') {
+          $actions[] = "DROP CONSTRAINT {$from->name}_pkey";
+        } else {
+          $sql[] = "DROP INDEX $k->name";
+        }
+      }
+    }
+
+    foreach ($from->fields as $f) {
+      if (!isset($to->fields[$f->name])) {
+        $actions[] = "DROP COLUMN $f->name";
+        continue;
+      }
+    }
+    foreach ($to->fields as $f) {
+      if (isset($from->fields[$f->name])) continue;
+      $actions[] = "ADD COLUMN " . $this->computeFieldCreate($f);
+    }
+
+    /* changed and new keys */
+    if (is_array($from->keys)) foreach ($from->keys as $k) {
+      if (isset($to->keys[$k->name]) && $to->keys[$k->name] != $k) {
+        if ($k->type == 'primary') {
+          $actions[] = "ADD primary key (" . join(', ', $k->fields) . ")";
+        } else {
+          $sql[] = $this->computeIndexCreate($to, $k);
+        }
+      }
+    }
+    if (is_array($to->keys)) foreach ($to->keys as $k) {
+      if (isset($from->keys[$k->name])) continue;
+      if ($k->type == 'primary') {
+        $actions[] = "ADD primary key (" . join(', ', $k->fields) . ")";
+      } else {
+        $sql[] = $this->computeIndexCreate($to, $k);
+      }
+    }
+
+    if (count($actions)) {
+      $sql[] = "ALTER TABLE $from->name " . join(",\n", $actions);
+    }
+    echo "Need to alter $from->name\n";
+    echo "SQL:\n";
+    var_dump($sql);
+    foreach ($sql as $s) {
+      $this->db->exec($s);
+    }
+  }
+}
\ No newline at end of file