dsn = $dsn; // wez learn to design api's ;) $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $driver = $db->getAttribute(PDO::ATTR_DRIVER_NAME); $adapter_class = "MTrackDBSchema_$driver"; $adapter = new $adapter_class($dsn); $adapter->setDB($db); $vers = $adapter->determineVersion(); echo "Version: "; var_dump($vers); $db->beginTransaction(); MTrackDB::$db = $db; $schemata = array(); $latest = null; foreach (glob(dirname(__FILE__) . '/../schema/*.xml') as $filename) { $latest = new MTrackDBSchema($filename); $schemata[$latest->version] = $latest; } if ($vers === null) { if (true) { // Fresh install echo "Applying schema version $latest->version\n"; foreach ($latest->tables as $t) { $adapter->createTable($t); } if (isset($latest->post[$driver])) { $db->exec($latest->post[$driver]); } $vers = $latest->version; } else { // while developing, make it go through the whole migration $initial = $schemata[0]; echo "Applying schema version $initial->version\n"; foreach ($initial->tables as $t) { $adapter->createTable($t); } $vers = 0; } } while ($vers < $latest->version) { $current = $schemata[$vers]; $next = $schemata[$vers+1]; echo "Applying migration from schema version $current->version to $next->version\n"; $migration = dirname(__FILE__) . "/../schema/$next->version-pre.php"; if (file_exists($migration)) { echo "Running migration script schema/$next->version-pre.php\n"; include $migration; } /* create any new tables */ foreach ($next->tables as $t) { if (isset($current->tables[$t->name])) continue; /* doesn't yet exist, so create it! */ $adapter->createTable($t); } /* modify existing tables */ foreach ($current->tables as $t) { if (!isset($next->tables[$t->name])) continue; $nt = $next->tables[$t->name]; /* compare; have they changed? */ if (!$t->sameAs($nt)) { $adapter->alterTable($t, $nt); } } /* delete dead tables */ foreach ($current->tables as $t) { if (isset($next->tables[$t->name])) continue; $adapter->dropTable($t); } $vers++; if (isset($next->post[$driver])) { $db->exec($next->post[$driver]); } $migration = dirname(__FILE__) . "/../schema/$vers.php"; if (file_exists($migration)) { echo "Running migration script schema/$vers.php\n"; include $migration; } } $db->exec('delete from mtrack_schema'); $q = $db->prepare('insert into mtrack_schema (version) values (?)'); $q->execute(array($latest->version)); $db->commit();