Completed
Push — 16.1 ( 74433c...7a42e7 )
by Nathan
14:21
created

tables_update.inc.php ➔ calendar_upgrade16_1_002()   B

Complexity

Conditions 6
Paths 1

Size

Total Lines 17
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 9
nc 1
nop 0
dl 0
loc 17
rs 8.8571
c 0
b 0
f 0
1
<?php
2
/**
3
 * EGroupware - Calendar setup
4
 *
5
 * @link http://www.egroupware.org
6
 * @package calendar
7
 * @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
8
 * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
9
 * @version $Id$
10
 */
11
12
use EGroupware\Api;
13
14
function calendar_v0_9_2to0_9_3update_owner($table, $field)
15
{
16
	$GLOBALS['egw_setup']->oProc->query("select distinct($field) from $table");
17
	if ($GLOBALS['egw_setup']->oProc->num_rows())
18
	{
19
		while ($GLOBALS['egw_setup']->oProc->next_record())
20
		{
21
			$owner[count($owner)] = $GLOBALS['egw_setup']->oProc->f($field);
22
		}
23
		if($GLOBALS['egw_setup']->alessthanb($GLOBALS['setup_info']['phpgwapi']['currentver'],'0.9.10pre4'))
24
		{
25
			$acctstbl = 'accounts';
26
		}
27
		else
28
		{
29
			$acctstbl = 'phpgw_accounts';
30
		}
31
		for($i=0;$i<count($owner);$i++)
0 ignored issues
show
Performance Best Practice introduced by
It seems like you are calling the size function count() as part of the test condition. You might want to compute the size beforehand, and not on each iteration.

If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration:

for ($i=0; $i<count($array); $i++) { // calls count() on each iteration
}

// Better
for ($i=0, $c=count($array); $i<$c; $i++) { // calls count() just once
}
Loading history...
32
		{
33
			$GLOBALS['egw_setup']->oProc->query("SELECT account_id FROM $acctstbl WHERE account_lid='".$owner[$i]."'");
34
			$GLOBALS['egw_setup']->oProc->next_record();
35
			$GLOBALS['egw_setup']->oProc->query("UPDATE $table SET $field=".$GLOBALS['egw_setup']->oProc->f('account_id')." WHERE $field='".$owner[$i]."'");
36
		}
37
	}
38
	$GLOBALS['egw_setup']->oProc->AlterColumn($table, $field, array('type' => 'int', 'precision' => 4, 'nullable' => false, 'default' => 0));
39
}
40
41
42
function calendar_upgrade0_9_3pre1()
43
{
44
	calendar_v0_9_2to0_9_3update_owner('webcal_entry','cal_create_by');
45
	calendar_v0_9_2to0_9_3update_owner('webcal_entry_user','cal_login');
46
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre2';
47
	return $GLOBALS['setup_info']['calendar']['currentver'];
48
}
49
50
51
function calendar_upgrade0_9_3pre2()
52
{
53
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre3';
54
	return $GLOBALS['setup_info']['calendar']['currentver'];
55
}
56
57
58
function calendar_upgrade0_9_3pre3()
59
{
60
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre4';
61
	return $GLOBALS['setup_info']['calendar']['currentver'];
62
}
63
64
65
function calendar_upgrade0_9_3pre4()
66
{
67
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre5';
68
	return $GLOBALS['setup_info']['calendar']['currentver'];
69
}
70
71
72
function calendar_upgrade0_9_3pre5()
73
{
74
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre6';
75
	return $GLOBALS['setup_info']['calendar']['currentver'];
76
}
77
78
79
function calendar_upgrade0_9_3pre6()
80
{
81
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre7';
82
	return $GLOBALS['setup_info']['calendar']['currentver'];
83
}
84
85
86
function calendar_upgrade0_9_3pre7()
87
{
88
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre8';
89
	return $GLOBALS['setup_info']['calendar']['currentver'];
90
}
91
92
93
function calendar_upgrade0_9_3pre8()
94
{
95
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre9';
96
	return $GLOBALS['setup_info']['calendar']['currentver'];
97
}
98
99
100
function calendar_upgrade0_9_3pre9()
101
{
102
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre10';
103
	return $GLOBALS['setup_info']['calendar']['currentver'];
104
}
105
106
107
function calendar_upgrade0_9_3pre10()
108
{
109
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3';
110
	return $GLOBALS['setup_info']['calendar']['currentver'];
111
}
112
113
114
function calendar_upgrade0_9_3()
115
{
116
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.4pre1';
117
	return $GLOBALS['setup_info']['calendar']['currentver'];
118
}
119
120
121
function calendar_upgrade0_9_4pre1()
122
{
123
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.4pre2';
124
	return $GLOBALS['setup_info']['calendar']['currentver'];
125
}
126
127
128
function calendar_upgrade0_9_4pre2()
129
{
130
	$GLOBALS['egw_setup']->oProc->RenameColumn('webcal_entry', 'cal_create_by', 'cal_owner');
131
	$GLOBALS['egw_setup']->oProc->AlterColumn('webcal_entry', 'cal_owner', array('type' => 'int', 'precision' => 4, 'nullable' => false));
132
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.4pre3';
133
	return $GLOBALS['setup_info']['calendar']['currentver'];
134
}
135
136
137
function calendar_upgrade0_9_4pre3()
138
{
139
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.4pre4';
140
	return $GLOBALS['setup_info']['calendar']['currentver'];
141
}
142
143
function calendar_upgrade0_9_4pre4()
144
{
145
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.4pre5';
146
	return $GLOBALS['setup_info']['calendar']['currentver'];
147
}
148
149
function calendar_upgrade0_9_4pre5()
150
{
151
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.4';
152
	return $GLOBALS['setup_info']['calendar']['currentver'];
153
}
154
155
function calendar_upgrade0_9_4()
156
{
157
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.5pre1';
158
	return $GLOBALS['setup_info']['calendar']['currentver'];
159
}
160
161
function calendar_upgrade0_9_5pre1()
162
{
163
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.5pre2';
164
	return $GLOBALS['setup_info']['calendar']['currentver'];
165
}
166
167
function calendar_upgrade0_9_5pre2()
168
{
169
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.5pre3';
170
	return $GLOBALS['setup_info']['calendar']['currentver'];
171
}
172
173
function calendar_upgrade0_9_5()
174
{
175
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.6';
176
	return $GLOBALS['setup_info']['calendar']['currentver'];
177
}
178
179
function calendar_upgrade0_9_6()
180
{
181
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.7pre1';
182
	return $GLOBALS['setup_info']['calendar']['currentver'];
183
}
184
185
186
function calendar_upgrade0_9_7pre1()
187
{
188
	$db2 = clone($GLOBALS['egw_setup']->db);
189
190
	$GLOBALS['egw_setup']->oProc->CreateTable('calendar_entry',
191
		Array(
192
			'fd' => array(
193
				'cal_id' => array('type' => 'auto', 'nullable' => false),
194
				'cal_owner' => array('type' => 'int', 'precision' => 4, 'nullable' => false, 'default' => '0'),
195
				'cal_group' => array('type' => 'varchar', 'precision' => 255),
196
				'cal_datetime' => array('type' => 'int', 'precision' => 4),
197
				'cal_mdatetime' => array('type' => 'int', 'precision' => 4),
198
				'cal_duration' => array('type' => 'int', 'precision' => 4, 'nullable' => false, 'default' => '0'),
199
				'cal_priority' => array('type' => 'int', 'precision' => 4, 'nullable' => false, 'default' => '2'),
200
				'cal_type' => array('type' => 'varchar', 'precision' => 10),
201
				'cal_access' => array('type' => 'varchar', 'precision' => 10),
202
				'cal_name' => array('type' => 'varchar', 'precision' => 80, 'nullable' => false),
203
				'cal_description' => array('type' => 'text')
204
			),
205
			'pk' => array("cal_id"),
206
			'ix' => array(),
207
			'fk' => array(),
208
			'uc' => array()
209
		)
210
	);
211
212
	$GLOBALS['egw_setup']->oProc->query('SELECT count(*) FROM webcal_entry',__LINE__,__FILE__);
213
	$GLOBALS['egw_setup']->oProc->next_record();
214
	if($GLOBALS['egw_setup']->oProc->f(0))
215
	{
216
		$GLOBALS['egw_setup']->oProc->query('SELECT cal_id,cal_owner,cal_duration,cal_priority,cal_type,cal_access,cal_name,cal_description,cal_id,cal_date,cal_time,cal_mod_date,cal_mod_time FROM webcal_entry ORDER BY cal_id',__LINE__,__FILE__);
217
		while($GLOBALS['egw_setup']->oProc->next_record())
218
		{
219
			$cal_id = $GLOBALS['egw_setup']->oProc->f('cal_id');
220
			$cal_owner = $GLOBALS['egw_setup']->oProc->f('cal_owner');
221
			$cal_duration = $GLOBALS['egw_setup']->oProc->f('cal_duration');
222
			$cal_priority = $GLOBALS['egw_setup']->oProc->f('cal_priority');
223
			$cal_type = $GLOBALS['egw_setup']->oProc->f('cal_type');
224
			$cal_access = $GLOBALS['egw_setup']->oProc->f('cal_access');
225
			$cal_name = $GLOBALS['egw_setup']->oProc->f('cal_name');
226
			$cal_description = $GLOBALS['egw_setup']->oProc->f('cal_description');
227
			$datetime = mktime(intval(strrev(substr(strrev($GLOBALS['egw_setup']->oProc->f('cal_time')),4))),intval(strrev(substr(strrev($GLOBALS['egw_setup']->oProc->f('cal_time')),2,2))),intval(strrev(substr(strrev($GLOBALS['egw_setup']->oProc->f('cal_time')),0,2))),intval(substr($GLOBALS['egw_setup']->oProc->f('cal_date'),4,2)),intval(substr($GLOBALS['egw_setup']->oProc->f('cal_date'),6,2)),intval(substr($GLOBALS['egw_setup']->oProc->f('cal_date'),0,4)));
228
			$moddatetime = mktime(intval(strrev(substr(strrev($GLOBALS['egw_setup']->oProc->f('cal_mod_time')),4))),intval(strrev(substr(strrev($GLOBALS['egw_setup']->oProc->f('cal_mod_time')),2,2))),intval(strrev(substr(strrev($GLOBALS['egw_setup']->oProc->f('cal_mod_time')),0,2))),intval(substr($GLOBALS['egw_setup']->oProc->f('cal_mod_date'),4,2)),intval(substr($GLOBALS['egw_setup']->oProc->f('cal_mod_date'),6,2)),intval(substr($GLOBALS['egw_setup']->oProc->f('cal_mod_date'),0,4)));
229
			$db2->query('SELECT groups FROM webcal_entry_groups WHERE cal_id='.$cal_id,__LINE__,__FILE__);
230
			$db2->next_record();
231
			$cal_group = $db2->f('groups');
232
			$db2->query('INSERT INTO calendar_entry(cal_id,cal_owner,cal_group,cal_datetime,cal_mdatetime,cal_duration,cal_priority,cal_type,cal_access,cal_name,cal_description) '
233
				.'VALUES('.$cal_id.",'".$cal_owner."','".$cal_group."',".$datetime.",".$moddatetime.",".$cal_duration.",".$cal_priority.",'".$cal_type."','".$cal_access."','".$cal_name."','".$cal_description."')",__LINE__,__FILE__);
234
		}
235
	}
236
237
	$GLOBALS['egw_setup']->oProc->DropTable('webcal_entry_groups');
238
	$GLOBALS['egw_setup']->oProc->DropTable('webcal_entry');
239
240
	$GLOBALS['egw_setup']->oProc->CreateTable('calendar_entry_user',
241
		Array(
242
			'fd' => array(
243
				'cal_id' => array('type' => 'int', 'precision' => 4, 'nullable' => false, 'default' => '0'),
244
				'cal_login' => array('type' => 'int', 'precision' => 4, 'nullable' => false, 'default' => '0'),
245
				'cal_status' => array('type' => 'char', 'precision' => 1, 'default' => 'A')
246
			),
247
			'pk' => array('cal_id', 'cal_login'),
248
			'ix' => array(),
249
			'fk' => array(),
250
			'uc' => array()
251
		)
252
	);
253
254
	$GLOBALS['egw_setup']->oProc->query('SELECT count(*) FROM webcal_entry_user',__LINE__,__FILE__);
255
	$GLOBALS['egw_setup']->oProc->next_record();
256
	if($GLOBALS['egw_setup']->oProc->f(0))
257
	{
258
		$GLOBALS['egw_setup']->oProc->query('SELECT cal_id,cal_login,cal_status FROM webcal_entry_user ORDER BY cal_id',__LINE__,__FILE__);
259
		while($GLOBALS['egw_setup']->oProc->next_record())
260
		{
261
			$cal_id = $GLOBALS['egw_setup']->oProc->f('cal_id');
262
			$cal_login = $GLOBALS['egw_setup']->oProc->f('cal_login');
263
			$cal_status = $GLOBALS['egw_setup']->oProc->f('cal_status');
264
			$db2->query('INSERT INTO calendar_entry_user(cal_id,cal_login,cal_status) VALUES('.$cal_id.','.$cal_login.",'".$cal_status."')",__LINE__,__FILE__);
265
		}
266
	}
267
268
	$GLOBALS['egw_setup']->oProc->DropTable('webcal_entry_user');
269
270
	$GLOBALS['egw_setup']->oProc->CreateTable('calendar_entry_repeats',
271
		Array(
272
			'fd' => array(
273
				'cal_id' => array('type' => 'int', 'precision' => 4, 'default' => '0', 'nullable' => false),
274
				'cal_type' => array('type' => 'varchar', 'precision' => 20, 'default' => 'daily', 'nullable' => false),
275
				'cal_use_end' => array('type' => 'int', 'precision' => 4, 'default' => '0'),
276
				'cal_end' => array('type' => 'int', 'precision' => 4),
277
				'cal_frequency' => array('type' => 'int', 'precision' => 4, 'default' => '1'),
278
				'cal_days' => array('type' => 'char', 'precision' => 7)
279
			),
280
			'pk' => array(),
281
			'ix' => array(),
282
			'fk' => array(),
283
			'uc' => array()
284
		)
285
	);
286
287
	$GLOBALS['egw_setup']->oProc->query('SELECT count(*) FROM webcal_entry_repeats',__LINE__,__FILE__);
288
	$GLOBALS['egw_setup']->oProc->next_record();
289
	if($GLOBALS['egw_setup']->oProc->f(0))
290
	{
291
		$GLOBALS['egw_setup']->oProc->query('SELECT cal_id,cal_type,cal_end,cal_frequency,cal_days FROM webcal_entry_repeats ORDER BY cal_id',__LINE__,__FILE__);
292
		while($GLOBALS['egw_setup']->oProc->next_record())
293
		{
294
			$cal_id = $GLOBALS['egw_setup']->oProc->f('cal_id');
295
			$cal_type = $GLOBALS['egw_setup']->oProc->f('cal_type');
296
			if(isset($GLOBALS['egw_setup']->oProc->Record['cal_end']))
297
			{
298
				$enddate = mktime(0,0,0,intval(substr($GLOBALS['egw_setup']->oProc->f('cal_end'),4,2)),intval(substr($GLOBALS['egw_setup']->oProc->f('cal_end'),6,2)),intval(substr($GLOBALS['egw_setup']->oProc->f('cal_end'),0,4)));
299
				$useend = 1;
300
			}
301
			else
302
			{
303
				$enddate = 0;
304
				$useend = 0;
305
			}
306
			$cal_frequency = $GLOBALS['egw_setup']->oProc->f('cal_frequency');
307
			$cal_days = $GLOBALS['egw_setup']->oProc->f('cal_days');
308
			$db2->query('INSERT INTO calendar_entry_repeats(cal_id,cal_type,cal_use_end,cal_end,cal_frequency,cal_days) VALUES('.$cal_id.",'".$cal_type."',".$useend.",".$enddate.",".$cal_frequency.",'".$cal_days."')",__LINE__,__FILE__);
309
		}
310
	}
311
312
	$GLOBALS['egw_setup']->oProc->DropTable('webcal_entry_repeats');
313
	$GLOBALS['egw_setup']->oProc->query("UPDATE {$GLOBALS['egw_setup']->applications_table} SET app_tables='calendar_entry,calendar_entry_user,calendar_entry_repeats' WHERE app_name='calendar'",__LINE__,__FILE__);
314
315
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.7pre2';
316
	return $GLOBALS['setup_info']['calendar']['currentver'];
317
}
318
319
320
function calendar_upgrade0_9_7pre2()
321
{
322
	$db2 = $GLOBALS['egw_setup']->db;
323
324
	$GLOBALS['egw_setup']->oProc->RenameColumn('calendar_entry', 'cal_duration', 'cal_edatetime');
325
	$GLOBALS['egw_setup']->oProc->query('SELECT cal_id,cal_datetime,cal_owner,cal_edatetime,cal_mdatetime FROM calendar_entry ORDER BY cal_id',__LINE__,__FILE__);
326
	if($GLOBALS['egw_setup']->oProc->num_rows())
327
	{
328
		while($GLOBALS['egw_setup']->oProc->next_record())
329
		{
330
			$db2->query("SELECT preference_value FROM preferences WHERE preference_name='tz_offset' AND preference_appname='common' AND preference_owner=".$GLOBALS['egw_setup']->db->f('cal_owner'),__LINE__,__FILE__);
331
			$db2->next_record();
332
			$tz = $db2->f('preference_value');
333
			$cal_id = $GLOBALS['egw_setup']->oProc->f('cal_id');
334
			$datetime = $GLOBALS['egw_setup']->oProc->f('cal_datetime') - ((60 * 60) * $tz);
335
			$mdatetime = $GLOBALS['egw_setup']->oProc->f('cal_mdatetime') - ((60 * 60) * $tz);
336
			$edatetime = $datetime + (60 * $GLOBALS['egw_setup']->oProc->f('cal_edatetime'));
337
			$db2->query('UPDATE calendar_entry SET cal_datetime='.$datetime.', cal_edatetime='.$edatetime.', cal_mdatetime='.$mdatetime.' WHERE cal_id='.$cal_id,__LINE__,__FILE__);
338
		}
339
	}
340
341
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.7pre3';
342
	return $GLOBALS['setup_info']['calendar']['currentver'];
343
}
344
345
346
function calendar_upgrade0_9_7pre3()
347
{
348
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.7';
349
	return $GLOBALS['setup_info']['calendar']['currentver'];
350
}
351
352
function calendar_upgrade0_9_7()
353
{
354
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.8pre1';
355
	return $GLOBALS['setup_info']['calendar']['currentver'];
356
}
357
358
function calendar_upgrade0_9_8pre1()
359
{
360
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.8pre2';
361
	return $GLOBALS['setup_info']['calendar']['currentver'];
362
}
363
364
function calendar_upgrade0_9_8pre2()
365
{
366
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.8pre3';
367
	return $GLOBALS['setup_info']['calendar']['currentver'];
368
}
369
370
function calendar_upgrade0_9_8pre3()
371
{
372
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.8pre4';
373
	return $GLOBALS['setup_info']['calendar']['currentver'];
374
}
375
376
function calendar_upgrade0_9_8pre4()
377
{
378
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.8pre5';
379
	return $GLOBALS['setup_info']['calendar']['currentver'];
380
}
381
382
function calendar_upgrade0_9_8pre5()
383
{
384
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.9pre1';
385
	return $GLOBALS['setup_info']['calendar']['currentver'];
386
}
387
388
function calendar_upgrade0_9_9pre1()
389
{
390
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.9';
391
	return $GLOBALS['setup_info']['calendar']['currentver'];
392
}
393
394
function calendar_upgrade0_9_9()
395
{
396
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre1';
397
	return $GLOBALS['setup_info']['calendar']['currentver'];
398
}
399
400
function calendar_upgrade0_9_10pre1()
401
{
402
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre2';
403
	return $GLOBALS['setup_info']['calendar']['currentver'];
404
}
405
406
function calendar_upgrade0_9_10pre2()
407
{
408
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre3';
409
	return $GLOBALS['setup_info']['calendar']['currentver'];
410
}
411
412
function calendar_upgrade0_9_10pre3()
413
{
414
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre4';
415
	return $GLOBALS['setup_info']['calendar']['currentver'];
416
}
417
418
function calendar_upgrade0_9_10pre4()
419
{
420
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre5';
421
	return $GLOBALS['setup_info']['calendar']['currentver'];
422
}
423
424
function calendar_upgrade0_9_10pre5()
425
{
426
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre6';
427
	return $GLOBALS['setup_info']['calendar']['currentver'];
428
}
429
430
function calendar_upgrade0_9_10pre6()
431
{
432
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre7';
433
	return $GLOBALS['setup_info']['calendar']['currentver'];
434
}
435
436
function calendar_upgrade0_9_10pre7()
437
{
438
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre8';
439
	return $GLOBALS['setup_info']['calendar']['currentver'];
440
}
441
442
function calendar_upgrade0_9_10pre8()
443
{
444
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre9';
445
	return $GLOBALS['setup_info']['calendar']['currentver'];
446
}
447
448
function calendar_upgrade0_9_10pre9()
449
{
450
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre10';
451
	return $GLOBALS['setup_info']['calendar']['currentver'];
452
}
453
454
function calendar_upgrade0_9_10pre10()
455
{
456
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre11';
457
	return $GLOBALS['setup_info']['calendar']['currentver'];
458
}
459
460
function calendar_upgrade0_9_10pre11()
461
{
462
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre12';
463
	return $GLOBALS['setup_info']['calendar']['currentver'];
464
}
465
466
function calendar_upgrade0_9_10pre12()
467
{
468
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre13';
469
	return $GLOBALS['setup_info']['calendar']['currentver'];
470
}
471
472
function calendar_upgrade0_9_10pre13()
473
{
474
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre14';
475
	return $GLOBALS['setup_info']['calendar']['currentver'];
476
}
477
478
function calendar_upgrade0_9_10pre14()
479
{
480
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre15';
481
	return $GLOBALS['setup_info']['calendar']['currentver'];
482
}
483
484
function calendar_upgrade0_9_10pre15()
485
{
486
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre16';
487
	return $GLOBALS['setup_info']['calendar']['currentver'];
488
}
489
490
function calendar_upgrade0_9_10pre16()
491
{
492
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre17';
493
	return $GLOBALS['setup_info']['calendar']['currentver'];
494
}
495
496
function calendar_upgrade0_9_10pre17()
497
{
498
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre18';
499
	return $GLOBALS['setup_info']['calendar']['currentver'];
500
}
501
502
function calendar_upgrade0_9_10pre18()
503
{
504
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre19';
505
	return $GLOBALS['setup_info']['calendar']['currentver'];
506
}
507
508
function calendar_upgrade0_9_10pre19()
509
{
510
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre20';
511
	return $GLOBALS['setup_info']['calendar']['currentver'];
512
}
513
514
function calendar_upgrade0_9_10pre20()
515
{
516
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre21';
517
	return $GLOBALS['setup_info']['calendar']['currentver'];
518
}
519
520
function calendar_upgrade0_9_10pre21()
521
{
522
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre22';
523
	return $GLOBALS['setup_info']['calendar']['currentver'];
524
}
525
526
function calendar_upgrade0_9_10pre22()
527
{
528
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre23';
529
	return $GLOBALS['setup_info']['calendar']['currentver'];
530
}
531
532
function calendar_upgrade0_9_10pre23()
533
{
534
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre24';
535
	return $GLOBALS['setup_info']['calendar']['currentver'];
536
}
537
538
function calendar_upgrade0_9_10pre24()
539
{
540
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre25';
541
	return $GLOBALS['setup_info']['calendar']['currentver'];
542
}
543
544
function calendar_upgrade0_9_10pre25()
545
{
546
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre26';
547
	return $GLOBALS['setup_info']['calendar']['currentver'];
548
}
549
550
function calendar_upgrade0_9_10pre26()
551
{
552
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre27';
553
	return $GLOBALS['setup_info']['calendar']['currentver'];
554
}
555
556
function calendar_upgrade0_9_10pre27()
557
{
558
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre28';
559
	return $GLOBALS['setup_info']['calendar']['currentver'];
560
}
561
562
function calendar_upgrade0_9_10pre28()
563
{
564
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10';
565
	return $GLOBALS['setup_info']['calendar']['currentver'];
566
}
567
568
function calendar_upgrade0_9_10()
569
{
570
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.001';
571
	return $GLOBALS['setup_info']['calendar']['currentver'];
572
}
573
574
function calendar_upgrade0_9_11()
575
{
576
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.001';
577
	return $GLOBALS['setup_info']['calendar']['currentver'];
578
}
579
580
581
function calendar_upgrade0_9_11_001()
582
{
583
	$db2 = $GLOBALS['egw_setup']->db;
584
585
	if(extension_loaded('mcal') == False)
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like you are loosely comparing two booleans. Considering using the strict comparison === instead.

When comparing two booleans, it is generally considered safer to use the strict comparison operator.

Loading history...
586
	{
587
		define(RECUR_NONE,0);
588
		define(RECUR_DAILY,1);
589
		define(RECUR_WEEKLY,2);
590
		define(RECUR_MONTHLY_MDAY,3);
591
		define(RECUR_MONTHLY_WDAY,4);
592
		define(RECUR_YEARLY,5);
593
594
		define(M_SUNDAY,1);
595
		define(M_MONDAY,2);
596
		define(M_TUESDAY,4);
597
		define(M_WEDNESDAY,8);
598
		define(M_THURSDAY,16);
599
		define(M_FRIDAY,32);
600
		define(M_SATURDAY,64);
601
	}
602
603
// calendar_entry => phpgw_cal
604
	$GLOBALS['egw_setup']->oProc->CreateTable('phpgw_cal',
605
		Array(
606
			'fd' => array(
607
				'cal_id' => array('type' => 'auto', 'nullable' => False),
608
				'owner' => array('type' => 'int', 'precision' => 8, 'nullable' => False),
609
				'category' => array('type' => 'int', 'precision' => 8, 'default' => '0', 'nullable' => True),
610
				'groups' => array('type' => 'varchar', 'precision' => 255, 'nullable' => True),
611
				'datetime' => array('type' => 'int', 'precision' => 8, 'nullable' => True),
612
				'mdatetime' => array('type' => 'int', 'precision' => 8, 'nullable' => True),
613
				'edatetime' => array('type' => 'int', 'precision' => 8, 'nullable' => True),
614
				'priority' => array('type' => 'int', 'precision' => 8, 'nullable' => False, 'default' => '2'),
615
				'cal_type' => array('type' => 'varchar', 'precision' => 10, 'nullable' => True),
616
				'is_public' => array('type' => 'int', 'precision' => 8, 'nullable' => False, 'default' => '1'),
617
				'title' => array('type' => 'varchar', 'precision' => 80, 'nullable' => False, 'default' => '1'),
618
				'description' => array('type' => 'text', 'nullable' => True)
619
			),
620
			'pk' => array('cal_id'),
621
			'fk' => array(),
622
			'ix' => array(),
623
			'uc' => array()
624
		)
625
	);
626
627
	$GLOBALS['egw_setup']->oProc->query('SELECT * FROM calendar_entry',__LINE__,__FILE__);
628
	while($GLOBALS['egw_setup']->oProc->next_record())
629
	{
630
		$id = $GLOBALS['egw_setup']->oProc->f('cal_id');
631
		$owner = $GLOBALS['egw_setup']->oProc->f('cal_owner');
632
		$access = $GLOBALS['egw_setup']->oProc->f('cal_access');
633
		switch($access)
634
		{
635
			case 'private':
636
				$is_public = 0;
637
				break;
638
			case 'public':
639
				$is_public = 1;
640
				break;
641
			case 'group':
642
				$is_public = 2;
643
				break;
644
		}
645
		$groups = $GLOBALS['egw_setup']->oProc->f('cal_group');
646
		$datetime = $GLOBALS['egw_setup']->oProc->f('cal_datetime');
647
		$mdatetime = $GLOBALS['egw_setup']->oProc->f('cal_mdatetime');
648
		$edatetime = $GLOBALS['egw_setup']->oProc->f('cal_edatetime');
649
		$priority = $GLOBALS['egw_setup']->oProc->f('cal_priority');
650
		$type = $GLOBALS['egw_setup']->oProc->f('cal_type');
651
		$title = $GLOBALS['egw_setup']->oProc->f('cal_name');
652
		$description = $GLOBALS['egw_setup']->oProc->f('cal_description');
653
654
		$db2->query("INSERT INTO phpgw_cal(cal_id,owner,groups,datetime,mdatetime,edatetime,priority,cal_type,is_public,title,description) "
655
			. "VALUES($id,$owner,'$groups',$datetime,$mdatetime,$edatetime,$priority,'$type',$is_public,'$title','$description')",__LINE__,__FILE__);
656
	}
657
	$GLOBALS['egw_setup']->oProc->DropTable('calendar_entry');
658
659
// calendar_entry_repeats => phpgw_cal_repeats
660
	$GLOBALS['egw_setup']->oProc->CreateTable('phpgw_cal_repeats',
661
		Array(
662
			'fd' => array(
663
				'cal_id' => array('type' => 'int', 'precision' => 8,'nullable' => False),
664
				'recur_type' => array('type' => 'int', 'precision' => 8,'nullable' => False),
665
				'recur_use_end' => array('type' => 'int', 'precision' => 8,'nullable' => True),
666
				'recur_enddate' => array('type' => 'int', 'precision' => 8,'nullable' => True),
667
				'recur_interval' => array('type' => 'int', 'precision' => 8,'nullable' => True,'default' => '1'),
668
				'recur_data' => array('type' => 'int', 'precision' => 8,'nullable' => True,'default' => '1')
669
			),
670
			'pk' => array(),
671
			'fk' => array(),
672
			'ix' => array(),
673
			'uc' => array()
674
		)
675
	);
676
	$GLOBALS['egw_setup']->oProc->query('SELECT * FROM calendar_entry_repeats',__LINE__,__FILE__);
677
	while($GLOBALS['egw_setup']->oProc->next_record())
678
	{
679
		$id = $GLOBALS['egw_setup']->oProc->f('cal_id');
680
		$recur_type = $GLOBALS['egw_setup']->oProc->f('cal_type');
681
		switch($recur_type)
682
		{
683
			case 'daily':
684
				$recur_type_num = RECUR_DAILY;
685
				break;
686
			case 'weekly':
687
				$recur_type_num = RECUR_WEEKLY;
688
				break;
689
			case 'monthlybydate':
690
				$recur_type_num = RECUR_MONTHLY_MDAY;
691
				break;
692
			case 'monthlybyday':
693
				$recur_type_num = RECUR_MONTHLY_WDAY;
694
				break;
695
			case 'yearly':
696
				$recur_type_num = RECUR_YEARLY;
697
				break;
698
		}
699
		$recur_use_end = $GLOBALS['egw_setup']->oProc->f('cal_use_end');
700
		$recur_end = $GLOBALS['egw_setup']->oProc->f('cal_end');
701
		$recur_interval = $GLOBALS['egw_setup']->oProc->f('cal_frequency');
702
		$days = strtoupper($GLOBALS['egw_setup']->oProc->f('cal_days'));
703
		$recur_data = 0;
704
		$recur_data += (substr($days,0,1)=='Y'?M_SUNDAY:0);
705
		$recur_data += (substr($days,1,1)=='Y'?M_MONDAY:0);
706
		$recur_data += (substr($days,2,1)=='Y'?M_TUESDAY:0);
707
		$recur_data += (substr($days,3,1)=='Y'?M_WEDNESDAY:0);
708
		$recur_data += (substr($days,4,1)=='Y'?M_THURSDAY:0);
709
		$recur_data += (substr($days,5,1)=='Y'?M_FRIDAY:0);
710
		$recur_data += (substr($days,6,1)=='Y'?M_SATURDAY:0);
711
		$db2->query("INSERT INTO phpgw_cal_repeats(cal_id,recur_type,recur_use_end,recur_enddate,recur_interval,recur_data) "
712
			. "VALUES($id,$recur_type_num,$recur_use_end,$recur_end,$recur_interval,$recur_data)",__LINE__,__FILE__);
713
	}
714
	$GLOBALS['egw_setup']->oProc->DropTable('calendar_entry_repeats');
715
716
// calendar_entry_user => phpgw_cal_user
717
	$GLOBALS['egw_setup']->oProc->RenameTable('calendar_entry_user','phpgw_cal_user');
718
719
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.002';
720
	return $GLOBALS['setup_info']['calendar']['currentver'];
721
}
722
723
724
function calendar_upgrade0_9_11_002()
725
{
726
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.003';
727
	return $GLOBALS['setup_info']['calendar']['currentver'];
728
}
729
730
731
function calendar_upgrade0_9_11_003()
732
{
733
	$GLOBALS['egw_setup']->oProc->CreateTable('phpgw_cal_holidays',
734
		Array(
735
			'fd' => array(
736
				'locale' => array('type' => 'char', 'precision' => 2,'nullable' => False),
737
				'name' => array('type' => 'varchar', 'precision' => 50,'nullable' => False),
738
				'date_time' => array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0')
739
			),
740
			'pk' => array('locale','name'),
741
			'fk' => array(),
742
			'ix' => array(),
743
			'uc' => array()
744
		)
745
	);
746
747
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.004';
748
	return $GLOBALS['setup_info']['calendar']['currentver'];
749
}
750
751
752
function calendar_upgrade0_9_11_004()
753
{
754
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.005';
755
	return $GLOBALS['setup_info']['calendar']['currentver'];
756
}
757
758
759
function calendar_upgrade0_9_11_005()
760
{
761
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.006';
762
	return $GLOBALS['setup_info']['calendar']['currentver'];
763
}
764
765
766
function calendar_upgrade0_9_11_006()
767
{
768
	$GLOBALS['egw_setup']->oProc->DropTable('phpgw_cal_holidays');
769
	$GLOBALS['egw_setup']->oProc->CreateTable('phpgw_cal_holidays',
770
		Array(
771
			'fd' => array(
772
				'hol_id' => array('type' => 'auto','nullable' => False),
773
				'locale' => array('type' => 'char', 'precision' => 2,'nullable' => False),
774
				'name' => array('type' => 'varchar', 'precision' => 50,'nullable' => False),
775
				'date_time' => array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0')
776
			),
777
			'pk' => array('hol_id'),
778
			'fk' => array(),
779
			'ix' => array(),
780
			'uc' => array()
781
		)
782
	);
783
784
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.007';
785
	return $GLOBALS['setup_info']['calendar']['currentver'];
786
}
787
788
789
function calendar_upgrade0_9_11_007()
790
{
791
	$GLOBALS['egw_setup']->oProc->query('DELETE FROM phpgw_cal_holidays');
792
	$GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_holidays','mday',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0'));
793
	$GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_holidays','month_num',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0'));
794
	$GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_holidays','occurence',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0'));
795
	$GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_holidays','dow',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0'));
796
797
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.008';
798
	return $GLOBALS['setup_info']['calendar']['currentver'];
799
}
800
801
802
function calendar_upgrade0_9_11_008()
803
{
804
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.009';
805
	return $GLOBALS['setup_info']['calendar']['currentver'];
806
}
807
808
809
function calendar_upgrade0_9_11_009()
810
{
811
	$GLOBALS['egw_setup']->oProc->query('DELETE FROM phpgw_cal_holidays');
812
	$GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_holidays','observance_rule',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0'));
813
814
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.010';
815
	return $GLOBALS['setup_info']['calendar']['currentver'];
816
}
817
818
819
function calendar_upgrade0_9_11_010()
820
{
821
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.011';
822
	return $GLOBALS['setup_info']['calendar']['currentver'];
823
}
824
825
826
function calendar_upgrade0_9_11_011()
827
{
828
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.13.001';
829
	return $GLOBALS['setup_info']['calendar']['currentver'];
830
}
831
832
function calendar_upgrade0_9_12()
833
{
834
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.13.001';
835
	return $GLOBALS['setup_info']['calendar']['currentver'];
836
}
837
838
function calendar_upgrade0_9_13_001()
839
{
840
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.13.002';
841
	return $GLOBALS['setup_info']['calendar']['currentver'];
842
}
843
844
845 View Code Duplication
function calendar_upgrade0_9_13_002()
846
{
847
	$GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal','reference',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0'));
848
849
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.13.003';
850
	return $GLOBALS['setup_info']['calendar']['currentver'];
851
}
852
853
854
function calendar_upgrade0_9_13_003()
855
{
856
	$GLOBALS['egw_setup']->oProc->CreateTable('phpgw_cal_alarm',
857
		Array(
858
			'fd' => array(
859
				'alarm_id' => array('type' => 'auto','nullable' => False),
860
				'cal_id'   => array('type' => 'int', 'precision' => 8, 'nullable' => False),
861
				'cal_owner'	=> array('type' => 'int', 'precision' => 8, 'nullable' => False),
862
				'cal_time' => array('type' => 'int', 'precision' => 8, 'nullable' => False),
863
				'cal_text' => array('type' => 'varchar', 'precision' => 50, 'nullable' => False)
864
			),
865
			'pk' => array('alarm_id'),
866
			'fk' => array(),
867
			'ix' => array(),
868
			'uc' => array()
869
		)
870
	);
871
872
	$GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal','uid',array('type' => 'varchar', 'precision' => 255,'nullable' => False));
873
	$GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal','location',array('type' => 'varchar', 'precision' => 255,'nullable' => True));
874
875
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.13.004';
876
	return $GLOBALS['setup_info']['calendar']['currentver'];
877
}
878
879
880 View Code Duplication
function calendar_upgrade0_9_13_004()
881
{
882
	$GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_alarm','alarm_enabled',array('type' => 'int', 'precision' => 4,'nullable' => False, 'default' => '1'));
883
884
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.13.005';
885
	return $GLOBALS['setup_info']['calendar']['currentver'];
886
}
887
888
889
function calendar_upgrade0_9_13_005()
890
{
891
	$calendar_data = Array();
892
	$GLOBALS['egw_setup']->oProc->query('SELECT cal_id, category FROM phpgw_cal',__LINE__,__FILE__);
893 View Code Duplication
	while($GLOBALS['egw_setup']->oProc->next_record())
894
	{
895
		$calendar_data[$GLOBALS['egw_setup']->oProc->f('cal_id')] = $GLOBALS['egw_setup']->oProc->f('category');
896
	}
897
898
	$GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_cal','category',array('type' => 'varchar', 'precision' => 30,'nullable' => True));
899
900
	@reset($calendar_data);
901
	while($calendar_data && list($cal_id,$category) = each($calendar_data))
902
	{
903
		$GLOBALS['egw_setup']->oProc->query("UPDATE phpgw_cal SET category='".$category."' WHERE cal_id=".$cal_id,__LINE__,__FILE__);
904
	}
905
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.13.006';
906
	return $GLOBALS['setup_info']['calendar']['currentver'];
907
}
908
909
910 View Code Duplication
function calendar_upgrade0_9_13_006()
911
{
912
	$GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_repeats','recur_exception',array('type' => 'varchar', 'precision' => 255, 'nullable' => True, 'default' => ''));
913
914
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.13.007';
915
	return $GLOBALS['setup_info']['calendar']['currentver'];
916
}
917
918
919
920
function calendar_upgrade0_9_13_007()
921
{
922
	$GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_user','cal_type',array(
923
		'type' => 'varchar',
924
		'precision' => '1',
925
		'nullable' => False,
926
		'default' => 'u'
927
	));
928
929
	$GLOBALS['egw_setup']->oProc->CreateTable('phpgw_cal_extra',array(
930
		'fd' => array(
931
			'cal_id' => array('type' => 'int','precision' => '4','nullable' => False),
932
			'cal_extra_name' => array('type' => 'varchar','precision' => '40','nullable' => False),
933
			'cal_extra_value' => array('type' => 'varchar','precision' => '255','nullable' => False,'default' => '')
934
		),
935
		'pk' => array('cal_id','cal_extra_name'),
936
		'fk' => array(),
937
		'ix' => array(),
938
		'uc' => array()
939
	));
940
941
	$GLOBALS['egw_setup']->oProc->DropTable('phpgw_cal_alarm');
942
943
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.16.002';
944
	return $GLOBALS['setup_info']['calendar']['currentver'];
945
}
946
947
948
949 View Code Duplication
function calendar_upgrade0_9_16_001()
950
{
951
	// this is to set the default as schema_proc was not setting an empty default
952
	$GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_cal_user','cal_type',array(
953
		'type' => 'varchar',
954
		'precision' => '1',
955
		'nullable' => False,
956
		'default' => 'u'
957
	));
958
959
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.16.002';
960
	return $GLOBALS['setup_info']['calendar']['currentver'];
961
}
962
963
964
// the following series of updates add some indices, to speedup the selects
965
966
967 View Code Duplication
function calendar_upgrade0_9_16_002()
968
{
969
	$GLOBALS['egw_setup']->oProc->RefreshTable('phpgw_cal_repeats',array(
970
		'fd' => array(
971
			'cal_id' => array('type' => 'int','precision' => '8','nullable' => False),
972
			'recur_type' => array('type' => 'int','precision' => '8','nullable' => False),
973
			'recur_use_end' => array('type' => 'int','precision' => '8','default' => '0'),
974
			'recur_enddate' => array('type' => 'int','precision' => '8'),
975
			'recur_interval' => array('type' => 'int','precision' => '8','default' => '1'),
976
			'recur_data' => array('type' => 'int','precision' => '8','default' => '1'),
977
			'recur_exception' => array('type' => 'varchar','precision' => '255','default' => '')
978
		),
979
		'pk' => array(),
980
		'fk' => array(),
981
		'ix' => array('cal_id'),
982
		'uc' => array()
983
	));
984
985
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.16.003';
986
	return $GLOBALS['setup_info']['calendar']['currentver'];
987
}
988
989
990
991
function calendar_upgrade0_9_16_003()
992
{
993
	$GLOBALS['egw_setup']->oProc->RefreshTable('phpgw_cal_user',array(
994
		'fd' => array(
995
			'cal_id' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0'),
996
			'cal_login' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0'),
997
			'cal_status' => array('type' => 'char','precision' => '1','default' => 'A'),
998
			'cal_type' => array('type' => 'varchar','precision' => '1','nullable' => False,'default' => 'u')
999
		),
1000
		'pk' => array('cal_id','cal_login','cal_type'),
1001
		'fk' => array(),
1002
		'ix' => array(),
1003
		'uc' => array()
1004
	));
1005
1006
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.16.004';
1007
	return $GLOBALS['setup_info']['calendar']['currentver'];
1008
}
1009
1010
1011
1012
function calendar_upgrade0_9_16_004()
1013
{
1014
	$GLOBALS['egw_setup']->oProc->RefreshTable('phpgw_cal_holidays',array(
1015
		'fd' => array(
1016
			'hol_id' => array('type' => 'auto','nullable' => False),
1017
			'locale' => array('type' => 'char','precision' => '2','nullable' => False),
1018
			'name' => array('type' => 'varchar','precision' => '50','nullable' => False),
1019
			'mday' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0'),
1020
			'month_num' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0'),
1021
			'occurence' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0'),
1022
			'dow' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0'),
1023
			'observance_rule' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0')
1024
		),
1025
		'pk' => array('hol_id'),
1026
		'fk' => array(),
1027
		'ix' => array('locale'),
1028
		'uc' => array()
1029
	));
1030
1031
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.16.005';
1032
	return $GLOBALS['setup_info']['calendar']['currentver'];
1033
}
1034
1035
1036
1037
function calendar_upgrade0_9_16_005()
1038
{
1039
	// creates uid's for all entries which do not have unique ones, they are '[email protected]'
1040
	// very old entries even have an empty uid, see 0.9.16.006 update
1041
	$GLOBALS['egw_setup']->oProc->query("SELECT config_name,config_value FROM {$GLOBALS['egw_setup']->config_table} WHERE config_name IN ('install_id','mail_suffix') AND config_app='phpgwapi'",__LINE__,__FILE__);
1042 View Code Duplication
	while ($GLOBALS['egw_setup']->oProc->next_record())
1043
	{
1044
		$config[$GLOBALS['egw_setup']->oProc->f(0)] = $GLOBALS['egw_setup']->oProc->f(1);
1045
	}
1046
	$GLOBALS['egw_setup']->oProc->query('UPDATE phpgw_cal SET uid='.
1047
		$GLOBALS['egw_setup']->db->concat($GLOBALS['egw_setup']->db->quote('cal-'),'cal_id',
1048
			$GLOBALS['egw_setup']->db->quote('-'.$config['install_id'].'@'.
1049
			($config['mail_suffix'] ? $config['mail_suffix'] : 'local'))).
1050
		" WHERE uid LIKE '-@%' OR uid=''");
1051
1052
	// we dont need to do update 0.9.16.007, as UpdateSequenze is called now by RefreshTable
1053
	$GLOBALS['setup_info']['calendar']['currentver'] = '1.0.0';
1054
	return $GLOBALS['setup_info']['calendar']['currentver'];
1055
}
1056
1057
1058
1059
function calendar_upgrade0_9_16_006()
1060
{
1061
	// re-run the update as very old entries only have an empty uid
1062
	return calendar_upgrade0_9_16_005();
1063
}
1064
1065
1066
1067
function calendar_upgrade0_9_16_007()
1068
{
1069
	// update the sequenzes for refreshed tables (postgres only)
1070
	$GLOBALS['egw_setup']->oProc->UpdateSequence('phpgw_cal_holidays','hol_id');
1071
1072
	$GLOBALS['setup_info']['calendar']['currentver'] = '1.0.0';
1073
	return $GLOBALS['setup_info']['calendar']['currentver'];
1074
}
1075
1076
1077
1078
function calendar_upgrade1_0_0()
1079
{
1080
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','uid','cal_uid');
1081
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','owner','cal_owner');
1082
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','category','cal_category');
1083
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','groups','cal_groups');
1084
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','datetime','cal_starttime');
1085
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','mdatetime','cal_modified');
1086
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','edatetime','cal_endtime');
1087
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','priority','cal_priority');
1088
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','is_public','cal_public');
1089
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','title','cal_title');
1090
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','description','cal_description');
1091
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','location','cal_location');
1092
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','reference','cal_reference');
1093
1094
	$GLOBALS['setup_info']['calendar']['currentver'] = '1.0.0.001';
1095
	return $GLOBALS['setup_info']['calendar']['currentver'];
1096
}
1097
1098
1099
1100
function calendar_upgrade1_0_0_001()
1101
{
1102
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal_holidays','locale','hol_locale');
1103
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal_holidays','name','hol_name');
1104
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal_holidays','mday','hol_mday');
1105
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal_holidays','month_num','hol_month_num');
1106
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal_holidays','occurence','hol_occurence');
1107
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal_holidays','dow','hol_dow');
1108
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal_holidays','observance_rule','hol_observance_rule');
1109
1110
	$GLOBALS['setup_info']['calendar']['currentver'] = '1.0.0.002';
1111
	return $GLOBALS['setup_info']['calendar']['currentver'];
1112
}
1113
1114
1115
1116
function calendar_upgrade1_0_0_002()
1117
{
1118
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal_user','cal_login','cal_user_id');
1119
	$GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal_user','cal_type','cal_user_type');
1120
1121
	$GLOBALS['setup_info']['calendar']['currentver'] = '1.0.0.003';
1122
	return $GLOBALS['setup_info']['calendar']['currentver'];
1123
}
1124
1125
1126
1127 View Code Duplication
function calendar_upgrade1_0_0_003()
1128
{
1129
	$GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_cal','cal_title',array(
1130
		'type' => 'varchar',
1131
		'precision' => '255',
1132
		'nullable' => False,
1133
		'default' => '1'
1134
	));
1135
1136
	$GLOBALS['setup_info']['calendar']['currentver'] = '1.0.0.004';
1137
	return $GLOBALS['setup_info']['calendar']['currentver'];
1138
}
1139
1140
1141
1142 View Code Duplication
function calendar_upgrade1_0_0_004()
1143
{
1144
	$GLOBALS['egw_setup']->oProc->RefreshTable('phpgw_cal_repeats',array(
1145
		'fd' => array(
1146
			'cal_id' => array('type' => 'int','precision' => '8','nullable' => False),
1147
			'recur_type' => array('type' => 'int','precision' => '8','nullable' => False),
1148
			'recur_use_end' => array('type' => 'int','precision' => '8','default' => '0'),
1149
			'recur_enddate' => array('type' => 'int','precision' => '8'),
1150
			'recur_interval' => array('type' => 'int','precision' => '8','default' => '1'),
1151
			'recur_data' => array('type' => 'int','precision' => '8','default' => '1'),
1152
			'recur_exception' => array('type' => 'varchar','precision' => '255','default' => '')
1153
		),
1154
		'pk' => array('cal_id'),
1155
		'fk' => array(),
1156
		'ix' => array(),
1157
		'uc' => array()
1158
	));
1159
1160
	$GLOBALS['setup_info']['calendar']['currentver'] = '1.0.0.005';
1161
	return $GLOBALS['setup_info']['calendar']['currentver'];
1162
}
1163
1164
1165
1166
function calendar_upgrade1_0_0_005()
1167
{
1168
	// change prefix of all calendar tables to egw_
1169
	foreach(array('cal_user','cal_repeats','cal_extra','cal_holidays','cal') as $name)
1170
	{
1171
		$GLOBALS['egw_setup']->oProc->RenameTable('phpgw_'.$name,'egw_'.$name);
1172
	}
1173
1174
	// create new dates table, with content from the egw_cal table
1175
	$GLOBALS['egw_setup']->oProc->CreateTable('egw_cal_dates',array(
1176
		'fd' => array(
1177
			'cal_id' => array('type' => 'int','precision' => '4','nullable' => False),
1178
			'cal_start' => array('type' => 'int','precision' => '8','nullable' => False),
1179
			'cal_end' => array('type' => 'int','precision' => '8','nullable' => False)
1180
		),
1181
		'pk' => array('cal_id','cal_start'),
1182
		'fk' => array(),
1183
		'ix' => array(),
1184
		'uc' => array()
1185
	));
1186
	$GLOBALS['egw_setup']->oProc->query("INSERT INTO egw_cal_dates SELECT cal_id,cal_starttime,cal_endtime FROM egw_cal");
1187
1188
	// drop the fields transfered to the dates table
1189
	$GLOBALS['egw_setup']->oProc->DropColumn('egw_cal',array(
1190
		'fd' => array(
1191
			'cal_id' => array('type' => 'auto','nullable' => False),
1192
			'cal_uid' => array('type' => 'varchar','precision' => '255','nullable' => False),
1193
			'cal_owner' => array('type' => 'int','precision' => '8','nullable' => False),
1194
			'cal_category' => array('type' => 'varchar','precision' => '30'),
1195
			'cal_groups' => array('type' => 'varchar','precision' => '255'),
1196
			'cal_modified' => array('type' => 'int','precision' => '8'),
1197
			'cal_endtime' => array('type' => 'int','precision' => '8'),
1198
			'cal_priority' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '2'),
1199
			'cal_type' => array('type' => 'varchar','precision' => '10'),
1200
			'cal_public' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '1'),
1201
			'cal_title' => array('type' => 'varchar','precision' => '255','nullable' => False,'default' => '1'),
1202
			'cal_description' => array('type' => 'text'),
1203
			'cal_location' => array('type' => 'varchar','precision' => '255'),
1204
			'cal_reference' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0')
1205
		),
1206
		'pk' => array('cal_id'),
1207
		'fk' => array(),
1208
		'ix' => array(),
1209
		'uc' => array()
1210
	),'cal_starttime');
1211
	$GLOBALS['egw_setup']->oProc->DropColumn('egw_cal',array(
1212
		'fd' => array(
1213
			'cal_id' => array('type' => 'auto','nullable' => False),
1214
			'cal_uid' => array('type' => 'varchar','precision' => '255','nullable' => False),
1215
			'cal_owner' => array('type' => 'int','precision' => '8','nullable' => False),
1216
			'cal_category' => array('type' => 'varchar','precision' => '30'),
1217
			'cal_groups' => array('type' => 'varchar','precision' => '255'),
1218
			'cal_modified' => array('type' => 'int','precision' => '8'),
1219
			'cal_priority' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '2'),
1220
			'cal_type' => array('type' => 'varchar','precision' => '10'),
1221
			'cal_public' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '1'),
1222
			'cal_title' => array('type' => 'varchar','precision' => '255','nullable' => False,'default' => '1'),
1223
			'cal_description' => array('type' => 'text'),
1224
			'cal_location' => array('type' => 'varchar','precision' => '255'),
1225
			'cal_reference' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0')
1226
		),
1227
		'pk' => array('cal_id'),
1228
		'fk' => array(),
1229
		'ix' => array(),
1230
		'uc' => array()
1231
	),'cal_endtime');
1232
1233
	$GLOBALS['setup_info']['calendar']['currentver'] = '1.0.1.001';
1234
	return $GLOBALS['setup_info']['calendar']['currentver'];
1235
}
1236
1237
1238
1239
function calendar_upgrade1_0_1_001()
1240
{
1241
	/* done by RefreshTable() anyway
1242
	$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal_user','cal_recur_date',array(
1243
		'type' => 'int',
1244
		'precision' => '8',
1245
		'default' => '0'
1246
	));*/
1247
	$GLOBALS['egw_setup']->oProc->RefreshTable('egw_cal_user',array(
1248
		'fd' => array(
1249
			'cal_id' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0'),
1250
			'cal_recur_date' => array('type' => 'int','precision' => '8','default' => '0'),
1251
			'cal_user_type' => array('type' => 'varchar','precision' => '1','nullable' => False,'default' => 'u'),
1252
			'cal_user_id' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0'),
1253
			'cal_status' => array('type' => 'char','precision' => '1','default' => 'A')
1254
		),
1255
		'pk' => array('cal_id','cal_recur_date','cal_user_type','cal_user_id'),
1256
		'fk' => array(),
1257
		'ix' => array(),
1258
		'uc' => array()
1259
	));
1260
1261
	$GLOBALS['setup_info']['calendar']['currentver'] = '1.0.1.002';
1262
	return $GLOBALS['setup_info']['calendar']['currentver'];
1263
}
1264
1265
1266
1267
function calendar_upgrade1_0_1_002()
1268
{
1269
	$GLOBALS['egw_setup']->oProc->DropColumn('egw_cal',array(
1270
		'fd' => array(
1271
			'cal_id' => array('type' => 'auto','nullable' => False),
1272
			'cal_uid' => array('type' => 'varchar','precision' => '255','nullable' => False),
1273
			'cal_owner' => array('type' => 'int','precision' => '8','nullable' => False),
1274
			'cal_category' => array('type' => 'varchar','precision' => '30'),
1275
			'cal_groups' => array('type' => 'varchar','precision' => '255'),
1276
			'cal_modified' => array('type' => 'int','precision' => '8'),
1277
			'cal_priority' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '2'),
1278
			'cal_public' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '1'),
1279
			'cal_title' => array('type' => 'varchar','precision' => '255','nullable' => False,'default' => '1'),
1280
			'cal_description' => array('type' => 'text'),
1281
			'cal_location' => array('type' => 'varchar','precision' => '255'),
1282
			'cal_reference' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0')
1283
		),
1284
		'pk' => array('cal_id'),
1285
		'fk' => array(),
1286
		'ix' => array(),
1287
		'uc' => array()
1288
	),'cal_type');
1289
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal','cal_owner',array(
1290
		'type' => 'int',
1291
		'precision' => '4',
1292
		'nullable' => False
1293
	));
1294
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal','cal_priority',array(
1295
		'type' => 'int',
1296
		'precision' => '2',
1297
		'nullable' => False,
1298
		'default' => '2'
1299
	));
1300
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal','cal_public',array(
1301
		'type' => 'int',
1302
		'precision' => '2',
1303
		'nullable' => False,
1304
		'default' => '1'
1305
	));
1306
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal','cal_reference',array(
1307
		'type' => 'int',
1308
		'precision' => '4',
1309
		'nullable' => False,
1310
		'default' => '0'
1311
	));
1312
	$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal','cal_modifier',array(
1313
		'type' => 'int',
1314
		'precision' => '4'
1315
	));
1316
1317
	$GLOBALS['setup_info']['calendar']['currentver'] = '1.0.1.003';
1318
	return $GLOBALS['setup_info']['calendar']['currentver'];
1319
}
1320
1321
1322
1323
function calendar_upgrade1_0_1_003()
1324
{
1325
	$GLOBALS['egw_setup']->oProc->DropColumn('egw_cal_repeats',array(
1326
		'fd' => array(
1327
			'cal_id' => array('type' => 'int','precision' => '8','nullable' => False),
1328
			'recur_type' => array('type' => 'int','precision' => '8','nullable' => False),
1329
			'recur_enddate' => array('type' => 'int','precision' => '8'),
1330
			'recur_interval' => array('type' => 'int','precision' => '8','default' => '1'),
1331
			'recur_data' => array('type' => 'int','precision' => '8','default' => '1'),
1332
			'recur_exception' => array('type' => 'varchar','precision' => '255','default' => '')
1333
		),
1334
		'pk' => array('cal_id'),
1335
		'fk' => array(),
1336
		'ix' => array(),
1337
		'uc' => array()
1338
	),'recur_use_end');
1339
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_repeats','cal_id',array(
1340
		'type' => 'int',
1341
		'precision' => '4',
1342
		'nullable' => False
1343
	));
1344
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_repeats','recur_type',array(
1345
		'type' => 'int',
1346
		'precision' => '2',
1347
		'nullable' => False
1348
	));
1349
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_repeats','recur_interval',array(
1350
		'type' => 'int',
1351
		'precision' => '2',
1352
		'default' => '1'
1353
	));
1354
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_repeats','recur_data',array(
1355
		'type' => 'int',
1356
		'precision' => '2',
1357
		'default' => '1'
1358
	));
1359
1360
	$GLOBALS['setup_info']['calendar']['currentver'] = '1.0.1.004';
1361
	return $GLOBALS['setup_info']['calendar']['currentver'];
1362
}
1363
1364
1365
1366
function calendar_upgrade1_0_1_004()
1367
{
1368
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_user','cal_id',array(
1369
		'type' => 'int',
1370
		'precision' => '4',
1371
		'nullable' => False,
1372
		'default' => '0'
1373
	));
1374
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_user','cal_user_id',array(
1375
		'type' => 'int',
1376
		'precision' => '4',
1377
		'nullable' => False,
1378
		'default' => '0'
1379
	));
1380
1381
	$GLOBALS['setup_info']['calendar']['currentver'] = '1.0.1.005';
1382
	return $GLOBALS['setup_info']['calendar']['currentver'];
1383
}
1384
1385
1386
1387
function calendar_upgrade1_0_1_005()
1388
{
1389
	$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal_user','cal_quantity',array(
1390
		'type' => 'int',
1391
		'precision' => '4',
1392
		'default' => '1'
1393
	));
1394
1395
	$GLOBALS['setup_info']['calendar']['currentver'] = '1.0.1.006';
1396
	return $GLOBALS['setup_info']['calendar']['currentver'];
1397
}
1398
1399
1400
1401
function calendar_upgrade1_0_1_006()
1402
{
1403
	$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal','cal_non_blocking',array(
1404
		'type' => 'int',
1405
		'precision' => '2',
1406
		'default' => '0'
1407
	));
1408
1409
	$GLOBALS['setup_info']['calendar']['currentver'] = '1.0.1.007';
1410
	return $GLOBALS['setup_info']['calendar']['currentver'];
1411
}
1412
1413
1414
1415
function calendar_upgrade1_0_1_007()
1416
{
1417
	$GLOBALS['egw_setup']->db->update('egw_cal_repeats',array('recur_exception' => null),array('recur_exception' => ''),__LINE__,__FILE__,'calendar');
1418
1419
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_repeats','recur_exception',array(
1420
		'type' => 'text'
1421
	));
1422
1423
	$GLOBALS['setup_info']['calendar']['currentver'] = '1.0.1.008';
1424
	return $GLOBALS['setup_info']['calendar']['currentver'];
1425
}
1426
1427
1428
1429
function calendar_upgrade1_0_1_008()
1430
{
1431
	$config_data = Api\Config::read('calendar');
1432
	if (isset($config_data['fields']))	// old custom fields
1433
	{
1434
		$customfields = array();
1435
		$order = 0;
1436
		foreach($config_data['fields'] as $name => $data)
1437
		{
1438
			if ($name{0} == '#' && !$data['disabled'])	// real not-disabled custom field
1439
			{
1440
				$customfields[substr($name,1)] = array(
1441
					'type'  => 'text',
1442
					'len'   => $data['length'].($data['shown'] ? ','.$data['shown'] : ''),
1443
					'label' => $data['name'],
1444
					'order' => ($order += 10),
1445
				);
1446
			}
1447
		}
1448
		if (count($customfields))
1449
		{
1450
			Api\Config::save_value('customfields', $customfields, 'calendar');
1451
		}
1452
		Api\Config::save_value('fields', null, 'calendar');
1453
	}
1454
	$GLOBALS['setup_info']['calendar']['currentver'] = '1.0.1.009';
1455
	return $GLOBALS['setup_info']['calendar']['currentver'];
1456
}
1457
1458
1459
1460
function calendar_upgrade1_0_1_009()
1461
{
1462
	$db2 = clone($GLOBALS['egw_setup']->db);
1463
	$GLOBALS['egw_setup']->db->select('egw_cal','DISTINCT egw_cal.cal_id,cal_groups,cal_recur_date',"cal_groups != ''",__LINE__,__FILE__,
1464
		False,'','calendar',0,',egw_cal_user WHERE egw_cal.cal_id=egw_cal_user.cal_id');
1465
	while(($row = $GLOBALS['egw_setup']->db->row(true)))
1466
	{
1467
		$row['cal_user_type'] = 'u';
1468
		foreach(explode(',',$row['cal_groups']) as $group)
1469
		{
1470
			$row['cal_user_id'] = $group;
1471
			$db2->insert('egw_cal_user',array('cal_status' => 'U'),$row,__LINE__,__FILE__,'calendar');
1472
		}
1473
	}
1474
	$GLOBALS['egw_setup']->oProc->DropColumn('egw_cal',array(
1475
		'fd' => array(
1476
			'cal_id' => array('type' => 'auto','nullable' => False),
1477
			'cal_uid' => array('type' => 'varchar','precision' => '255','nullable' => False),
1478
			'cal_owner' => array('type' => 'int','precision' => '4','nullable' => False),
1479
			'cal_category' => array('type' => 'varchar','precision' => '30'),
1480
			'cal_modified' => array('type' => 'int','precision' => '8'),
1481
			'cal_priority' => array('type' => 'int','precision' => '2','nullable' => False,'default' => '2'),
1482
			'cal_public' => array('type' => 'int','precision' => '2','nullable' => False,'default' => '1'),
1483
			'cal_title' => array('type' => 'varchar','precision' => '255','nullable' => False,'default' => '1'),
1484
			'cal_description' => array('type' => 'text'),
1485
			'cal_location' => array('type' => 'varchar','precision' => '255'),
1486
			'cal_reference' => array('type' => 'int','precision' => '4','nullable' => False,'default' => '0'),
1487
			'cal_modifier' => array('type' => 'int','precision' => '4'),
1488
			'cal_non_blocking' => array('type' => 'int','precision' => '2','default' => '0')
1489
		),
1490
		'pk' => array('cal_id'),
1491
		'fk' => array(),
1492
		'ix' => array(),
1493
		'uc' => array()
1494
	),'cal_groups');
1495
1496
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.2';
1497
}
1498
1499
1500
1501
function calendar_upgrade1_2()
1502
{
1503
	// get old alarms (saved before 1.2) working again
1504
	$GLOBALS['egw_setup']->db->query("UPDATE egw_async SET async_method ='calendar.bocalupdate.send_alarm' WHERE async_method ='calendar.bocalendar.send_alarm'",__LINE__,__FILE__);
1505
1506
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.2.001';
1507
}
1508
1509
1510
function calendar_upgrade1_2_001()
1511
{
1512
	$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal','cal_special',array(
1513
		'type' => 'int',
1514
		'precision' => '2',
1515
		'default' => '0'
1516
	));
1517
1518
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.3.001';
1519
}
1520
1521
1522
function calendar_upgrade1_3_001()
1523
{
1524
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.4';
1525
}
1526
1527
1528
function calendar_upgrade1_4()
1529
{
1530
	$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal','cal_etag',array(
1531
		'type' => 'int',
1532
		'precision' => '4',
1533
		'default' => '0'
1534
	));
1535
	// as we no longer create cal_edit_time|user and already set default 0 for cal_etag, we skip the 1.5 update
1536
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.5.001';
1537
}
1538
1539
1540
function calendar_upgrade1_5()
1541
{
1542
	$GLOBALS['egw_setup']->oProc->DropColumn('egw_cal',array(
1543
		'fd' => array(
1544
			'cal_id' => array('type' => 'auto','nullable' => False),
1545
			'cal_uid' => array('type' => 'varchar','precision' => '255','nullable' => False),
1546
			'cal_owner' => array('type' => 'int','precision' => '4','nullable' => False),
1547
			'cal_category' => array('type' => 'varchar','precision' => '30'),
1548
			'cal_modified' => array('type' => 'int','precision' => '8'),
1549
			'cal_priority' => array('type' => 'int','precision' => '2','nullable' => False,'default' => '2'),
1550
			'cal_public' => array('type' => 'int','precision' => '2','nullable' => False,'default' => '1'),
1551
			'cal_title' => array('type' => 'varchar','precision' => '255','nullable' => False,'default' => '1'),
1552
			'cal_description' => array('type' => 'text'),
1553
			'cal_location' => array('type' => 'varchar','precision' => '255'),
1554
			'cal_reference' => array('type' => 'int','precision' => '4','nullable' => False,'default' => '0'),
1555
			'cal_modifier' => array('type' => 'int','precision' => '4'),
1556
			'cal_non_blocking' => array('type' => 'int','precision' => '2','default' => '0'),
1557
			'cal_special' => array('type' => 'int','precision' => '2','default' => '0'),
1558
			'cal_etag' => array('type' => 'int','precision' => '4'),
1559
			'cal_edit_time' => array('type' => 'int','precision' => '8')
1560
		),
1561
		'pk' => array('cal_id'),
1562
		'fk' => array(),
1563
		'ix' => array(),
1564
		'uc' => array()
1565
	),'cal_edit_user');
1566
	$GLOBALS['egw_setup']->oProc->DropColumn('egw_cal',array(
1567
		'fd' => array(
1568
			'cal_id' => array('type' => 'auto','nullable' => False),
1569
			'cal_uid' => array('type' => 'varchar','precision' => '255','nullable' => False),
1570
			'cal_owner' => array('type' => 'int','precision' => '4','nullable' => False),
1571
			'cal_category' => array('type' => 'varchar','precision' => '30'),
1572
			'cal_modified' => array('type' => 'int','precision' => '8'),
1573
			'cal_priority' => array('type' => 'int','precision' => '2','nullable' => False,'default' => '2'),
1574
			'cal_public' => array('type' => 'int','precision' => '2','nullable' => False,'default' => '1'),
1575
			'cal_title' => array('type' => 'varchar','precision' => '255','nullable' => False,'default' => '1'),
1576
			'cal_description' => array('type' => 'text'),
1577
			'cal_location' => array('type' => 'varchar','precision' => '255'),
1578
			'cal_reference' => array('type' => 'int','precision' => '4','nullable' => False,'default' => '0'),
1579
			'cal_modifier' => array('type' => 'int','precision' => '4'),
1580
			'cal_non_blocking' => array('type' => 'int','precision' => '2','default' => '0'),
1581
			'cal_special' => array('type' => 'int','precision' => '2','default' => '0'),
1582
			'cal_etag' => array('type' => 'int','precision' => '4')
1583
		),
1584
		'pk' => array('cal_id'),
1585
		'fk' => array(),
1586
		'ix' => array(),
1587
		'uc' => array()
1588
	),'cal_edit_time');
1589
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal','cal_etag',array(
1590
		'type' => 'int',
1591
		'precision' => '4',
1592
		'default' => '0'
1593
	));
1594
	$GLOBALS['egw_setup']->db->query('UPDATE egw_cal SET cal_etag=0 WHERE cal_etag IS NULL',__LINE__,__FILE__);
1595
1596
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.5.001';
1597
}
1598
1599
1600
function calendar_upgrade1_5_001()
1601
{
1602
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_user','cal_id',array(
1603
		'type' => 'int',
1604
		'precision' => '4',
1605
		'nullable' => False
1606
	));
1607
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_user','cal_user_id',array(
1608
		'type' => 'varchar',
1609
		'precision' => '128',
1610
		'nullable' => False
1611
	));
1612
1613
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.5.002';
1614
}
1615
1616
1617
function calendar_upgrade1_5_002()
1618
{
1619
	// update the alarm methods
1620
	$async = new Api\Asyncservice();
1621
	foreach((array)$async->read('cal:%') as $job)
1622
	{
1623
		if ($job['method'] == 'calendar.bocalupdate.send_alarm')
1624
		{
1625
			$job['method'] = 'calendar.calendar_boupdate.send_alarm';
1626
			$async->write($job,true);
1627
		}
1628
	}
1629
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.6';
1630
}
1631
1632
1633
/**
1634
 * Adjust UIDs of series exceptions to RFC standard
1635
 * Propagate cal_reference field to temporarily contain RECURRENCE-ID
1636
 *
1637
 * @return string
1638
 */
1639
function calendar_upgrade1_6()
1640
{
1641
	// Set UID of series exception to UID of series master
1642
	// update cal_etag, cal_modified and cal_modifier to distribute changes on GroupDAV devices
1643 View Code Duplication
	foreach($GLOBALS['egw_setup']->db->query('
1644
		SELECT cal_ex.cal_id,cal_ex.cal_uid AS cal_uid_ex,cal_master.cal_uid AS cal_uid_master
1645
		FROM egw_cal cal_ex
1646
		JOIN egw_cal cal_master ON cal_ex.cal_reference=cal_master.cal_id
1647
		WHERE cal_ex.cal_reference != 0',__LINE__,__FILE__) as $row)
1648
	{
1649
		if (strlen($row['cal_uid_master']) > 0 && $row['cal_uid_ex'] != $row['cal_uid_master'])
1650
		{
1651
			$GLOBALS['egw_setup']->db->query('UPDATE egw_cal SET cal_uid=\''.$row['cal_uid_master'].
1652
				'\',cal_etag=cal_etag+1,cal_modified='.time().
1653
				',cal_modifier=NULL WHERE cal_id='.(int)$row['cal_id'],__LINE__,__FILE__);
1654
		}
1655
	}
1656
1657
	// Search series exception for nearest exception in series master and add that RECURRENCE-ID
1658
	// as cal_reference (for 1.6.003 and move it to new field cal_recurrence in 1.7.001)
1659
	$diff = null;
1660
	foreach($GLOBALS['egw_setup']->db->query('SELECT egw_cal.cal_id,cal_start,recur_exception FROM egw_cal
1661
		JOIN egw_cal_dates ON egw_cal.cal_id=egw_cal_dates.cal_id
1662
		JOIN egw_cal_repeats ON cal_reference=egw_cal_repeats.cal_id
1663
		WHERE cal_reference != 0',__LINE__,__FILE__) as $row)
1664
	{
1665
		$recurrence = null;
1666
		foreach(explode(',',$row['recur_exception']) as $ts)
1667
		{
1668
			if (is_null($recurrence) || abs($ts-$row['cal_start']) < $diff)
1669
			{
1670
				$recurrence = $ts;
1671
				$diff = abs($ts-$row['cal_start']);
1672
			}
1673
		}
1674
		if ($recurrence)
1675
		{
1676
			$GLOBALS['egw_setup']->db->query('UPDATE egw_cal SET cal_reference='.(int)$recurrence.
1677
				' WHERE cal_id='.(int)$row['cal_id'],__LINE__,__FILE__);
1678
		}
1679
		else
1680
		{
1681
			// if we cannot determine the RECURRENCE-ID use cal_start
1682
			// because RECURRENCE-ID must be present
1683
			$GLOBALS['egw_setup']->db->query('UPDATE egw_cal SET cal_reference='.(int)$row['cal_start'].
1684
				' WHERE cal_id='.(int)$row['cal_id'],__LINE__,__FILE__);
1685
		}
1686
	}
1687
1688
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.6.003';
1689
}
1690
1691
1692
/**
1693
 * Adding column for RECURRENCE-ID of master event to improve iCal handling of exceptions
1694
 *
1695
 * @return string
1696
 */
1697
function calendar_upgrade1_6_003()
1698
{
1699
	$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal','cal_creator',array(
1700
		'type' => 'int',
1701
		'precision' => '4',
1702
		'comment' => 'creating user'
1703
	));
1704
	$GLOBALS['egw_setup']->db->query('UPDATE egw_cal SET cal_creator=cal_owner',__LINE__,__FILE__);
1705
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal','cal_creator',array(
1706
		'type' => 'int',
1707
		'precision' => '4',
1708
		'nullable' => False,
1709
		'comment' => 'creating user'
1710
	));
1711
1712
	$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal','cal_created',array(
1713
		'type' => 'int',
1714
		'precision' => '8',
1715
		'comment' => 'creation time of event'
1716
	));
1717
	$GLOBALS['egw_setup']->db->query('UPDATE egw_cal SET cal_created=cal_modified',__LINE__,__FILE__);
1718
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal','cal_created',array(
1719
		'type' => 'int',
1720
		'precision' => '8',
1721
		'nullable' => False,
1722
		'comment' => 'creation time of event'
1723
	));
1724
1725
	$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal','cal_recurrence',array(
1726
		'type' => 'int',
1727
		'precision' => '8',
1728
		'nullable' => False,
1729
		'default' => '0',
1730
		'comment' => 'cal_start of original recurrence for exception'
1731
	));
1732
1733
	// move RECURRENCE-ID from temporarily (1.6.003)
1734
	// used field cal_reference to new field cal_recurrence
1735
	// and restore cal_reference field of series exceptions with id of the series master
1736
	foreach($GLOBALS['egw_setup']->db->query('
1737
		SELECT cal_ex.cal_id AS cal_id_ex,cal_master.cal_id AS cal_id_master,
1738
		cal_ex.cal_reference AS cal_reference_ex,cal_ex.cal_uid AS cal_uid_ex,
1739
		cal_master.cal_uid AS cal_uid_master
1740
		FROM egw_cal cal_ex
1741
		JOIN egw_cal cal_master
1742
		ON cal_ex.cal_uid=cal_master.cal_uid AND cal_master.cal_reference = 0 AND cal_ex.cal_owner = cal_master.cal_owner
1743
		WHERE cal_ex.cal_reference !=0 AND cal_master.cal_id IS NOT NULL',__LINE__,__FILE__) as $row)
1744
	{
1745
		$GLOBALS['egw_setup']->db->query('UPDATE egw_cal SET cal_recurrence='.(int)$row['cal_reference_ex'].
1746
			', cal_reference='.(int)$row['cal_id_master'].
1747
			' WHERE cal_id='.(int)$row['cal_id_ex']);
1748
	}
1749
1750
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.7.001';
1751
}
1752
1753
/**
1754
 * Adding participant roles table to improve iCal support
1755
 *
1756
 * @return string
1757
 */
1758
function calendar_upgrade1_7_001()
1759
{
1760
	$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal_user','cal_role',array(
1761
		'type' => 'varchar',
1762
		'precision' => '64',
1763
		'default' => 'REQ-PARTICIPANT'
1764
	));
1765
1766
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.7.002';
1767
}
1768
1769
/**
1770
 * Adding timezones table egw_cal_timezones
1771
 *
1772
 * @return string
1773
 */
1774
function calendar_upgrade1_7_002()
1775
{
1776
	$GLOBALS['egw_setup']->oProc->CreateTable('egw_cal_timezones',array(
1777
		'fd' => array(
1778
			'tz_id' => array('type' => 'auto','nullable' => False),
1779
			'tz_tzid' => array('type' => 'varchar','precision' => '128','nullable' => False),
1780
			'tz_alias' => array('type' => 'int','precision' => '4','comment' => 'tz_id for data'),
1781
			'tz_latitude' => array('type' => 'int','precision' => '4'),
1782
			'tz_longitude' => array('type' => 'int','precision' => '4'),
1783
			'tz_component' => array('type' => 'text','comment' => 'iCal VTIMEZONE component')
1784
		),
1785
		'pk' => array('tz_id'),
1786
		'fk' => array(),
1787
		'ix' => array('tz_alias'),
1788
		'uc' => array('tz_tzid')
1789
	));
1790
	// import timezone data, throw exception if no PDO sqlite support
1791
	calendar_timezones::import_zones();
1792
1793
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.7.003';
1794
}
1795
1796
/**
1797
 * Adding automatic timestamp for participant table, maximum can be used as part of a ctag for CalDAV
1798
 *
1799
 * @return string
1800
 */
1801
function calendar_upgrade1_7_003()
1802
{
1803
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_user','cal_user_type',array(
1804
		'type' => 'varchar',
1805
		'precision' => '1',
1806
		'nullable' => False,
1807
		'default' => 'u',
1808
		'comment' => 'u=user, g=group, c=contact, r=resource, e=email'
1809
	));
1810
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_user','cal_user_id',array(
1811
		'type' => 'varchar',
1812
		'precision' => '128',
1813
		'nullable' => False,
1814
		'comment' => 'id or email-address for type=e'
1815
	));
1816
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_user','cal_status',array(
1817
		'type' => 'char',
1818
		'precision' => '1',
1819
		'default' => 'A',
1820
		'comment' => 'U=unknown, A=accepted, R=rejected, T=tentative'
1821
	));
1822
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_user','cal_quantity',array(
1823
		'type' => 'int',
1824
		'precision' => '4',
1825
		'default' => '1',
1826
		'comment' => 'only for certain types (eg. resources)'
1827
	));
1828
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_user','cal_role',array(
1829
		'type' => 'varchar',
1830
		'precision' => '64',
1831
		'default' => 'REQ-PARTICIPANT',
1832
		'comment' => 'CHAIR, REQ-PARTICIPANT, OPT-PARTICIPANT, NON-PARTICIPANT, X-CAT-$cat_id'
1833
	));
1834
	$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal_user','cal_user_modified',array(
1835
		'type' => 'timestamp',
1836
		'default' => 'current_timestamp',
1837
		'comment' => 'automatic timestamp of last update'
1838
	));
1839
1840
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.7.004';
1841
}
1842
1843
/**
1844
 * Adding timezone id column, to fully support timezones in calendar
1845
 *
1846
 * @return string
1847
 */
1848
function calendar_upgrade1_7_004()
1849
{
1850
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_dates','cal_start',array(
1851
		'type' => 'int',
1852
		'precision' => '8',
1853
		'nullable' => False,
1854
		'comment' => 'starttime in server time'
1855
	));
1856
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_dates','cal_end',array(
1857
		'type' => 'int',
1858
		'precision' => '8',
1859
		'nullable' => False,
1860
		'comment' => 'endtime in server time'
1861
	));
1862
	$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal','tz_id',array(
1863
		'type' => 'int',
1864
		'precision' => '4',
1865
		'comment' => 'key into egw_cal_timezones'
1866
	));
1867
1868
	// set id of server timezone for existing events, as that's the timezone their recurrences are using
1869
	if (($tzid = date_default_timezone_get()) && ($tz_id = calendar_timezones::tz2id($tzid)))
1870
	{
1871
		$GLOBALS['egw_setup']->db->query('UPDATE egw_cal SET tz_id='.(int)$tz_id,__LINE__,__FILE__);
1872
	}
1873
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.7.005';
1874
}
1875
1876
/**
1877
 * Adding Windows timezones as alias to standard TZID's
1878
 *
1879
 * @link http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/windows_tzid.html
1880
 *
1881
 * @return string
1882
 */
1883
function calendar_upgrade1_7_005()
1884
{
1885
	calendar_timezones::import_tz_aliases();
1886
1887
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.7.006';
1888
}
1889
1890
/**
1891
 * // Fix whole day event cal_end times which are set to 23:59:00 or 00:00 instead of 23:59:59
1892
 * // Fix recur_interval from 0 to 1 for event series
1893
 *
1894
 * @return string
1895
 */
1896
function calendar_upgrade1_7_006()
1897
{
1898 View Code Duplication
	foreach($GLOBALS['egw_setup']->db->query('SELECT * FROM egw_cal_dates
1899
		WHERE (cal_end-cal_start)%86400=86340',__LINE__,__FILE__) as $row)
1900
	{
1901
		$GLOBALS['egw_setup']->db->query('UPDATE egw_cal_dates SET cal_end=cal_end+59
1902
			WHERE cal_id='.(int)$row['cal_id'].' AND cal_start='.(int)$row['cal_start'],__LINE__,__FILE__);
1903
	}
1904
1905 View Code Duplication
	foreach($GLOBALS['egw_setup']->db->query('SELECT * FROM egw_cal_dates
1906
		WHERE cal_end-cal_start>0 AND (cal_end-cal_start)%86400=0',__LINE__,__FILE__) as $row)
1907
	{
1908
		$GLOBALS['egw_setup']->db->query('UPDATE egw_cal_dates SET cal_end=cal_end-1
1909
			WHERE cal_id='.(int)$row['cal_id'].' AND cal_start='.(int)$row['cal_start'],__LINE__,__FILE__);
1910
	}
1911
1912
    $GLOBALS['egw_setup']->db->query('UPDATE egw_cal_repeats SET recur_interval=1
1913
			WHERE recur_interval=0',__LINE__,__FILE__);
1914
1915
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.7.007';
1916
}
1917
1918
/**
1919
 * Adjust UIDs of series exceptions to RFC standard
1920
 * this was already done in upgrade to 1.6.003 but we repeat it here in a non-destructive
1921
 * way to catch installations which already used versions > 1.6.003 before we added this to setup
1922
 *
1923
 * @return string
1924
 */
1925
function calendar_upgrade1_7_007()
1926
{
1927
	// Set UID of series exception to UID of series master
1928
	// update cal_etag,cal_modified and cal_modifier to distribute changes on GroupDAV devices
1929 View Code Duplication
	foreach($GLOBALS['egw_setup']->db->query('
1930
		SELECT cal_ex.cal_id,cal_ex.cal_uid AS cal_uid_ex,cal_master.cal_uid AS cal_uid_master
1931
		FROM egw_cal cal_ex
1932
		JOIN egw_cal cal_master ON cal_ex.cal_reference=cal_master.cal_id
1933
		WHERE cal_ex.cal_reference != 0',__LINE__,__FILE__) as $row)
1934
	{
1935
		if (strlen($row['cal_uid_master']) > 0 && $row['cal_uid_ex'] != $row['cal_uid_master'])
1936
		{
1937
			$GLOBALS['egw_setup']->db->query('UPDATE egw_cal SET cal_uid=\''.$row['cal_uid_master'].
1938
				'\',cal_etag=cal_etag+1,cal_modified='.time().
1939
				',cal_modifier=NULL WHERE cal_id='.(int)$row['cal_id'],__LINE__,__FILE__);
1940
		}
1941
	}
1942
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.7.008';
1943
}
1944
1945
/**
1946
 * Create an index over egw_cal_user.cal_user_type and cal_user_id, to speed up calendar queries
1947
 *
1948
 * @return string
1949
 */
1950
function calendar_upgrade1_7_008()
1951
{
1952
	$GLOBALS['egw_setup']->oProc->CreateIndex('egw_cal_user',array('cal_user_type','cal_user_id'));
1953
1954
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.7.009';
1955
}
1956
1957
/**
1958
 * Create an index over egw_cal.cal_uid and cal_owner, to speed up calendar queries specially sync
1959
 *
1960
 * @return string
1961
 */
1962 View Code Duplication
function calendar_upgrade1_7_009()
1963
{
1964
	$GLOBALS['egw_setup']->oProc->CreateIndex('egw_cal','cal_uid');
1965
	$GLOBALS['egw_setup']->oProc->CreateIndex('egw_cal','cal_owner');
1966
1967
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.7.010';
1968
}
1969
1970
function calendar_upgrade1_7_010()
1971
{
1972
	$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal','cal_deleted',array(
1973
		'type' => 'bool',
1974
		'nullable' => False,
1975
		'default' => '0',
1976
		'comment' => '1 if the event has been deleted, but you want to keep it around'
1977
	));
1978
1979
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.9.001';	// was 1.7.011
1980
}
1981
1982
function calendar_upgrade1_7_011()
1983
{
1984
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.9.001';
1985
}
1986
1987
function calendar_upgrade1_8()
1988
{
1989
	calendar_upgrade1_7_010();
1990
1991
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.9.001';
1992
}
1993
1994
/**
1995
 * Convert bool column cal_deleted to a unix timestamp
1996
 *
1997
 * Using cal_modified as deleted-timestamp, as querying it from SyncML tables creates too many problems (refresh table stops before copying all rows!)
1998
 *
1999
 * @return string
2000
 */
2001
function calendar_upgrade1_9_001()
2002
{
2003
	/* done by RefreshTable() anyway
2004
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal','cal_deleted',array(
2005
		'type' => 'int',
2006
		'precision' => '8',
2007
		'comment' => 'ts when event was deleted'
2008
	));*/
2009
	$GLOBALS['egw_setup']->oProc->RefreshTable('egw_cal',array(
2010
		'fd' => array(
2011
			'cal_id' => array('type' => 'auto','nullable' => False),
2012
			'cal_uid' => array('type' => 'varchar','precision' => '255','nullable' => False,'comment' => 'unique id of event(-series)'),
2013
			'cal_owner' => array('type' => 'int','precision' => '4','nullable' => False,'comment' => 'event owner / calendar'),
2014
			'cal_category' => array('type' => 'varchar','precision' => '30','comment' => 'category id'),
2015
			'cal_modified' => array('type' => 'int','precision' => '8','comment' => 'ts of last modification'),
2016
			'cal_priority' => array('type' => 'int','precision' => '2','nullable' => False,'default' => '2'),
2017
			'cal_public' => array('type' => 'int','precision' => '2','nullable' => False,'default' => '1','comment' => '1=public, 0=private event'),
2018
			'cal_title' => array('type' => 'varchar','precision' => '255','nullable' => False,'default' => '1'),
2019
			'cal_description' => array('type' => 'text'),
2020
			'cal_location' => array('type' => 'varchar','precision' => '255'),
2021
			'cal_reference' => array('type' => 'int','precision' => '4','nullable' => False,'default' => '0','comment' => 'cal_id of series for exception'),
2022
			'cal_modifier' => array('type' => 'int','precision' => '4','comment' => 'user who last modified event'),
2023
			'cal_non_blocking' => array('type' => 'int','precision' => '2','default' => '0','comment' => '1 for non-blocking events'),
2024
			'cal_special' => array('type' => 'int','precision' => '2','default' => '0'),
2025
			'cal_etag' => array('type' => 'int','precision' => '4','default' => '0','comment' => 'etag for optimistic locking'),
2026
			'cal_creator' => array('type' => 'int','precision' => '4','nullable' => False,'comment' => 'creating user'),
2027
			'cal_created' => array('type' => 'int','precision' => '8','nullable' => False,'comment' => 'creation time of event'),
2028
			'cal_recurrence' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0','comment' => 'cal_start of original recurrence for exception'),
2029
			'tz_id' => array('type' => 'int','precision' => '4','comment' => 'key into egw_cal_timezones'),
2030
			'cal_deleted' => array('type' => 'int','precision' => '8','comment' => 'ts when event was deleted')
2031
		),
2032
		'pk' => array('cal_id'),
2033
		'fk' => array(),
2034
		'ix' => array('cal_uid','cal_owner','cal_deleted'),
2035
		'uc' => array()
2036
	),array(
2037
		// for deleted rows use cal_modified as deleted date, NULL for not deleted ones
2038
		'cal_deleted' => 'CASE cal_deleted WHEN '.$GLOBALS['egw_setup']->db->quote(true,'bool').' THEN cal_modified ELSE NULL END',
2039
	));
2040
2041
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.9.002';
2042
}
2043
2044
2045
/**
2046
 * Add column to store CalDAV name given by client
2047
 */
2048
function calendar_upgrade1_9_002()
2049
{
2050
	$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal','caldav_name',array(
2051
		'type' => 'varchar',
2052
		'precision' => '64',
2053
		'comment' => 'name part of CalDAV URL, if specified by client'
2054
	));
2055
	$GLOBALS['egw_setup']->db->query($sql='UPDATE egw_cal SET caldav_name='.
2056
		$GLOBALS['egw_setup']->db->concat(
2057
			$GLOBALS['egw_setup']->db->to_varchar('cal_id'),"'.ics'"),__LINE__,__FILE__);
2058
2059
	$GLOBALS['egw_setup']->oProc->CreateIndex('egw_cal','caldav_name');
2060
2061
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.9.003';
2062
}
2063
2064
2065
/**
2066
 * Add index for cal_modified and cal_user_modified to improve ctag and etag generation on big installtions
2067
 */
2068 View Code Duplication
function calendar_upgrade1_9_003()
2069
{
2070
	$GLOBALS['egw_setup']->oProc->CreateIndex('egw_cal','cal_modified');
2071
	$GLOBALS['egw_setup']->oProc->CreateIndex('egw_cal_user','cal_user_modified');
2072
2073
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.9.004';
2074
}
2075
2076
/**
2077
 * Store exceptions as flag in egw_cal_dates.recur_exception, instead of egw_cal_repleats.recur_exception
2078
 *
2079
 * Keeps information of original start in egw_cal_dates (if first recurrance got deleted) and allows for unlimited number of exceptions.
2080
 */
2081
function calendar_upgrade1_9_004()
2082
{
2083
	$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal_dates','recur_exception',array(
2084
		'type' => 'bool',
2085
		'default' => '',
2086
		'null' => false,
2087
		'comment' => 'date is an exception'
2088
	));
2089
2090
	// migrate existing exceptions to egw_cal_dates
2091
	foreach($GLOBALS['egw_setup']->db->select('egw_cal_repeats',
2092
		'egw_cal_repeats.cal_id AS cal_id,egw_cal_repeats.recur_exception AS recur_exception,MIN(cal_start) AS cal_start,MIN(cal_end) AS cal_end',
2093
		'egw_cal_repeats.recur_exception IS NOT NULL', __LINE__, __FILE__, false,
2094
		'GROUP BY egw_cal_repeats.cal_id,egw_cal_repeats.recur_exception', 'calendar', '',
2095
		'JOIN egw_cal_dates ON egw_cal_repeats.cal_id=egw_cal_dates.cal_id') as $row)
2096
	{
2097
		foreach($row['recur_exception'] ? array_unique(explode(',', $row['recur_exception'])) : array() as $recur_exception)
2098
		{
2099
			$GLOBALS['egw_setup']->db->insert('egw_cal_dates', array(
2100
				'cal_end' => $recur_exception+$row['cal_end']-$row['cal_start'],
2101
				'recur_exception' => true,
2102
			), array(
2103
				'cal_id' => $row['cal_id'],
2104
				'cal_start' => $recur_exception,
2105
			), __LINE__, __FILE__, 'calendar');
2106
		}
2107
	}
2108
	$GLOBALS['egw_setup']->oProc->CreateIndex('egw_cal_dates', array('recur_exception', 'cal_id'));
2109
2110
	$GLOBALS['egw_setup']->oProc->DropColumn('egw_cal_repeats', array(
2111
		'fd' => array(
2112
			'cal_id' => array('type' => 'int','precision' => '4','nullable' => False),
2113
			'recur_type' => array('type' => 'int','precision' => '2','nullable' => False),
2114
			'recur_enddate' => array('type' => 'int','precision' => '8'),
2115
			'recur_interval' => array('type' => 'int','precision' => '2','default' => '1'),
2116
			'recur_data' => array('type' => 'int','precision' => '2','default' => '1'),
2117
		),
2118
		'pk' => array('cal_id'),
2119
		'fk' => array(),
2120
		'ix' => array(),
2121
		'uc' => array()
2122
	), 'recur_exception');
2123
2124
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.9.005';
2125
}
2126
2127
/**
2128
 * Try alter description to varchar(16384), to not force temp. tables to disk on MySQL (because of text columns)
2129
 */
2130
function calendar_upgrade1_9_005()
2131
{
2132
	// only alter description to varchar(16384), if it does NOT contain longer input and it can be stored as varchar
2133
	$max_description_length = $GLOBALS['egw']->db->query('SELECT MAX(CHAR_LENGTH(cal_description)) FROM egw_cal')->fetchColumn();
2134
	// returns NULL, if there are no rows!
2135 View Code Duplication
	if ((int)$max_description_length <= 16384 && $GLOBALS['egw_setup']->oProc->max_varchar_length >= 16384)
2136
	{
2137
		$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal','cal_description',array(
2138
			'type' => 'varchar',
2139
			'precision' => '16384'
2140
		));
2141
	}
2142
	// allow more categories
2143
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal','cal_category',array(
2144
		'type' => 'varchar',
2145
		'precision' => '64',
2146
		'comment' => 'category id(s)'
2147
	));
2148
	// remove silly default of 1
2149
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal','cal_title',array(
2150
		'type' => 'varchar',
2151
		'precision' => '255',
2152
		'nullable' => False
2153
	));
2154
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.9.006';
2155
}
2156
2157
/**
2158
 * Add range_start and range_end columns, drop egw_cal_repeats.recur_enddate columnd
2159
 */
2160
function calendar_upgrade1_9_006()
2161
{
2162
	// PostgreSQL needs temporary a nullable column, to not stall on broken events without dates!
2163
	// We add that constrain in 1.9.007, after deleting all rows with range_start=0 OR range_start IS NULL
2164
	$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal','range_start',array(
2165
		'type' => 'int',
2166
		'precision' => '8',
2167
		'comment' => 'startdate (of range)'
2168
	));
2169
	$GLOBALS['egw_setup']->db->query('UPDATE egw_cal SET range_start = (SELECT MIN(cal_start) FROM egw_cal_dates WHERE egw_cal_dates.cal_id=egw_cal.cal_id)', __LINE__, __FILE__);
2170
2171
	$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal','range_end',array(
2172
		'type' => 'int',
2173
		'precision' => '8',
2174
		'comment' => 'enddate (of range, UNTIL of RRULE)'
2175
	));
2176
	$GLOBALS['egw_setup']->db->query('UPDATE egw_cal SET range_end = (SELECT MIN(cal_end) FROM egw_cal_dates WHERE egw_cal_dates.cal_id=egw_cal.cal_id)', __LINE__, __FILE__);
2177
	$GLOBALS['egw_setup']->db->query('UPDATE egw_cal_repeats SET recur_enddate=null WHERE recur_enddate=0', __LINE__, __FILE__);
2178
	// MySQL has different syntax for updates using values from other tables ...
2179 View Code Duplication
	if ($GLOBALS['egw_setup']->db->Type == 'mysql')
2180
	{
2181
		$GLOBALS['egw_setup']->db->query('UPDATE egw_cal,egw_cal_repeats SET egw_cal.range_end=egw_cal_repeats.recur_enddate WHERE egw_cal.cal_id=egw_cal_repeats.cal_id', __LINE__, __FILE__);
2182
	}
2183
	else	// PostgreSQL, MsSQL, ...
2184
	{
2185
		$GLOBALS['egw_setup']->db->query('UPDATE egw_cal SET range_end=recur_enddate FROM egw_cal_repeats WHERE egw_cal.cal_id=egw_cal_repeats.cal_id', __LINE__, __FILE__);
2186
	}
2187
	$GLOBALS['egw_setup']->oProc->DropColumn('egw_cal_repeats',array(
2188
		'fd' => array(
2189
			'cal_id' => array('type' => 'int','precision' => '4','nullable' => False),
2190
			'recur_type' => array('type' => 'int','precision' => '2','nullable' => False),
2191
			'recur_interval' => array('type' => 'int','precision' => '2','default' => '1'),
2192
			'recur_data' => array('type' => 'int','precision' => '2','default' => '1')
2193
		),
2194
		'pk' => array('cal_id'),
2195
		'fk' => array(),
2196
		'ix' => array(),
2197
		'uc' => array()
2198
	),'recur_enddate');
2199
2200
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.9.007';
2201
}
2202
2203
/**
2204
 * Delete all broken events having range_start=0 or NULL (not a single recurrence or a broken one with cal_start=0)
2205
 *
2206
 * They are not displayed in regular calendar anyway, but might be synced to CalDAV or eSync clients.
2207
 */
2208
function calendar_upgrade1_9_007()
2209
{
2210
	foreach(array('egw_cal_repeats','egw_cal_dates','egw_cal_user','egw_cal_extra') as $table)
2211
	{
2212
		$GLOBALS['egw_setup']->db->query("DELETE FROM $table WHERE cal_id IN (SELECT cal_id FROM egw_cal WHERE range_start=0 OR range_start IS NULL)", __LINE__, __FILE__);
2213
	}
2214
	$GLOBALS['egw_setup']->db->query("DELETE FROM egw_cal WHERE range_start=0 OR range_start IS NULL", __LINE__, __FILE__);
2215
2216
	// now we can remove temporary default of 0 from range_start and set it NOT NULL
2217
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal','range_start',array(
2218
		'type' => 'int',
2219
		'precision' => '8',
2220
		'nullable' => False,
2221
		'comment' => 'startdate (of range)'
2222
	));
2223
2224
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.9.008';
2225
}
2226
2227
/**
2228
 * UPDATE cal_modified to contain maximum of cal_user_modified and current cal_modified, to get a single modification date per calendar-entry
2229
 */
2230
function calendar_upgrade1_9_008()
2231
{
2232
	$max_user_modified = 'SELECT '.$GLOBALS['egw_setup']->db->unix_timestamp('MAX(cal_user_modified)').' FROM egw_cal_user WHERE egw_cal.cal_id=egw_cal_user.cal_id';
2233
	$GLOBALS['egw_setup']->db->query("UPDATE egw_cal SET cal_modified=($max_user_modified) WHERE cal_modified < ($max_user_modified)", __LINE__, __FILE__);
2234
2235
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.9.009';
2236
}
2237
2238
/**
2239
 * Create index on egw_cal.cal_reference to speed up etag generation of recuring events
2240
 */
2241
function calendar_upgrade1_9_009()
2242
{
2243
	$GLOBALS['egw_setup']->oProc->CreateIndex('egw_cal', array('cal_reference'));
2244
2245
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.9.010';
2246
}
2247
2248
/**
2249
 * Add cal_rrule columns, drop egw_cal_repeats table
2250
 */
2251
/*function calendar_upgrade1_9_010()
2252
{
2253
	$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal','cal_rrule',array(
2254
		'type' => 'varchar',
2255
		'precision' => '255',
2256
		'comment' => 'RRULE for recuring events or NULL'
2257
	));
2258
	foreach($GLOBALS['egw_setup']->db->query('SELECT egw_cal.cal_id AS cal_id,range_start AS start,tz_tzid AS tzid,recur_type,recur_interval,recur_data FROM egw_cal_repeats JOIN egw_cal ON egw_cal.cal_id=egw_cal_repeats.cal_id LEFT JOIN egw_cal_timezones ON egw_cal.tz_id=egw_cal_timezones.tz_id', __LINE__, __FILE__) as $event)
2259
	{
2260
		if (!$event['tzid']) $event['tzid'] = Api\DateTime::$server_timezone->getName();
2261
		$rrule = calendar_rrule::event2rrule($event);
2262
		$rrule_str = '';
2263
		foreach($rrule->generate_rrule('2.0') as $name => $value)
2264
		{
2265
			$rrule_str .= ($rrule_str ? ';' : '').$name.'='.$value;
2266
		}
2267
		//error_log($rrule_str.' '.array2string($event));
2268
		$GLOBALS['egw_setup']->db->update('egw_cal', array(
2269
			'cal_rrule' => $rrule_str,
2270
		), array(
2271
			'cal_id' => $event['cal_id'],
2272
		), __LINE__, __FILE__, 'calendar');
2273
	}
2274
	$GLOBALS['egw_setup']->oProc->DropTable('egw_cal_repeats');
2275
2276
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.9.011';
2277
}
2278
*/
2279
2280
function calendar_upgrade1_9_010()
2281
{
2282
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal','caldav_name',array(
2283
		'type' => 'varchar',
2284
		'precision' => '200',
2285
		'comment' => 'name part of CalDAV URL, if specified by client'
2286
	));
2287
2288
	return $GLOBALS['setup_info']['calendar']['currentver'] = '1.9.011';
2289
}
2290
2291
function calendar_upgrade1_9_011()
2292
{
2293
	return $GLOBALS['setup_info']['calendar']['currentver'] = '14.1';
2294
}
2295
2296
/**
2297
 * Add pseudo-participants with status 'E' to all recurrence-masters of exceptions with participants not in master
2298
 *
2299
 * This allows CalDAV and eSync to find the recurring events efficient in calendars of these participants.
2300
 *
2301
 * Also fix recurring events containing a reference to an other master, created when an exception is made a recurring event.
2302
 *
2303
 * @return type
2304
 */
2305
function calendar_upgrade14_1()
2306
{
2307
	$GLOBALS['egw_setup']->db->query(
2308
"UPDATE egw_cal
2309
SET cal_reference=0,cal_recurrence=0,cal_etag=cal_etag+1,cal_modifier=0,cal_modified=".time()."
2310
WHERE cal_reference != 0 AND cal_id IN (SELECT cal_id FROM egw_cal_repeats)", __LINE__, __FILE__);
2311
2312
	foreach($GLOBALS['egw_setup']->db->query(
2313
"SELECT DISTINCT master.cal_id,egw_cal_user.cal_user_type,egw_cal_user.cal_user_id,'E' AS cal_status
2314
FROM egw_cal_user
2315
JOIN egw_cal ON egw_cal_user.cal_id=egw_cal.cal_id
2316
JOIN egw_cal master ON egw_cal.cal_reference=master.cal_id
2317
WHERE egw_cal_user.cal_recur_date=0 AND
2318
(cal_user_type,cal_user_id) NOT IN (
2319
    SELECT master_user.cal_user_type,master_user.cal_user_id
2320
    FROM egw_cal_user master_user
2321
    WHERE master_user.cal_recur_date=0 AND master_user.cal_id=master.cal_id
2322
)
2323
ORDER BY master.cal_id DESC", __LINE__, __FILE__, 0, -1, false, Api\Db::FETCH_ASSOC) as $row)
2324
	{
2325
		$GLOBALS['egw_setup']->db->insert('egw_cal_user', $row, false, __LINE__, __FILE__, 'calendar');
2326
	}
2327
	return $GLOBALS['setup_info']['calendar']['currentver'] = '14.1.001';
2328
}
2329
2330
/**
2331
 * Modify range_end of recurring events to be end-time of last recurrence (and not just a date)
2332
 *
2333
 * This fixes not found last recurrence in day-view.
2334
 *
2335
 * @return string
2336
 */
2337
function calendar_upgrade14_1_001()
2338
{
2339
	foreach($GLOBALS['egw_setup']->db->query(
2340
"SELECT egw_cal.cal_id AS cal_id,cal_start,cal_end,range_start,range_end,egw_cal_repeats.*,tz_tzid AS tzid
2341
FROM egw_cal
2342
JOIN egw_cal_repeats ON egw_cal_repeats.cal_id=egw_cal.cal_id
2343
JOIN egw_cal_dates ON egw_cal_dates.cal_id=egw_cal.cal_id AND cal_start=range_start
2344
JOIN egw_cal_timezones ON egw_cal.tz_id=egw_cal_timezones.tz_id
2345
WHERE range_end IS NOT NULL", __LINE__, __FILE__, 0, -1, false, Api\Db::FETCH_ASSOC) as $event)
2346
	{
2347
		$event = Api\Db::strip_array_keys($event, 'cal_');
2348
		$event['recur_enddate'] = $event['range_end'];
2349
		try {
2350
			$rrule = calendar_rrule::event2rrule($event, false);
2351
		}
2352
		catch (\Exception $e) {
2353
			_egw_log_exception($e);
2354
			continue;
2355
		}
2356
		$rrule->rewind();
2357
		$enddate = $rrule->current();
2358
		do
2359
		{
2360
			$rrule->next_no_exception();
2361
			$occurrence = $rrule->current();
2362
		}
2363
		while ($rrule->valid() && ($enddate = $occurrence));
2364
		$enddate->modify(($event['end'] - $event['start']).' second');
2365
		if (($range_end = $enddate->format('server')) != $event['range_end'])
2366
		{
2367
			$GLOBALS['egw_setup']->db->update('egw_cal',array(
2368
				'range_end' => $range_end,
2369
				'cal_etag=cal_etag+1',
2370
				'cal_modified' => time(),
2371
			), array(
2372
				'cal_id' => $event['id'],
2373
			), __LINE__, __FILE__, 'calendar');
2374
			//error_log(__FUNCTION__."() #$event[id], start=".date('Y-m-d H:i:s', $event['start']).', end='.date('Y-m-d H:i:s', $event['end']).', range_end='.date('Y-m-d H:i:s', $event['recur_enddate']).' --> '.date('Y-m-d H:i:s', $range_end));
2375
		}
2376
	}
2377
	return $GLOBALS['setup_info']['calendar']['currentver'] = '14.2.002';	// skip 14.2.001 update, as query is fixed now
2378
}
2379
2380
/**
2381
 * Partially fix from previous 14.2.001 update "ended" daily recurring events (eg. birthdays)
2382
 *
2383
 * Idea is to find time where most yearly recuring events were modified from above update.
2384
 * Then we set all yearly recuring events modified 1s around that time to unlimited again.
2385
 *
2386
 * @return string
2387
 */
2388
function calendar_upgrade14_2_001()
2389
{
2390
	// get modification time (in seconds) with maximum count of modified yearly recuring events
2391
	$values = $GLOBALS['egw_setup']->db->query("SELECT cal_modified, COUNT(*)
2392
FROM egw_cal
2393
JOIN egw_cal_repeats ON egw_cal.cal_id=egw_cal_repeats.cal_id
2394
WHERE recur_type=5 AND range_end IS NOT NULL
2395
GROUP BY cal_modified
2396
ORDER BY count(*) DESC", __LINE__, __FILE__, 0, 1)->fetch();
2397
2398
	// if maximum is bigger then 3
2399
	if ($values[1] > 3)
2400
	{
2401 View Code Duplication
		switch($GLOBALS['egw_setup']->db->Type)
2402
		{
2403
			case 'mysql':
2404
				$sql = "UPDATE egw_cal
2405
JOIN egw_cal_repeats ON egw_cal.cal_id=egw_cal_repeats.cal_id
2406
SET range_end=NULL
2407
WHERE recur_type=5 AND range_end IS NOT NULL AND ABS(cal_modified-$values[0])<=1";
2408
				break;
2409
			case 'pgsql':
2410
				$sql = "UPDATE egw_cal
2411
SET range_end=NULL
2412
FROM egw_cal AS cal
2413
JOIN egw_cal_repeats ON cal.cal_id=egw_cal_repeats.cal_id
2414
WHERE recur_type=5 AND cal.range_end IS NOT NULL AND ABS(cal.cal_modified-$values[0])<=1";
2415
				break;
2416
		}
2417
		if (isset($sql))
2418
		{
2419
			$GLOBALS['egw_setup']->db->query($sql, __LINE__, __FILE__);
2420
2421
			if (($num = $GLOBALS['egw_setup']->db->affected_rows()))
2422
			{
2423
				error_log(__METHOD__."() removed end-date from $num yearly recuring events again.");
2424
			}
2425
		}
2426
	}
2427
	return $GLOBALS['setup_info']['calendar']['currentver'] = '14.2.002';
2428
}
2429
2430
/**
2431
 * Fix wrong date for 2016 DE holiday Fronleichnam
2432
 *
2433
 * @return string
2434
 */
2435
function calendar_upgrade14_2_002()
2436
{
2437
	$GLOBALS['egw_setup']->db->query("UPDATE egw_cal_holidays SET hol_mday=26,hol_month_num=5".
2438
		" WHERE hol_locale='DE' AND hol_name='Fronleichnam' AND hol_occurence=2016",
2439
		__LINE__, __FILE__, 'calendar');
2440
2441
	return $GLOBALS['setup_info']['calendar']['currentver'] = '14.2.003';
2442
}
2443
2444
function calendar_upgrade14_2_003()
2445
{
2446
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal','cal_uid',array(
2447
		'type' => 'ascii',
2448
		'precision' => '128',
2449
		'nullable' => False,
2450
		'comment' => 'unique id of event(-series)'
2451
	));
2452
	// remove all category values, which are not comma-separated nummerical ids
2453
	// as they might give an SQL error and wont work anyway
2454
	if ($GLOBALS['egw_setup']->db->Type == 'mysql')
2455
	{
2456
		$GLOBALS['egw_setup']->db->query("UPDATE egw_cal SET cal_category='' WHERE cal_category NOT REGEXP '^[0-9,]*$'", __LINE__, __FILE__);
2457
	}
2458
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal','cal_category',array(
2459
		'type' => 'ascii',
2460
		'meta' => 'category',
2461
		'precision' => '64',
2462
		'comment' => 'category id(s)'
2463
	));
2464
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal','caldav_name',array(
2465
		'type' => 'ascii',
2466
		'precision' => '128',
2467
		'comment' => 'name part of CalDAV URL, if specified by client'
2468
	));
2469
2470
	return $GLOBALS['setup_info']['calendar']['currentver'] = '14.2.004';
2471
}
2472
2473
2474
function calendar_upgrade14_2_004()
2475
{
2476
	/* done by RefreshTable() anyway
2477
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_user','cal_recur_date',array(
2478
		'type' => 'int',
2479
		'meta' => 'timestamp',
2480
		'precision' => '8',
2481
		'nullable' => False,
2482
		'default' => '0'
2483
	));*/
2484
	/* done by RefreshTable() anyway
2485
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_user','cal_user_type',array(
2486
		'type' => 'ascii',
2487
		'precision' => '1',
2488
		'nullable' => False,
2489
		'default' => 'u',
2490
		'comment' => 'u=user, g=group, c=contact, r=resource, e=email'
2491
	));*/
2492
	/* done by RefreshTable() anyway
2493
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_user','cal_user_id',array(
2494
		'type' => 'ascii',
2495
		'meta' => array(
2496
			"cal_user_type='u'" => 'account'
2497
		),
2498
		'precision' => '128',
2499
		'nullable' => False,
2500
		'comment' => 'id or email-address for type=e'
2501
	));*/
2502
	/* done by RefreshTable() anyway
2503
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_user','cal_status',array(
2504
		'type' => 'ascii',
2505
		'precision' => '1',
2506
		'default' => 'A',
2507
		'comment' => 'U=unknown, A=accepted, R=rejected, T=tentative'
2508
	));*/
2509
	/* done by RefreshTable() anyway
2510
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_user','cal_role',array(
2511
		'type' => 'ascii',
2512
		'precision' => '64',
2513
		'default' => 'REQ-PARTICIPANT',
2514
		'comment' => 'CHAIR, REQ-PARTICIPANT, OPT-PARTICIPANT, NON-PARTICIPANT, X-CAT-$cat_id'
2515
	));*/
2516
	/* done by RefreshTable() anyway
2517
	$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal_user','cal_user_auto',array(
2518
		'type' => 'auto',
2519
		'nullable' => False
2520
	));*/
2521
	$GLOBALS['egw_setup']->oProc->RefreshTable('egw_cal_user',array(
2522
		'fd' => array(
2523
			'cal_id' => array('type' => 'int','precision' => '4','nullable' => False),
2524
			'cal_recur_date' => array('type' => 'int','meta' => 'timestamp','precision' => '8','nullable' => False,'default' => '0'),
2525
			'cal_user_type' => array('type' => 'ascii','precision' => '1','nullable' => False,'default' => 'u','comment' => 'u=user, g=group, c=contact, r=resource, e=email'),
2526
			'cal_user_id' => array('type' => 'varchar','meta' => array("cal_user_type='u'" => 'account'),'precision' => '128','nullable' => False,'comment' => 'id or email-address for type=e'),
2527
			'cal_status' => array('type' => 'ascii','precision' => '1','default' => 'A','comment' => 'U=unknown, A=accepted, R=rejected, T=tentative'),
2528
			'cal_quantity' => array('type' => 'int','precision' => '4','default' => '1','comment' => 'only for certain types (eg. resources)'),
2529
			'cal_role' => array('type' => 'ascii','precision' => '64','default' => 'REQ-PARTICIPANT','comment' => 'CHAIR, REQ-PARTICIPANT, OPT-PARTICIPANT, NON-PARTICIPANT, X-CAT-$cat_id'),
2530
			'cal_user_modified' => array('type' => 'timestamp','default' => 'current_timestamp','comment' => 'automatic timestamp of last update'),
2531
			'cal_user_auto' => array('type' => 'auto','nullable' => False)
2532
		),
2533
		'pk' => array('cal_user_auto'),
2534
		'fk' => array(),
2535
		'ix' => array('cal_user_modified',array('cal_user_type','cal_user_id')),
2536
		'uc' => array(array('cal_id','cal_recur_date','cal_user_type','cal_user_id'))
2537
	));
2538
2539
	return $GLOBALS['setup_info']['calendar']['currentver'] = '14.2.005';
2540
}
2541
2542
2543
function calendar_upgrade14_2_005()
2544
{
2545
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_timezones','tz_tzid',array(
2546
		'type' => 'ascii',
2547
		'precision' => '128',
2548
		'nullable' => False
2549
	));
2550
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_timezones','tz_component',array(
2551
		'type' => 'ascii',
2552
		'precision' => '8192',
2553
		'comment' => 'iCal VTIMEZONE component'
2554
	));
2555
2556
	return $GLOBALS['setup_info']['calendar']['currentver'] = '14.3';
2557
}
2558
2559
/**
2560
 * Store md5 of lowercased raw email-address as cal_user_id to only have a short ascii column for indexes and full rfc822 email in cal_user_attendee
2561
 *
2562
 * @return string
2563
 */
2564
function calendar_upgrade14_3()
2565
{
2566
	$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal_user','cal_user_attendee',array(
2567
		'type' => 'varchar',
2568
		'precision' => '255',
2569
		'comment' => 'email or json object with attr. cn, url, ...'
2570
	));
2571
	$email = "TRIM(LOWER(CASE SUBSTR(cal_user_id, -1, 1) WHEN '>' THEN SUBSTR(cal_user_id, 1+".
2572
		$GLOBALS['egw_setup']->db->strpos("cal_user_id", "'<'").", CHAR_LENGTH(cal_user_id)-".
2573
		$GLOBALS['egw_setup']->db->strpos("cal_user_id", "'<'")."-1) ELSE cal_user_id END))";
2574
2575
	// delete all but one row, which would give a doublicate key, after above normalising of email addresses
2576
	// by ordering by status we prever accepted over tentative over unknow over deleted
2577
	foreach($GLOBALS['egw_setup']->db->select('egw_cal_user', "cal_id,cal_recur_date,$email AS email", array(
2578
		'cal_user_type' => 'e',
2579
	), __LINE__, __FILE__, false, "GROUP BY cal_id,cal_recur_date,$email HAVING COUNT(*)>1", 'calendar') as $row)
2580
	{
2581
		$n = 0;
2582
		foreach($GLOBALS['egw_setup']->db->select('egw_cal_user', "*,$email AS email", array(
2583
			'cal_id' => $row['cal_id'],
2584
			'cal_recur_date' => $row['cal_recur_date'],
2585
			'cal_user_type' => 'e',
2586
			$email.'='.$GLOBALS['egw_setup']->db->quote($row['email']),
2587
		), __LINE__, __FILE__, false, 'ORDER BY cal_status', 'calendar') as $user)	// order A, T, U, X
2588
		{
2589
			if (strpos($user['email'], '@') !== false && !$n++) continue;
2590
			$GLOBALS['egw_setup']->db->delete('egw_cal_user',
2591
				array_intersect_key($user, array_flip(array('cal_id','cal_recur_date','cal_user_type','cal_user_id','cal_status'))),
2592
				__LINE__, __FILE__, 'calendar');
2593
		}
2594
	}
2595
2596
	// store only md5 of normalized email to always fit in 32 ascii chars (and allow non-ascii email)
2597
	$GLOBALS['egw_setup']->db->query(
2598
		"UPDATE egw_cal_user SET cal_user_attendee=cal_user_id,cal_user_id=MD5($email) WHERE cal_user_type='e'",
2599
		__LINE__, __FILE__);
2600
2601
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_user','cal_user_id',array(
2602
		'type' => 'ascii',
2603
		'meta' => array(
2604
			"cal_user_type='u'" => 'account'
2605
		),
2606
		'precision' => '32',
2607
		'nullable' => False,
2608
		'comment' => 'id or md5(email-address) for type=e'
2609
	));
2610
2611
	return $GLOBALS['setup_info']['calendar']['currentver'] = '14.3.001';
2612
}
2613
2614
/**
2615
 * Fix NULL in egw_cal_user.cal_user_attendee for recurrences by using value from master (cal_recur_date=0)
2616
 *
2617
 * @return string
2618
 */
2619
function calendar_upgrade14_3_001()
2620
{
2621
	$GLOBALS['calendar_upgrade14_3_001-run'] = true;
2622
2623
	foreach($GLOBALS['egw_setup']->db->query("SELECT egw_cal_user.cal_id AS cal_id,egw_cal_user.cal_user_id AS cal_user_id,egw_cal_user.cal_user_attendee AS cal_user_attendee
2624
FROM egw_cal_user
2625
JOIN egw_cal_user euser ON euser.cal_id=egw_cal_user.cal_id AND euser.cal_user_type='e' AND euser.cal_user_id=egw_cal_user.cal_user_id AND euser.cal_user_attendee IS NULL
2626
WHERE egw_cal_user.cal_user_type='e' AND egw_cal_user.cal_user_attendee IS NOT NULL
2627
GROUP BY egw_cal_user.cal_id,egw_cal_user.cal_user_id,egw_cal_user.cal_user_attendee", __LINE__, __FILE__) as $row)
2628
	{
2629
		$GLOBALS['egw_setup']->db->update('egw_cal_user', array(
2630
			'cal_user_attendee' => $row['cal_user_attendee'],
2631
		), array(
2632
			'cal_id' => $row['cal_id'],
2633
			'cal_user_type' => 'e',
2634
			'cal_user_id' => $row['cal_user_id'],
2635
			'cal_user_attendee IS NULL'
2636
		), __LINE__, __FILE__, 'calendar');
2637
	}
2638
	return $GLOBALS['setup_info']['calendar']['currentver'] = '14.3.002';
2639
}
2640
2641
/**
2642
 * Setting new index url from setup.inc.php
2643
 *
2644
 * @return string
2645
 */
2646
function calendar_upgrade14_3_002()
2647
{
2648
	return $GLOBALS['setup_info']['calendar']['currentver'] = '14.3.900';
2649
}
2650
2651
/**
2652
 * Setting new index url from setup.inc.php
2653
 *
2654
 * @return string
2655
 */
2656
function calendar_upgrade14_3_900()
2657
{
2658
	if (empty($GLOBALS['calendar_upgrade14_3_001-run']))
2659
	{
2660
		calendar_upgrade14_3_001();
2661
	}
2662
	return $GLOBALS['setup_info']['calendar']['currentver'] = '14.3.901';
2663
}
2664
2665
/**
2666
 * Remove dates from favorites
2667
 *
2668
 * @return string New version number
2669
 */
2670
function calendar_upgrade14_3_901()
2671
{
2672
	Api\Preferences::change_preference('calendar', '/^favorite_/', function($attr, $old_value, $owner)
2673
	{
2674
		unset($attr, $owner);	// not used, but required by function signature
2675
		if($old_value['state'] && is_array($old_value['state']))
2676
		{
2677
			unset($old_value['state']['date']);
2678
			unset($old_value['state']['startdate']);
2679
			unset($old_value['state']['start_date']);
2680
			unset($old_value['state']['enddate']);
2681
			unset($old_value['state']['end_date']);
2682
		}
2683
		return $old_value;
2684
	});
2685
	return $GLOBALS['setup_info']['calendar']['currentver'] = '14.3.902';
2686
}
2687
2688
/**
2689
 * Change grid/list preference values to list each view
2690
 */
2691
function calendar_upgrade14_3_902()
2692
{
2693
	Api\Preferences::change_preference('calendar', 'use_time_grid', function($attr, $old_value, $owner)
2694
	{
2695
		unset($attr, $owner);	// not used, but required by function signature
2696
		switch($old_value)
2697
		{
2698
			case 'all':
2699
				return 0;
2700
			case 'day_week':
2701
				return ['day','day4','week'];
2702
			case 'day4':
2703
				return ['day','day4'];
2704
		}
2705
		return null;
2706
	});
2707
	return $GLOBALS['setup_info']['calendar']['currentver'] = '14.3.903';
2708
}
2709
2710
2711
function calendar_upgrade14_3_903()
2712
{
2713
	return $GLOBALS['setup_info']['calendar']['currentver'] = '16.1';
2714
}
2715
2716
2717
function calendar_upgrade16_1()
2718
{
2719
	$GLOBALS['egw_setup']->oProc->DropTable('egw_cal_holidays');
2720
2721
	return $GLOBALS['setup_info']['calendar']['currentver'] = '16.1.001';
2722
}
2723
2724
2725
function calendar_upgrade16_1_001()
2726
{
2727
	$GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_extra', 'cal_extra_value',
2728
		array('type' => 'varchar','meta' => 'cfvalue','precision' => '16384','nullable' => False,'default' => ''));
2729
2730
	Api\Preferences::change_preference('calendar', 'defaultresource_sel', 'resources', 'addressbook', 'forced');
2731
	Api\Preferences::change_preference('calendar', 'defaultresource_sel', 'resources', 'addressbook', 'default');
2732
2733
	return $GLOBALS['setup_info']['calendar']['currentver'] = '16.1.002';
2734
}
2735
2736
function calendar_upgrade16_1_002()
2737
{
2738
	// Explicitly add months as showing list of events, no times
2739
	$change = function($attr, $old_value, $owner) {
2740
		if($owner == Api\Preferences::FORCED_ID) return;
2741
		if(is_array($old_value) && !in_array('month', $old_value))
2742
		{
2743
			$old_value[] = 'month';
2744
		}
2745
		else if (strpos($old_value, 'month') === FALSE)
2746
		{
2747
			return $old_value ? $old_value.',month' : 'month';
2748
		}
2749
	};
2750
	Api\Preferences::change_preference('calendar', 'use_time_grid', $change);
2751
	return $GLOBALS['setup_info']['calendar']['currentver'] = '16.1.003';
2752
}