1 <?php # vim:ts=2:sw=2:et:
2 /* For licensing and copyright terms, see the file named LICENSE */
4 if (function_exists('date_default_timezone_set')) {
5 date_default_timezone_set('UTC');
7 ini_set('memory_limit', -1);
9 include_once dirname(__FILE__) . '/../inc/common.php';
11 $dsn = 'sqlite::memory:';
12 #$dsn = 'pgsql:dbname=wez';
14 $dsn = MTrackConfig::get('core', 'dsn');
16 $dsn = 'sqlite:' . MTrackConfig::get('core', 'dblocation');
19 if (preg_match("/^sqlite:(.*)$/", $dsn, $M)) {
21 if (file_exists($dbfile)) {
22 $bak = $dbfile . '.' . uniqid();
23 echo "Backing up $dbfile as $bak\n";
29 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
31 $driver = $db->getAttribute(PDO::ATTR_DRIVER_NAME);
32 $adapter_class = "MTrackDBSchema_$driver";
33 $adapter = new $adapter_class;
36 $vers = $adapter->determineVersion();
40 $db->beginTransaction();
45 foreach (glob(dirname(__FILE__) . '/../schema/*.xml') as $filename) {
46 $latest = new MTrackDBSchema($filename);
47 $schemata[$latest->version] = $latest;
54 echo "Applying schema version $latest->version\n";
56 foreach ($latest->tables as $t) {
57 $adapter->createTable($t);
59 if (isset($latest->post[$driver])) {
60 $db->exec($latest->post[$driver]);
63 $vers = $latest->version;
66 // while developing, make it go through the whole migration
67 $initial = $schemata[0];
68 echo "Applying schema version $initial->version\n";
70 foreach ($initial->tables as $t) {
71 $adapter->createTable($t);
77 while ($vers < $latest->version) {
78 $current = $schemata[$vers];
79 $next = $schemata[$vers+1];
81 echo "Applying migration from schema version $current->version to $next->version\n";
83 $migration = dirname(__FILE__) . "/../schema/$next->version-pre.php";
84 if (file_exists($migration)) {
85 echo "Running migration script schema/$next->version-pre.php\n";
89 /* create any new tables */
90 foreach ($next->tables as $t) {
91 if (isset($current->tables[$t->name])) continue;
92 /* doesn't yet exist, so create it! */
93 $adapter->createTable($t);
96 /* modify existing tables */
97 foreach ($current->tables as $t) {
98 if (!isset($next->tables[$t->name])) continue;
100 $nt = $next->tables[$t->name];
101 /* compare; have they changed? */
102 if (!$t->sameAs($nt)) {
103 $adapter->alterTable($t, $nt);
107 /* delete dead tables */
108 foreach ($current->tables as $t) {
109 if (isset($next->tables[$t->name])) continue;
110 $adapter->dropTable($t);
115 if (isset($next->post[$driver])) {
116 $db->exec($next->post[$driver]);
119 $migration = dirname(__FILE__) . "/../schema/$vers.php";
120 if (file_exists($migration)) {
121 echo "Running migration script schema/$vers.php\n";
126 $db->exec('delete from mtrack_schema');
127 $q = $db->prepare('insert into mtrack_schema (version) values (?)');
128 $q->execute(array($latest->version));