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');
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";
28 // this is pretty messed up, it should be able to create databases,
29 // but it will just crash out with unknown database..
31 if (preg_match("/^mysql:(.*)$/", $dsn, $M)) {
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']);
42 $db->dsn = $dsn; // wez learn to design api's ;)
43 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
45 $driver = $db->getAttribute(PDO::ATTR_DRIVER_NAME);
46 $adapter_class = "MTrackDBSchema_$driver";
47 $adapter = new $adapter_class($dsn);
50 $vers = $adapter->determineVersion();
54 $db->beginTransaction();
59 foreach (glob(dirname(__FILE__) . '/../schema/*.xml') as $filename) {
60 $latest = new MTrackDBSchema($filename);
61 $schemata[$latest->version] = $latest;
68 echo "Applying schema version $latest->version\n";
70 foreach ($latest->tables as $t) {
71 $adapter->createTable($t);
73 if (isset($latest->post[$driver])) {
74 $db->exec($latest->post[$driver]);
77 $vers = $latest->version;
80 // while developing, make it go through the whole migration
81 $initial = $schemata[0];
82 echo "Applying schema version $initial->version\n";
84 foreach ($initial->tables as $t) {
85 $adapter->createTable($t);
91 while ($vers < $latest->version) {
92 $current = $schemata[$vers];
93 $next = $schemata[$vers+1];
95 echo "Applying migration from schema version $current->version to $next->version\n";
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";
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);
110 /* modify existing tables */
111 foreach ($current->tables as $t) {
112 if (!isset($next->tables[$t->name])) continue;
114 $nt = $next->tables[$t->name];
115 /* compare; have they changed? */
116 if (!$t->sameAs($nt)) {
117 $adapter->alterTable($t, $nt);
121 /* delete dead tables */
122 foreach ($current->tables as $t) {
123 if (isset($next->tables[$t->name])) continue;
124 $adapter->dropTable($t);
129 if (isset($next->post[$driver])) {
130 $db->exec($next->post[$driver]);
133 $migration = dirname(__FILE__) . "/../schema/$vers.php";
134 if (file_exists($migration)) {
135 echo "Running migration script schema/$vers.php\n";
140 $db->exec('delete from mtrack_schema');
141 $q = $db->prepare('insert into mtrack_schema (version) values (?)');
142 $q->execute(array($latest->version));