final move of files
[web.mtrack] / MTrackWeb / Setup / schema-tool.php
1 <?php # vim:ts=2:sw=2:et:
2 /* For licensing and copyright terms, see the file named LICENSE */
3 die("make a class of me");
4 if (function_exists('date_default_timezone_set')) {
5   date_default_timezone_set('UTC');
6 }
7 ini_set('memory_limit', -1);
8
9 include_once dirname(__FILE__) . '/../inc/common.php';
10
11 $dsn = 'sqlite::memory:';
12 #$dsn = 'pgsql:dbname=wez';
13
14 $dsn = MTrackConfig::get('core', 'dsn');
15 if (!$dsn) {
16   $dsn = 'sqlite:' . MTrackConfig::get('core', 'dblocation');
17 }
18
19 if (preg_match("/^sqlite:(.*)$/", $dsn, $M)) {
20   $dbfile = $M[1];
21   if (file_exists($dbfile)) {
22     $bak = $dbfile . '.' . uniqid();
23     echo "Backing up $dbfile as $bak\n";
24     copy($dbfile, $bak);
25   }
26 }
27
28 // this is pretty messed up, it should be able to create databases,
29 // but it will just crash out with unknown database..
30
31 if (preg_match("/^mysql:(.*)$/", $dsn, $M)) {
32     //var_dump($dsn);
33     $furl = str_replace(';', '&', preg_replace('/^mysql:/','', $dsn));
34     //echo "FURL: " ;var_dump($furl);
35     $bits = parse_str($furl, $parts);
36     $db = new PDO($dsn, $parts['username'], @$parts['password']);
37 } else {
38     $db = new PDO($dsn);
39    }
40
41  
42 $db->dsn = $dsn; // wez learn to design api's ;)
43 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
44
45 $driver = $db->getAttribute(PDO::ATTR_DRIVER_NAME);
46 $adapter_class = "MTrackDBSchema_$driver";
47 $adapter = new $adapter_class($dsn);
48
49 $adapter->setDB($db);
50 $vers = $adapter->determineVersion();
51 echo "Version: ";
52 var_dump($vers);
53
54 $db->beginTransaction();
55 MTrackDB::$db = $db;
56
57 $schemata = array();
58 $latest = null;
59 foreach (glob(dirname(__FILE__) . '/../schema/*.xml') as $filename) {
60   $latest = new MTrackDBSchema($filename);
61   $schemata[$latest->version] = $latest;
62 }
63
64 if ($vers === null) {
65
66   if (true) {
67     // Fresh install
68     echo "Applying schema version $latest->version\n";
69
70     foreach ($latest->tables as $t) {
71       $adapter->createTable($t);
72     }
73     if (isset($latest->post[$driver])) {
74       $db->exec($latest->post[$driver]);
75     }
76
77     $vers = $latest->version;
78
79   } else {
80     // while developing, make it go through the whole migration
81     $initial = $schemata[0];
82     echo "Applying schema version $initial->version\n";
83
84     foreach ($initial->tables as $t) {
85       $adapter->createTable($t);
86     }
87     $vers = 0;
88   }
89 }
90
91 while ($vers < $latest->version) {
92   $current = $schemata[$vers];
93   $next = $schemata[$vers+1];
94
95   echo "Applying migration from schema version $current->version to $next->version\n";
96
97   $migration = dirname(__FILE__) . "/../schema/$next->version-pre.php";
98   if (file_exists($migration)) {
99     echo "Running migration script schema/$next->version-pre.php\n";
100     include $migration;
101   }
102
103   /* create any new tables */
104   foreach ($next->tables as $t) {
105     if (isset($current->tables[$t->name])) continue;
106     /* doesn't yet exist, so create it! */
107     $adapter->createTable($t);
108   }
109
110   /* modify existing tables */
111   foreach ($current->tables as $t) {
112     if (!isset($next->tables[$t->name])) continue;
113
114     $nt = $next->tables[$t->name];
115     /* compare; have they changed? */
116     if (!$t->sameAs($nt)) {
117       $adapter->alterTable($t, $nt);
118     }
119   }
120
121   /* delete dead tables */
122   foreach ($current->tables as $t) {
123     if (isset($next->tables[$t->name])) continue;
124     $adapter->dropTable($t);
125   }
126
127   $vers++;
128
129   if (isset($next->post[$driver])) {
130     $db->exec($next->post[$driver]);
131   }
132
133   $migration = dirname(__FILE__) . "/../schema/$vers.php";
134   if (file_exists($migration)) {
135     echo "Running migration script schema/$vers.php\n";
136     include $migration;
137   }
138 }
139
140 $db->exec('delete from mtrack_schema');
141 $q = $db->prepare('insert into mtrack_schema (version) values (?)');
142 $q->execute(array($latest->version));
143 $db->commit();
144
145