]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - scripts/dumpschema.php
Merge remote-tracking branch 'upstream/master' into social-master
[quix0rs-gnu-social.git] / scripts / dumpschema.php
old mode 100644 (file)
new mode 100755 (executable)
index 20812fe..05638cd
@@ -23,10 +23,18 @@ define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
 $helptext = <<<END_OF_CHECKSCHEMA_HELP
 Attempt to pull a schema definition for a given table.
 
+  --all     run over all defined core tables
+  --diff    show differences between the expected and live table defs
+  --raw     skip compatibility filtering for diffs
+  --create  dump SQL that would be run to update or create this table
+  --build   dump SQL that would be run to create this table fresh
+  --checksum just output checksums from the source schema defs
+
+
 END_OF_CHECKSCHEMA_HELP;
 
-$longoptions = array('diff');
-require_once INSTALLDIR.'/scripts/commandline.inc';
+$longoptions = array('diff', 'all', 'create', 'update', 'raw', 'checksum');
+require_once INSTALLDIR.'/scripts/commandline.inc.php';
 
 function indentOptions($indent)
 {
@@ -87,6 +95,13 @@ function getCoreSchema($tableName)
     return $schema[$tableName];
 }
 
+function getCoreTables()
+{
+    $schema = array();
+    include INSTALLDIR . '/db/core.php';
+    return array_keys($schema);
+}
+
 function dumpTable($tableName, $live)
 {
     if ($live) {
@@ -97,42 +112,142 @@ function dumpTable($tableName, $live)
         $def = getCoreSchema($tableName);
     }
     prettyDumpArray($def, $tableName);
+    print "\n";
+}
+
+function dumpBuildTable($tableName)
+{
+    echo "-- \n";
+    echo "-- $tableName\n";
+    echo "-- \n";
+
+    $schema = Schema::get();
+    $def = getCoreSchema($tableName);
+    $sql = $schema->buildCreateTable($tableName, $def);
+    $sql[] = '';
+
+    echo implode(";\n", $sql);
     echo "\n";
 }
 
-function showDiff($a, $b)
+function dumpEnsureTable($tableName)
 {
-    $fnameA = tempnam(sys_get_temp_dir(), 'defined-diff-a');
-    file_put_contents($fnameA, $a);
+    $schema = Schema::get();
+    $def = getCoreSchema($tableName);
+    $sql = $schema->buildEnsureTable($tableName, $def);
+
+    if ($sql) {
+        echo "-- \n";
+        echo "-- $tableName\n";
+        echo "-- \n";
+
+        $sql[] = '';
+        echo implode(";\n", $sql);
+        echo "\n";
+    }
+}
 
-    $fnameB = tempnam(sys_get_temp_dir(), 'detected-diff-b');
-    file_put_contents($fnameB, $b);
+function dumpDiff($tableName, $filter)
+{
+    $schema = Schema::get();
+    $def = getCoreSchema($tableName);
+    try {
+        $old = $schema->getTableDef($tableName);
+    } catch (Exception $e) {
+        // @fixme this is a terrible check :D
+        if (preg_match('/no such table/i', $e->getMessage())) {
+            return dumpTable($tableName, false);
+        } else {
+            throw $e;
+        }
+    }
+
+    if ($filter) {
+        //$old = $schema->filterDef($old);
+        $def = $schema->filterDef($def);
+    }
 
-    $cmd = sprintf('diff -U 100 %s %s',
-            escapeshellarg($fnameA),
-            escapeshellarg($fnameB));
-    passthru($cmd);
+    // @hack
+    $old = tweakPrimaryKey($old);
+    $def = tweakPrimaryKey($def);
 
-    unlink($fnameA);
-    unlink($fnameB);
+    $sections = array_unique(array_merge(array_keys($old), array_keys($def)));
+    $final = array();
+    foreach ($sections as $section) {
+        if ($section == 'fields') {
+            // this shouldn't be needed maybe... wait what?
+        }
+        $diff = $schema->diffArrays($old, $def, $section);
+        $chunks = array('del', 'mod', 'add');
+        foreach ($chunks as $chunk) {
+            if ($diff[$chunk]) {
+                foreach ($diff[$chunk] as $key) {
+                    if ($chunk == 'del') {
+                        $final[$section]["DEL $key"] = $old[$section][$key];
+                    } else if ($chunk == 'add') {
+                        $final[$section]["ADD $key"] = $def[$section][$key];
+                    } else if ($chunk == 'mod') {
+                        $final[$section]["OLD $key"] = $old[$section][$key];
+                        $final[$section]["NEW $key"] = $def[$section][$key];
+                    }
+                }
+            }
+        }
+    }
+
+    prettyDumpArray($final, $tableName);
+    print "\n";
+}
+
+function tweakPrimaryKey($def)
+{
+    if (isset($def['primary key'])) {
+        $def['primary keys'] = array('primary key' => $def['primary key']);
+        unset($def['primary key']);
+    }
+    if (isset($def['description'])) {
+        $def['descriptions'] = array('description' => $def['description']);
+        unset($def['description']);
+    }
+    return $def;
+}
+
+function dumpChecksum($tableName)
+{
+    $schema = Schema::get();
+    $def = getCoreSchema($tableName);
+
+    $updater = new SchemaUpdater($schema);
+    $checksum = $updater->checksum($def);
+    $old = @$updater->checksums[$tableName];
+
+    if ($old == $checksum) {
+        echo "OK  $checksum $tableName\n";
+    } else if (!$old) {
+        echo "NEW $checksum $tableName\n";
+    } else {
+        echo "MOD $checksum $tableName (was $old)\n";
+    }
+}
+
+if (have_option('all')) {
+    $args = getCoreTables();
 }
 
 if (count($args)) {
     foreach ($args as $tableName) {
         if (have_option('diff')) {
-            ob_start();
-            dumpTable($tableName, false);
-            $defined = ob_get_clean();
-
-            ob_start();
-            dumpTable($tableName, true);
-            $detected = ob_get_clean();
-
-            showDiff($defined, $detected);
+            dumpDiff($tableName, !have_option('raw'));
+        } else if (have_option('create')) {
+            dumpBuildTable($tableName);
+        } else if (have_option('update')) {
+            dumpEnsureTable($tableName);
+        } else if (have_option('checksum')) {
+            dumpChecksum($tableName);
         } else {
             dumpTable($tableName, true);
         }
     }
 } else {
     show_help($helptext);
-}
\ No newline at end of file
+}