#!/usr/bin/env php . */ define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); $helptext = << "; } if (is_array($arr)) { print "array({$inlf}"; $n = 0; foreach ($arr as $key => $row) { $n++; prettyDumpArray($row, $key, $subIndent); if ($n < count($arr)) { print "$insep$inlf"; } } // hack! print "{$inendspace})"; } else { print var_export($arr, true); } } function getCoreSchema($tableName) { $schema = array(); include INSTALLDIR . '/db/core.php'; return $schema[$tableName]; } function getCoreTables() { $schema = array(); include INSTALLDIR . '/db/core.php'; return array_keys($schema); } function dumpTable($tableName, $live) { if ($live) { $schema = Schema::get(); $def = $schema->getTableDef($tableName); } else { // hack $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 dumpEnsureTable($tableName) { $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"; } } 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); } // @hack $old = tweakPrimaryKey($old); $def = tweakPrimaryKey($def); $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, $compare); $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']); } 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')) { 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); }