1*a1a3b679SAndreas Boehler#!/usr/bin/env php 2*a1a3b679SAndreas Boehler<?php 3*a1a3b679SAndreas Boehler 4*a1a3b679SAndreas Boehlerecho "SabreDAV migrate script for version 2.0\n"; 5*a1a3b679SAndreas Boehler 6*a1a3b679SAndreas Boehlerif ($argc<2) { 7*a1a3b679SAndreas Boehler 8*a1a3b679SAndreas Boehler echo <<<HELLO 9*a1a3b679SAndreas Boehler 10*a1a3b679SAndreas BoehlerThis script help you migrate from a pre-2.0 database to 2.0 and later 11*a1a3b679SAndreas Boehler 12*a1a3b679SAndreas BoehlerThe 'calendars', 'addressbooks' and 'cards' tables will be upgraded, and new 13*a1a3b679SAndreas Boehlertables (calendarchanges, addressbookchanges, propertystorage) will be added. 14*a1a3b679SAndreas Boehler 15*a1a3b679SAndreas BoehlerIf you don't use the default PDO CalDAV or CardDAV backend, it's pointless to 16*a1a3b679SAndreas Boehlerrun this script. 17*a1a3b679SAndreas Boehler 18*a1a3b679SAndreas BoehlerKeep in mind that ALTER TABLE commands will be executed. If you have a large 19*a1a3b679SAndreas Boehlerdataset this may mean that this process takes a while. 20*a1a3b679SAndreas Boehler 21*a1a3b679SAndreas BoehlerLastly: Make a back-up first. This script has been tested, but the amount of 22*a1a3b679SAndreas Boehlerpotential variants are extremely high, so it's impossible to deal with every 23*a1a3b679SAndreas Boehlerpossible situation. 24*a1a3b679SAndreas Boehler 25*a1a3b679SAndreas BoehlerIn the worst case, you will lose all your data. This is not an overstatement. 26*a1a3b679SAndreas Boehler 27*a1a3b679SAndreas BoehlerUsage: 28*a1a3b679SAndreas Boehler 29*a1a3b679SAndreas Boehlerphp {$argv[0]} [pdo-dsn] [username] [password] 30*a1a3b679SAndreas Boehler 31*a1a3b679SAndreas BoehlerFor example: 32*a1a3b679SAndreas Boehler 33*a1a3b679SAndreas Boehlerphp {$argv[0]} "mysql:host=localhost;dbname=sabredav" root password 34*a1a3b679SAndreas Boehlerphp {$argv[0]} sqlite:data/sabredav.db 35*a1a3b679SAndreas Boehler 36*a1a3b679SAndreas BoehlerHELLO; 37*a1a3b679SAndreas Boehler 38*a1a3b679SAndreas Boehler exit(); 39*a1a3b679SAndreas Boehler 40*a1a3b679SAndreas Boehler} 41*a1a3b679SAndreas Boehler 42*a1a3b679SAndreas Boehler// There's a bunch of places where the autoloader could be, so we'll try all of 43*a1a3b679SAndreas Boehler// them. 44*a1a3b679SAndreas Boehler$paths = [ 45*a1a3b679SAndreas Boehler __DIR__ . '/../vendor/autoload.php', 46*a1a3b679SAndreas Boehler __DIR__ . '/../../../autoload.php', 47*a1a3b679SAndreas Boehler]; 48*a1a3b679SAndreas Boehler 49*a1a3b679SAndreas Boehlerforeach($paths as $path) { 50*a1a3b679SAndreas Boehler if (file_exists($path)) { 51*a1a3b679SAndreas Boehler include $path; 52*a1a3b679SAndreas Boehler break; 53*a1a3b679SAndreas Boehler } 54*a1a3b679SAndreas Boehler} 55*a1a3b679SAndreas Boehler 56*a1a3b679SAndreas Boehler$dsn = $argv[1]; 57*a1a3b679SAndreas Boehler$user = isset($argv[2])?$argv[2]:null; 58*a1a3b679SAndreas Boehler$pass = isset($argv[3])?$argv[3]:null; 59*a1a3b679SAndreas Boehler 60*a1a3b679SAndreas Boehlerecho "Connecting to database: " . $dsn . "\n"; 61*a1a3b679SAndreas Boehler 62*a1a3b679SAndreas Boehler$pdo = new PDO($dsn, $user, $pass); 63*a1a3b679SAndreas Boehler$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 64*a1a3b679SAndreas Boehler$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 65*a1a3b679SAndreas Boehler 66*a1a3b679SAndreas Boehler$driver = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME); 67*a1a3b679SAndreas Boehler 68*a1a3b679SAndreas Boehlerswitch($driver) { 69*a1a3b679SAndreas Boehler 70*a1a3b679SAndreas Boehler case 'mysql' : 71*a1a3b679SAndreas Boehler echo "Detected MySQL.\n"; 72*a1a3b679SAndreas Boehler break; 73*a1a3b679SAndreas Boehler case 'sqlite' : 74*a1a3b679SAndreas Boehler echo "Detected SQLite.\n"; 75*a1a3b679SAndreas Boehler break; 76*a1a3b679SAndreas Boehler default : 77*a1a3b679SAndreas Boehler echo "Error: unsupported driver: " . $driver . "\n"; 78*a1a3b679SAndreas Boehler die(-1); 79*a1a3b679SAndreas Boehler} 80*a1a3b679SAndreas Boehler 81*a1a3b679SAndreas Boehlerforeach(['calendar', 'addressbook'] as $itemType) { 82*a1a3b679SAndreas Boehler 83*a1a3b679SAndreas Boehler $tableName = $itemType . 's'; 84*a1a3b679SAndreas Boehler $tableNameOld = $tableName . '_old'; 85*a1a3b679SAndreas Boehler $changesTable = $itemType . 'changes'; 86*a1a3b679SAndreas Boehler 87*a1a3b679SAndreas Boehler echo "Upgrading '$tableName'\n"; 88*a1a3b679SAndreas Boehler 89*a1a3b679SAndreas Boehler // The only cross-db way to do this, is to just fetch a single record. 90*a1a3b679SAndreas Boehler $row = $pdo->query("SELECT * FROM $tableName LIMIT 1")->fetch(); 91*a1a3b679SAndreas Boehler 92*a1a3b679SAndreas Boehler if (!$row) { 93*a1a3b679SAndreas Boehler 94*a1a3b679SAndreas Boehler echo "No records were found in the '$tableName' table.\n"; 95*a1a3b679SAndreas Boehler echo "\n"; 96*a1a3b679SAndreas Boehler echo "We're going to rename the old table to $tableNameOld (just in case).\n"; 97*a1a3b679SAndreas Boehler echo "and re-create the new table.\n"; 98*a1a3b679SAndreas Boehler 99*a1a3b679SAndreas Boehler switch($driver) { 100*a1a3b679SAndreas Boehler 101*a1a3b679SAndreas Boehler case 'mysql' : 102*a1a3b679SAndreas Boehler $pdo->exec("RENAME TABLE $tableName TO $tableNameOld"); 103*a1a3b679SAndreas Boehler switch($itemType) { 104*a1a3b679SAndreas Boehler case 'calendar' : 105*a1a3b679SAndreas Boehler $pdo->exec(" 106*a1a3b679SAndreas Boehler CREATE TABLE calendars ( 107*a1a3b679SAndreas Boehler id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, 108*a1a3b679SAndreas Boehler principaluri VARCHAR(100), 109*a1a3b679SAndreas Boehler displayname VARCHAR(100), 110*a1a3b679SAndreas Boehler uri VARCHAR(200), 111*a1a3b679SAndreas Boehler synctoken INT(11) UNSIGNED NOT NULL DEFAULT '1', 112*a1a3b679SAndreas Boehler description TEXT, 113*a1a3b679SAndreas Boehler calendarorder INT(11) UNSIGNED NOT NULL DEFAULT '0', 114*a1a3b679SAndreas Boehler calendarcolor VARCHAR(10), 115*a1a3b679SAndreas Boehler timezone TEXT, 116*a1a3b679SAndreas Boehler components VARCHAR(20), 117*a1a3b679SAndreas Boehler transparent TINYINT(1) NOT NULL DEFAULT '0', 118*a1a3b679SAndreas Boehler UNIQUE(principaluri, uri) 119*a1a3b679SAndreas Boehler ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 120*a1a3b679SAndreas Boehler "); 121*a1a3b679SAndreas Boehler break; 122*a1a3b679SAndreas Boehler case 'addressbook' : 123*a1a3b679SAndreas Boehler $pdo->exec(" 124*a1a3b679SAndreas Boehler CREATE TABLE addressbooks ( 125*a1a3b679SAndreas Boehler id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, 126*a1a3b679SAndreas Boehler principaluri VARCHAR(255), 127*a1a3b679SAndreas Boehler displayname VARCHAR(255), 128*a1a3b679SAndreas Boehler uri VARCHAR(200), 129*a1a3b679SAndreas Boehler description TEXT, 130*a1a3b679SAndreas Boehler synctoken INT(11) UNSIGNED NOT NULL DEFAULT '1', 131*a1a3b679SAndreas Boehler UNIQUE(principaluri, uri) 132*a1a3b679SAndreas Boehler ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 133*a1a3b679SAndreas Boehler "); 134*a1a3b679SAndreas Boehler break; 135*a1a3b679SAndreas Boehler } 136*a1a3b679SAndreas Boehler 137*a1a3b679SAndreas Boehler case 'sqlite' : 138*a1a3b679SAndreas Boehler 139*a1a3b679SAndreas Boehler $pdo->exec("ALTER TABLE $tableName RENAME TO $tableNameOld"); 140*a1a3b679SAndreas Boehler 141*a1a3b679SAndreas Boehler switch($itemType) { 142*a1a3b679SAndreas Boehler case 'calendar' : 143*a1a3b679SAndreas Boehler $pdo->exec(" 144*a1a3b679SAndreas Boehler CREATE TABLE calendars ( 145*a1a3b679SAndreas Boehler id integer primary key asc, 146*a1a3b679SAndreas Boehler principaluri text, 147*a1a3b679SAndreas Boehler displayname text, 148*a1a3b679SAndreas Boehler uri text, 149*a1a3b679SAndreas Boehler synctoken integer, 150*a1a3b679SAndreas Boehler description text, 151*a1a3b679SAndreas Boehler calendarorder integer, 152*a1a3b679SAndreas Boehler calendarcolor text, 153*a1a3b679SAndreas Boehler timezone text, 154*a1a3b679SAndreas Boehler components text, 155*a1a3b679SAndreas Boehler transparent bool 156*a1a3b679SAndreas Boehler ); 157*a1a3b679SAndreas Boehler "); 158*a1a3b679SAndreas Boehler break; 159*a1a3b679SAndreas Boehler case 'addressbook' : 160*a1a3b679SAndreas Boehler $pdo->exec(" 161*a1a3b679SAndreas Boehler CREATE TABLE addressbooks ( 162*a1a3b679SAndreas Boehler id integer primary key asc, 163*a1a3b679SAndreas Boehler principaluri text, 164*a1a3b679SAndreas Boehler displayname text, 165*a1a3b679SAndreas Boehler uri text, 166*a1a3b679SAndreas Boehler description text, 167*a1a3b679SAndreas Boehler synctoken integer 168*a1a3b679SAndreas Boehler ); 169*a1a3b679SAndreas Boehler "); 170*a1a3b679SAndreas Boehler 171*a1a3b679SAndreas Boehler break; 172*a1a3b679SAndreas Boehler } 173*a1a3b679SAndreas Boehler 174*a1a3b679SAndreas Boehler } 175*a1a3b679SAndreas Boehler echo "Creation of 2.0 $tableName table is complete\n"; 176*a1a3b679SAndreas Boehler 177*a1a3b679SAndreas Boehler } else { 178*a1a3b679SAndreas Boehler 179*a1a3b679SAndreas Boehler // Checking if there's a synctoken field already. 180*a1a3b679SAndreas Boehler if (array_key_exists('synctoken', $row)) { 181*a1a3b679SAndreas Boehler echo "The 'synctoken' field already exists in the $tableName table.\n"; 182*a1a3b679SAndreas Boehler echo "It's likely you already upgraded, so we're simply leaving\n"; 183*a1a3b679SAndreas Boehler echo "the $tableName table alone\n"; 184*a1a3b679SAndreas Boehler } else { 185*a1a3b679SAndreas Boehler 186*a1a3b679SAndreas Boehler echo "1.8 table schema detected\n"; 187*a1a3b679SAndreas Boehler switch($driver) { 188*a1a3b679SAndreas Boehler 189*a1a3b679SAndreas Boehler case 'mysql' : 190*a1a3b679SAndreas Boehler $pdo->exec("ALTER TABLE $tableName ADD synctoken INT(11) UNSIGNED NOT NULL DEFAULT '1'"); 191*a1a3b679SAndreas Boehler $pdo->exec("ALTER TABLE $tableName DROP ctag"); 192*a1a3b679SAndreas Boehler $pdo->exec("UPDATE $tableName SET synctoken = '1'"); 193*a1a3b679SAndreas Boehler break; 194*a1a3b679SAndreas Boehler case 'sqlite' : 195*a1a3b679SAndreas Boehler $pdo->exec("ALTER TABLE $tableName ADD synctoken integer"); 196*a1a3b679SAndreas Boehler $pdo->exec("UPDATE $tableName SET synctoken = '1'"); 197*a1a3b679SAndreas Boehler echo "Note: there's no easy way to remove fields in sqlite.\n"; 198*a1a3b679SAndreas Boehler echo "The ctag field is no longer used, but it's kept in place\n"; 199*a1a3b679SAndreas Boehler break; 200*a1a3b679SAndreas Boehler 201*a1a3b679SAndreas Boehler } 202*a1a3b679SAndreas Boehler 203*a1a3b679SAndreas Boehler echo "Upgraded '$tableName' to 2.0 schema.\n"; 204*a1a3b679SAndreas Boehler 205*a1a3b679SAndreas Boehler } 206*a1a3b679SAndreas Boehler 207*a1a3b679SAndreas Boehler } 208*a1a3b679SAndreas Boehler 209*a1a3b679SAndreas Boehler try { 210*a1a3b679SAndreas Boehler $pdo->query("SELECT * FROM $changesTable LIMIT 1"); 211*a1a3b679SAndreas Boehler 212*a1a3b679SAndreas Boehler echo "'$changesTable' already exists. Assuming that this part of the\n"; 213*a1a3b679SAndreas Boehler echo "upgrade was already completed.\n"; 214*a1a3b679SAndreas Boehler 215*a1a3b679SAndreas Boehler } catch (Exception $e) { 216*a1a3b679SAndreas Boehler echo "Creating '$changesTable' table.\n"; 217*a1a3b679SAndreas Boehler 218*a1a3b679SAndreas Boehler switch($driver) { 219*a1a3b679SAndreas Boehler 220*a1a3b679SAndreas Boehler case 'mysql' : 221*a1a3b679SAndreas Boehler $pdo->exec(" 222*a1a3b679SAndreas Boehler CREATE TABLE $changesTable ( 223*a1a3b679SAndreas Boehler id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, 224*a1a3b679SAndreas Boehler uri VARCHAR(200) NOT NULL, 225*a1a3b679SAndreas Boehler synctoken INT(11) UNSIGNED NOT NULL, 226*a1a3b679SAndreas Boehler {$itemType}id INT(11) UNSIGNED NOT NULL, 227*a1a3b679SAndreas Boehler operation TINYINT(1) NOT NULL, 228*a1a3b679SAndreas Boehler INDEX {$itemType}id_synctoken ({$itemType}id, synctoken) 229*a1a3b679SAndreas Boehler ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 230*a1a3b679SAndreas Boehler 231*a1a3b679SAndreas Boehler "); 232*a1a3b679SAndreas Boehler break; 233*a1a3b679SAndreas Boehler case 'sqlite' : 234*a1a3b679SAndreas Boehler $pdo->exec(" 235*a1a3b679SAndreas Boehler 236*a1a3b679SAndreas Boehler CREATE TABLE $changesTable ( 237*a1a3b679SAndreas Boehler id integer primary key asc, 238*a1a3b679SAndreas Boehler uri text, 239*a1a3b679SAndreas Boehler synctoken integer, 240*a1a3b679SAndreas Boehler {$itemType}id integer, 241*a1a3b679SAndreas Boehler operation bool 242*a1a3b679SAndreas Boehler ); 243*a1a3b679SAndreas Boehler 244*a1a3b679SAndreas Boehler "); 245*a1a3b679SAndreas Boehler $pdo->exec("CREATE INDEX {$itemType}id_synctoken ON $changesTable ({$itemType}id, synctoken);"); 246*a1a3b679SAndreas Boehler break; 247*a1a3b679SAndreas Boehler 248*a1a3b679SAndreas Boehler } 249*a1a3b679SAndreas Boehler 250*a1a3b679SAndreas Boehler } 251*a1a3b679SAndreas Boehler 252*a1a3b679SAndreas Boehler} 253*a1a3b679SAndreas Boehler 254*a1a3b679SAndreas Boehlertry { 255*a1a3b679SAndreas Boehler $pdo->query("SELECT * FROM calendarsubscriptions LIMIT 1"); 256*a1a3b679SAndreas Boehler 257*a1a3b679SAndreas Boehler echo "'calendarsubscriptions' already exists. Assuming that this part of the\n"; 258*a1a3b679SAndreas Boehler echo "upgrade was already completed.\n"; 259*a1a3b679SAndreas Boehler 260*a1a3b679SAndreas Boehler} catch (Exception $e) { 261*a1a3b679SAndreas Boehler echo "Creating calendarsubscriptions table.\n"; 262*a1a3b679SAndreas Boehler 263*a1a3b679SAndreas Boehler switch($driver) { 264*a1a3b679SAndreas Boehler 265*a1a3b679SAndreas Boehler case 'mysql' : 266*a1a3b679SAndreas Boehler $pdo->exec(" 267*a1a3b679SAndreas BoehlerCREATE TABLE calendarsubscriptions ( 268*a1a3b679SAndreas Boehler id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, 269*a1a3b679SAndreas Boehler uri VARCHAR(200) NOT NULL, 270*a1a3b679SAndreas Boehler principaluri VARCHAR(100) NOT NULL, 271*a1a3b679SAndreas Boehler source TEXT, 272*a1a3b679SAndreas Boehler displayname VARCHAR(100), 273*a1a3b679SAndreas Boehler refreshrate VARCHAR(10), 274*a1a3b679SAndreas Boehler calendarorder INT(11) UNSIGNED NOT NULL DEFAULT '0', 275*a1a3b679SAndreas Boehler calendarcolor VARCHAR(10), 276*a1a3b679SAndreas Boehler striptodos TINYINT(1) NULL, 277*a1a3b679SAndreas Boehler stripalarms TINYINT(1) NULL, 278*a1a3b679SAndreas Boehler stripattachments TINYINT(1) NULL, 279*a1a3b679SAndreas Boehler lastmodified INT(11) UNSIGNED, 280*a1a3b679SAndreas Boehler UNIQUE(principaluri, uri) 281*a1a3b679SAndreas Boehler); 282*a1a3b679SAndreas Boehler "); 283*a1a3b679SAndreas Boehler break; 284*a1a3b679SAndreas Boehler case 'sqlite' : 285*a1a3b679SAndreas Boehler $pdo->exec(" 286*a1a3b679SAndreas Boehler 287*a1a3b679SAndreas BoehlerCREATE TABLE calendarsubscriptions ( 288*a1a3b679SAndreas Boehler id integer primary key asc, 289*a1a3b679SAndreas Boehler uri text, 290*a1a3b679SAndreas Boehler principaluri text, 291*a1a3b679SAndreas Boehler source text, 292*a1a3b679SAndreas Boehler displayname text, 293*a1a3b679SAndreas Boehler refreshrate text, 294*a1a3b679SAndreas Boehler calendarorder integer, 295*a1a3b679SAndreas Boehler calendarcolor text, 296*a1a3b679SAndreas Boehler striptodos bool, 297*a1a3b679SAndreas Boehler stripalarms bool, 298*a1a3b679SAndreas Boehler stripattachments bool, 299*a1a3b679SAndreas Boehler lastmodified int 300*a1a3b679SAndreas Boehler); 301*a1a3b679SAndreas Boehler "); 302*a1a3b679SAndreas Boehler 303*a1a3b679SAndreas Boehler $pdo->exec("CREATE INDEX principaluri_uri ON calendarsubscriptions (principaluri, uri);"); 304*a1a3b679SAndreas Boehler break; 305*a1a3b679SAndreas Boehler 306*a1a3b679SAndreas Boehler } 307*a1a3b679SAndreas Boehler 308*a1a3b679SAndreas Boehler} 309*a1a3b679SAndreas Boehler 310*a1a3b679SAndreas Boehlertry { 311*a1a3b679SAndreas Boehler $pdo->query("SELECT * FROM propertystorage LIMIT 1"); 312*a1a3b679SAndreas Boehler 313*a1a3b679SAndreas Boehler echo "'propertystorage' already exists. Assuming that this part of the\n"; 314*a1a3b679SAndreas Boehler echo "upgrade was already completed.\n"; 315*a1a3b679SAndreas Boehler 316*a1a3b679SAndreas Boehler} catch (Exception $e) { 317*a1a3b679SAndreas Boehler echo "Creating propertystorage table.\n"; 318*a1a3b679SAndreas Boehler 319*a1a3b679SAndreas Boehler switch($driver) { 320*a1a3b679SAndreas Boehler 321*a1a3b679SAndreas Boehler case 'mysql' : 322*a1a3b679SAndreas Boehler $pdo->exec(" 323*a1a3b679SAndreas BoehlerCREATE TABLE propertystorage ( 324*a1a3b679SAndreas Boehler id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, 325*a1a3b679SAndreas Boehler path VARBINARY(1024) NOT NULL, 326*a1a3b679SAndreas Boehler name VARBINARY(100) NOT NULL, 327*a1a3b679SAndreas Boehler value MEDIUMBLOB 328*a1a3b679SAndreas Boehler); 329*a1a3b679SAndreas Boehler "); 330*a1a3b679SAndreas Boehler $pdo->exec(" 331*a1a3b679SAndreas BoehlerCREATE UNIQUE INDEX path_property ON propertystorage (path(600), name(100)); 332*a1a3b679SAndreas Boehler "); 333*a1a3b679SAndreas Boehler break; 334*a1a3b679SAndreas Boehler case 'sqlite' : 335*a1a3b679SAndreas Boehler $pdo->exec(" 336*a1a3b679SAndreas BoehlerCREATE TABLE propertystorage ( 337*a1a3b679SAndreas Boehler id integer primary key asc, 338*a1a3b679SAndreas Boehler path TEXT, 339*a1a3b679SAndreas Boehler name TEXT, 340*a1a3b679SAndreas Boehler value TEXT 341*a1a3b679SAndreas Boehler); 342*a1a3b679SAndreas Boehler "); 343*a1a3b679SAndreas Boehler $pdo->exec(" 344*a1a3b679SAndreas BoehlerCREATE UNIQUE INDEX path_property ON propertystorage (path, name); 345*a1a3b679SAndreas Boehler "); 346*a1a3b679SAndreas Boehler 347*a1a3b679SAndreas Boehler break; 348*a1a3b679SAndreas Boehler 349*a1a3b679SAndreas Boehler } 350*a1a3b679SAndreas Boehler 351*a1a3b679SAndreas Boehler} 352*a1a3b679SAndreas Boehler 353*a1a3b679SAndreas Boehlerecho "Upgrading cards table to 2.0 schema\n"; 354*a1a3b679SAndreas Boehler 355*a1a3b679SAndreas Boehlertry { 356*a1a3b679SAndreas Boehler 357*a1a3b679SAndreas Boehler $create = false; 358*a1a3b679SAndreas Boehler $row = $pdo->query("SELECT * FROM cards LIMIT 1")->fetch(); 359*a1a3b679SAndreas Boehler if (!$row) { 360*a1a3b679SAndreas Boehler $random = mt_rand(1000,9999); 361*a1a3b679SAndreas Boehler echo "There was no data in the cards table, so we're re-creating it\n"; 362*a1a3b679SAndreas Boehler echo "The old table will be renamed to cards_old$random, just in case.\n"; 363*a1a3b679SAndreas Boehler 364*a1a3b679SAndreas Boehler $create = true; 365*a1a3b679SAndreas Boehler 366*a1a3b679SAndreas Boehler switch($driver) { 367*a1a3b679SAndreas Boehler case 'mysql' : 368*a1a3b679SAndreas Boehler $pdo->exec("RENAME TABLE cards TO cards_old$random"); 369*a1a3b679SAndreas Boehler break; 370*a1a3b679SAndreas Boehler case 'sqlite' : 371*a1a3b679SAndreas Boehler $pdo->exec("ALTER TABLE cards RENAME TO cards_old$random"); 372*a1a3b679SAndreas Boehler break; 373*a1a3b679SAndreas Boehler 374*a1a3b679SAndreas Boehler } 375*a1a3b679SAndreas Boehler } 376*a1a3b679SAndreas Boehler 377*a1a3b679SAndreas Boehler} catch (Exception $e) { 378*a1a3b679SAndreas Boehler 379*a1a3b679SAndreas Boehler echo "Exception while checking cards table. Assuming that the table does not yet exist.\n"; 380*a1a3b679SAndreas Boehler echo "Debug: ", $e->getMessage(), "\n"; 381*a1a3b679SAndreas Boehler $create = true; 382*a1a3b679SAndreas Boehler 383*a1a3b679SAndreas Boehler} 384*a1a3b679SAndreas Boehler 385*a1a3b679SAndreas Boehlerif ($create) { 386*a1a3b679SAndreas Boehler switch($driver) { 387*a1a3b679SAndreas Boehler case 'mysql' : 388*a1a3b679SAndreas Boehler $pdo->exec(" 389*a1a3b679SAndreas BoehlerCREATE TABLE cards ( 390*a1a3b679SAndreas Boehler id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, 391*a1a3b679SAndreas Boehler addressbookid INT(11) UNSIGNED NOT NULL, 392*a1a3b679SAndreas Boehler carddata MEDIUMBLOB, 393*a1a3b679SAndreas Boehler uri VARCHAR(200), 394*a1a3b679SAndreas Boehler lastmodified INT(11) UNSIGNED, 395*a1a3b679SAndreas Boehler etag VARBINARY(32), 396*a1a3b679SAndreas Boehler size INT(11) UNSIGNED NOT NULL, 397*a1a3b679SAndreas Boehler) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 398*a1a3b679SAndreas Boehler 399*a1a3b679SAndreas Boehler "); 400*a1a3b679SAndreas Boehler break; 401*a1a3b679SAndreas Boehler 402*a1a3b679SAndreas Boehler case 'sqlite' : 403*a1a3b679SAndreas Boehler 404*a1a3b679SAndreas Boehler $pdo->exec(" 405*a1a3b679SAndreas BoehlerCREATE TABLE cards ( 406*a1a3b679SAndreas Boehler id integer primary key asc, 407*a1a3b679SAndreas Boehler addressbookid integer, 408*a1a3b679SAndreas Boehler carddata blob, 409*a1a3b679SAndreas Boehler uri text, 410*a1a3b679SAndreas Boehler lastmodified integer, 411*a1a3b679SAndreas Boehler etag text, 412*a1a3b679SAndreas Boehler size integer 413*a1a3b679SAndreas Boehler); 414*a1a3b679SAndreas Boehler "); 415*a1a3b679SAndreas Boehler break; 416*a1a3b679SAndreas Boehler 417*a1a3b679SAndreas Boehler } 418*a1a3b679SAndreas Boehler} else { 419*a1a3b679SAndreas Boehler switch($driver) { 420*a1a3b679SAndreas Boehler case 'mysql' : 421*a1a3b679SAndreas Boehler $pdo->exec(" 422*a1a3b679SAndreas Boehler ALTER TABLE cards 423*a1a3b679SAndreas Boehler ADD etag VARBINARY(32), 424*a1a3b679SAndreas Boehler ADD size INT(11) UNSIGNED NOT NULL; 425*a1a3b679SAndreas Boehler "); 426*a1a3b679SAndreas Boehler break; 427*a1a3b679SAndreas Boehler 428*a1a3b679SAndreas Boehler case 'sqlite' : 429*a1a3b679SAndreas Boehler 430*a1a3b679SAndreas Boehler $pdo->exec(" 431*a1a3b679SAndreas Boehler ALTER TABLE cards ADD etag text; 432*a1a3b679SAndreas Boehler ALTER TABLE cards ADD size integer; 433*a1a3b679SAndreas Boehler "); 434*a1a3b679SAndreas Boehler break; 435*a1a3b679SAndreas Boehler 436*a1a3b679SAndreas Boehler } 437*a1a3b679SAndreas Boehler echo "Reading all old vcards and populating etag and size fields.\n"; 438*a1a3b679SAndreas Boehler $result = $pdo->query('SELECT id, carddata FROM cards'); 439*a1a3b679SAndreas Boehler $stmt = $pdo->prepare('UPDATE cards SET etag = ?, size = ? WHERE id = ?'); 440*a1a3b679SAndreas Boehler while($row = $result->fetch(\PDO::FETCH_ASSOC)) { 441*a1a3b679SAndreas Boehler $stmt->execute([ 442*a1a3b679SAndreas Boehler md5($row['carddata']), 443*a1a3b679SAndreas Boehler strlen($row['carddata']), 444*a1a3b679SAndreas Boehler $row['id'] 445*a1a3b679SAndreas Boehler ]); 446*a1a3b679SAndreas Boehler } 447*a1a3b679SAndreas Boehler 448*a1a3b679SAndreas Boehler 449*a1a3b679SAndreas Boehler} 450*a1a3b679SAndreas Boehler 451*a1a3b679SAndreas Boehlerecho "Upgrade to 2.0 schema completed.\n"; 452