xref: /plugin/davcal/vendor/sabre/dav/bin/migrateto20.php (revision a1a3b6794e0e143a4a8b51d3185ce2d339be61ab)
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