ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
migrateto21.php
Go to the documentation of this file.
1 #!/usr/bin/env php
2 <?php
3 
4 echo "SabreDAV migrate script for version 2.1\n";
5 
6 if ($argc < 2) {
7 
8  echo <<<HELLO
9 
10 This script help you migrate from a pre-2.1 database to 2.1.
11 
12 Changes:
13  The 'calendarobjects' table will be upgraded.
14  'schedulingobjects' will be created.
15 
16 If you don't use the default PDO CalDAV or CardDAV backend, it's pointless to
17 run this script.
18 
19 Keep in mind that ALTER TABLE commands will be executed. If you have a large
20 dataset this may mean that this process takes a while.
21 
22 Lastly: Make a back-up first. This script has been tested, but the amount of
23 potential variants are extremely high, so it's impossible to deal with every
24 possible situation.
25 
26 In the worst case, you will lose all your data. This is not an overstatement.
27 
28 Usage:
29 
30 php {$argv[0]} [pdo-dsn] [username] [password]
31 
32 For example:
33 
34 php {$argv[0]} "mysql:host=localhost;dbname=sabredav" root password
35 php {$argv[0]} sqlite:data/sabredav.db
36 
37 HELLO;
38 
39  exit();
40 
41 }
42 
43 // There's a bunch of places where the autoloader could be, so we'll try all of
44 // them.
45 $paths = [
46  __DIR__ . '/../vendor/autoload.php',
47  __DIR__ . '/../../../autoload.php',
48 ];
49 
50 foreach ($paths as $path) {
51  if (file_exists($path)) {
52  include $path;
53  break;
54  }
55 }
56 
57 $dsn = $argv[1];
58 $user = isset($argv[2]) ? $argv[2] : null;
59 $pass = isset($argv[3]) ? $argv[3] : null;
60 
61 echo "Connecting to database: " . $dsn . "\n";
62 
63 $pdo = new PDO($dsn, $user, $pass);
64 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
65 $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
66 
67 $driver = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
68 
69 switch ($driver) {
70 
71  case 'mysql' :
72  echo "Detected MySQL.\n";
73  break;
74  case 'sqlite' :
75  echo "Detected SQLite.\n";
76  break;
77  default :
78  echo "Error: unsupported driver: " . $driver . "\n";
79  die(-1);
80 }
81 
82 echo "Upgrading 'calendarobjects'\n";
83 $addUid = false;
84 try {
85  $result = $pdo->query('SELECT * FROM calendarobjects LIMIT 1');
86  $row = $result->fetch(\PDO::FETCH_ASSOC);
87 
88  if (!$row) {
89  echo "No data in table. Going to try to add the uid field anyway.\n";
90  $addUid = true;
91  } elseif (array_key_exists('uid', $row)) {
92  echo "uid field exists. Assuming that this part of the migration has\n";
93  echo "Already been completed.\n";
94  } else {
95  echo "2.0 schema detected.\n";
96  $addUid = true;
97  }
98 
99 } catch (Exception $e) {
100  echo "Could not find a calendarobjects table. Skipping this part of the\n";
101  echo "upgrade.\n";
102 }
103 
104 if ($addUid) {
105 
106  switch ($driver) {
107  case 'mysql' :
108  $pdo->exec('ALTER TABLE calendarobjects ADD uid VARCHAR(200)');
109  break;
110  case 'sqlite' :
111  $pdo->exec('ALTER TABLE calendarobjects ADD uid TEXT');
112  break;
113  }
114 
115  $result = $pdo->query('SELECT id, calendardata FROM calendarobjects');
116  $stmt = $pdo->prepare('UPDATE calendarobjects SET uid = ? WHERE id = ?');
117  $counter = 0;
118 
119  while ($row = $result->fetch(\PDO::FETCH_ASSOC)) {
120 
121  try {
122  $vobj = \Sabre\VObject\Reader::read($row['calendardata']);
123  } catch (\Exception $e) {
124  echo "Warning! Item with id $row[id] could not be parsed!\n";
125  continue;
126  }
127  $uid = null;
128  $item = $vobj->getBaseComponent();
129  if (!isset($item->UID)) {
130  echo "Warning! Item with id $item[id] does NOT have a UID property and this is required.\n";
131  continue;
132  }
133  $uid = (string)$item->UID;
134  $stmt->execute([$uid, $row['id']]);
135  $counter++;
136 
137  }
138 
139 }
140 
141 echo "Creating 'schedulingobjects'\n";
142 
143 switch ($driver) {
144 
145  case 'mysql' :
146  $pdo->exec('CREATE TABLE IF NOT EXISTS schedulingobjects
147 (
148  id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
149  principaluri VARCHAR(255),
150  calendardata MEDIUMBLOB,
151  uri VARCHAR(200),
152  lastmodified INT(11) UNSIGNED,
153  etag VARCHAR(32),
154  size INT(11) UNSIGNED NOT NULL
155 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
156  ');
157  break;
158 
159 
160  case 'sqlite' :
161  $pdo->exec('CREATE TABLE IF NOT EXISTS schedulingobjects (
162  id integer primary key asc,
163  principaluri text,
164  calendardata blob,
165  uri text,
166  lastmodified integer,
167  etag text,
168  size integer
169 )
170 ');
171  break;
172 }
173 
174 echo "Done.\n";
175 
176 echo "Upgrade to 2.1 schema completed.\n";
up()
Definition: up.php:2
back()
Definition: back.php:2
run()
Runs the loop.
Definition: functions.php:130
font size
Definition: langcheck.php:162