calendar_upgrade0_9_10pre25()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 0
dl 0
loc 4
rs 10
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
 */
10
11
use EGroupware\Api;
12
13
function calendar_v0_9_2to0_9_3update_owner($table, $field)
14
{
15
	$GLOBALS['egw_setup']->oProc->query("select distinct($field) from $table");
16
	if ($GLOBALS['egw_setup']->oProc->num_rows())
17
	{
18
		while ($GLOBALS['egw_setup']->oProc->next_record())
19
		{
20
			$owner[count($owner)] = $GLOBALS['egw_setup']->oProc->f($field);
21
		}
22
		if($GLOBALS['egw_setup']->alessthanb($GLOBALS['setup_info']['phpgwapi']['currentver'],'0.9.10pre4'))
23
		{
24
			$acctstbl = 'accounts';
25
		}
26
		else
27
		{
28
			$acctstbl = 'phpgw_accounts';
29
		}
30
		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...
31
		{
32
			$GLOBALS['egw_setup']->oProc->query("SELECT account_id FROM $acctstbl WHERE account_lid='".$owner[$i]."'");
33
			$GLOBALS['egw_setup']->oProc->next_record();
34
			$GLOBALS['egw_setup']->oProc->query("UPDATE $table SET $field=".$GLOBALS['egw_setup']->oProc->f('account_id')." WHERE $field='".$owner[$i]."'");
35
		}
36
	}
37
	$GLOBALS['egw_setup']->oProc->AlterColumn($table, $field, array('type' => 'int', 'precision' => 4, 'nullable' => false, 'default' => 0));
38
}
39
40
41
function calendar_upgrade0_9_3pre1()
42
{
43
	calendar_v0_9_2to0_9_3update_owner('webcal_entry','cal_create_by');
44
	calendar_v0_9_2to0_9_3update_owner('webcal_entry_user','cal_login');
45
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre2';
46
	return $GLOBALS['setup_info']['calendar']['currentver'];
47
}
48
49
50
function calendar_upgrade0_9_3pre2()
51
{
52
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre3';
53
	return $GLOBALS['setup_info']['calendar']['currentver'];
54
}
55
56
57
function calendar_upgrade0_9_3pre3()
58
{
59
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre4';
60
	return $GLOBALS['setup_info']['calendar']['currentver'];
61
}
62
63
64
function calendar_upgrade0_9_3pre4()
65
{
66
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre5';
67
	return $GLOBALS['setup_info']['calendar']['currentver'];
68
}
69
70
71
function calendar_upgrade0_9_3pre5()
72
{
73
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre6';
74
	return $GLOBALS['setup_info']['calendar']['currentver'];
75
}
76
77
78
function calendar_upgrade0_9_3pre6()
79
{
80
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre7';
81
	return $GLOBALS['setup_info']['calendar']['currentver'];
82
}
83
84
85
function calendar_upgrade0_9_3pre7()
86
{
87
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre8';
88
	return $GLOBALS['setup_info']['calendar']['currentver'];
89
}
90
91
92
function calendar_upgrade0_9_3pre8()
93
{
94
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre9';
95
	return $GLOBALS['setup_info']['calendar']['currentver'];
96
}
97
98
99
function calendar_upgrade0_9_3pre9()
100
{
101
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre10';
102
	return $GLOBALS['setup_info']['calendar']['currentver'];
103
}
104
105
106
function calendar_upgrade0_9_3pre10()
107
{
108
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3';
109
	return $GLOBALS['setup_info']['calendar']['currentver'];
110
}
111
112
113
function calendar_upgrade0_9_3()
114
{
115
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.4pre1';
116
	return $GLOBALS['setup_info']['calendar']['currentver'];
117
}
118
119
120
function calendar_upgrade0_9_4pre1()
121
{
122
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.4pre2';
123
	return $GLOBALS['setup_info']['calendar']['currentver'];
124
}
125
126
127
function calendar_upgrade0_9_4pre2()
128
{
129
	$GLOBALS['egw_setup']->oProc->RenameColumn('webcal_entry', 'cal_create_by', 'cal_owner');
130
	$GLOBALS['egw_setup']->oProc->AlterColumn('webcal_entry', 'cal_owner', array('type' => 'int', 'precision' => 4, 'nullable' => false));
131
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.4pre3';
132
	return $GLOBALS['setup_info']['calendar']['currentver'];
133
}
134
135
136
function calendar_upgrade0_9_4pre3()
137
{
138
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.4pre4';
139
	return $GLOBALS['setup_info']['calendar']['currentver'];
140
}
141
142
function calendar_upgrade0_9_4pre4()
143
{
144
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.4pre5';
145
	return $GLOBALS['setup_info']['calendar']['currentver'];
146
}
147
148
function calendar_upgrade0_9_4pre5()
149
{
150
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.4';
151
	return $GLOBALS['setup_info']['calendar']['currentver'];
152
}
153
154
function calendar_upgrade0_9_4()
155
{
156
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.5pre1';
157
	return $GLOBALS['setup_info']['calendar']['currentver'];
158
}
159
160
function calendar_upgrade0_9_5pre1()
161
{
162
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.5pre2';
163
	return $GLOBALS['setup_info']['calendar']['currentver'];
164
}
165
166
function calendar_upgrade0_9_5pre2()
167
{
168
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.5pre3';
169
	return $GLOBALS['setup_info']['calendar']['currentver'];
170
}
171
172
function calendar_upgrade0_9_5()
173
{
174
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.6';
175
	return $GLOBALS['setup_info']['calendar']['currentver'];
176
}
177
178
function calendar_upgrade0_9_6()
179
{
180
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.7pre1';
181
	return $GLOBALS['setup_info']['calendar']['currentver'];
182
}
183
184
185
function calendar_upgrade0_9_7pre1()
186
{
187
	$db2 = clone($GLOBALS['egw_setup']->db);
188
189
	$GLOBALS['egw_setup']->oProc->CreateTable('calendar_entry',
190
		Array(
191
			'fd' => array(
192
				'cal_id' => array('type' => 'auto', 'nullable' => false),
193
				'cal_owner' => array('type' => 'int', 'precision' => 4, 'nullable' => false, 'default' => '0'),
194
				'cal_group' => array('type' => 'varchar', 'precision' => 255),
195
				'cal_datetime' => array('type' => 'int', 'precision' => 4),
196
				'cal_mdatetime' => array('type' => 'int', 'precision' => 4),
197
				'cal_duration' => array('type' => 'int', 'precision' => 4, 'nullable' => false, 'default' => '0'),
198
				'cal_priority' => array('type' => 'int', 'precision' => 4, 'nullable' => false, 'default' => '2'),
199
				'cal_type' => array('type' => 'varchar', 'precision' => 10),
200
				'cal_access' => array('type' => 'varchar', 'precision' => 10),
201
				'cal_name' => array('type' => 'varchar', 'precision' => 80, 'nullable' => false),
202
				'cal_description' => array('type' => 'text')
203
			),
204
			'pk' => array("cal_id"),
205
			'ix' => array(),
206
			'fk' => array(),
207
			'uc' => array()
208
		)
209
	);
210
211
	$GLOBALS['egw_setup']->oProc->query('SELECT count(*) FROM webcal_entry',__LINE__,__FILE__);
212
	$GLOBALS['egw_setup']->oProc->next_record();
213
	if($GLOBALS['egw_setup']->oProc->f(0))
214
	{
215
		$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__);
216
		while($GLOBALS['egw_setup']->oProc->next_record())
217
		{
218
			$cal_id = $GLOBALS['egw_setup']->oProc->f('cal_id');
219
			$cal_owner = $GLOBALS['egw_setup']->oProc->f('cal_owner');
220
			$cal_duration = $GLOBALS['egw_setup']->oProc->f('cal_duration');
221
			$cal_priority = $GLOBALS['egw_setup']->oProc->f('cal_priority');
222
			$cal_type = $GLOBALS['egw_setup']->oProc->f('cal_type');
223
			$cal_access = $GLOBALS['egw_setup']->oProc->f('cal_access');
224
			$cal_name = $GLOBALS['egw_setup']->oProc->f('cal_name');
225
			$cal_description = $GLOBALS['egw_setup']->oProc->f('cal_description');
226
			$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)));
227
			$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)));
228
			$db2->query('SELECT groups FROM webcal_entry_groups WHERE cal_id='.$cal_id,__LINE__,__FILE__);
229
			$db2->next_record();
230
			$cal_group = $db2->f('groups');
231
			$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) '
232
				.'VALUES('.$cal_id.",'".$cal_owner."','".$cal_group."',".$datetime.",".$moddatetime.",".$cal_duration.",".$cal_priority.",'".$cal_type."','".$cal_access."','".$cal_name."','".$cal_description."')",__LINE__,__FILE__);
233
		}
234
	}
235
236
	$GLOBALS['egw_setup']->oProc->DropTable('webcal_entry_groups');
237
	$GLOBALS['egw_setup']->oProc->DropTable('webcal_entry');
238
239
	$GLOBALS['egw_setup']->oProc->CreateTable('calendar_entry_user',
240
		Array(
241
			'fd' => array(
242
				'cal_id' => array('type' => 'int', 'precision' => 4, 'nullable' => false, 'default' => '0'),
243
				'cal_login' => array('type' => 'int', 'precision' => 4, 'nullable' => false, 'default' => '0'),
244
				'cal_status' => array('type' => 'char', 'precision' => 1, 'default' => 'A')
245
			),
246
			'pk' => array('cal_id', 'cal_login'),
247
			'ix' => array(),
248
			'fk' => array(),
249
			'uc' => array()
250
		)
251
	);
252
253
	$GLOBALS['egw_setup']->oProc->query('SELECT count(*) FROM webcal_entry_user',__LINE__,__FILE__);
254
	$GLOBALS['egw_setup']->oProc->next_record();
255
	if($GLOBALS['egw_setup']->oProc->f(0))
256
	{
257
		$GLOBALS['egw_setup']->oProc->query('SELECT cal_id,cal_login,cal_status FROM webcal_entry_user ORDER BY cal_id',__LINE__,__FILE__);
258
		while($GLOBALS['egw_setup']->oProc->next_record())
259
		{
260
			$cal_id = $GLOBALS['egw_setup']->oProc->f('cal_id');
261
			$cal_login = $GLOBALS['egw_setup']->oProc->f('cal_login');
262
			$cal_status = $GLOBALS['egw_setup']->oProc->f('cal_status');
263
			$db2->query('INSERT INTO calendar_entry_user(cal_id,cal_login,cal_status) VALUES('.$cal_id.','.$cal_login.",'".$cal_status."')",__LINE__,__FILE__);
264
		}
265
	}
266
267
	$GLOBALS['egw_setup']->oProc->DropTable('webcal_entry_user');
268
269
	$GLOBALS['egw_setup']->oProc->CreateTable('calendar_entry_repeats',
270
		Array(
271
			'fd' => array(
272
				'cal_id' => array('type' => 'int', 'precision' => 4, 'default' => '0', 'nullable' => false),
273
				'cal_type' => array('type' => 'varchar', 'precision' => 20, 'default' => 'daily', 'nullable' => false),
274
				'cal_use_end' => array('type' => 'int', 'precision' => 4, 'default' => '0'),
275
				'cal_end' => array('type' => 'int', 'precision' => 4),
276
				'cal_frequency' => array('type' => 'int', 'precision' => 4, 'default' => '1'),
277
				'cal_days' => array('type' => 'char', 'precision' => 7)
278
			),
279
			'pk' => array(),
280
			'ix' => array(),
281
			'fk' => array(),
282
			'uc' => array()
283
		)
284
	);
285
286
	$GLOBALS['egw_setup']->oProc->query('SELECT count(*) FROM webcal_entry_repeats',__LINE__,__FILE__);
287
	$GLOBALS['egw_setup']->oProc->next_record();
288
	if($GLOBALS['egw_setup']->oProc->f(0))
289
	{
290
		$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__);
291
		while($GLOBALS['egw_setup']->oProc->next_record())
292
		{
293
			$cal_id = $GLOBALS['egw_setup']->oProc->f('cal_id');
294
			$cal_type = $GLOBALS['egw_setup']->oProc->f('cal_type');
295
			if(isset($GLOBALS['egw_setup']->oProc->Record['cal_end']))
296
			{
297
				$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)));
298
				$useend = 1;
299
			}
300
			else
301
			{
302
				$enddate = 0;
303
				$useend = 0;
304
			}
305
			$cal_frequency = $GLOBALS['egw_setup']->oProc->f('cal_frequency');
306
			$cal_days = $GLOBALS['egw_setup']->oProc->f('cal_days');
307
			$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__);
308
		}
309
	}
310
311
	$GLOBALS['egw_setup']->oProc->DropTable('webcal_entry_repeats');
312
	$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__);
313
314
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.7pre2';
315
	return $GLOBALS['setup_info']['calendar']['currentver'];
316
}
317
318
319
function calendar_upgrade0_9_7pre2()
320
{
321
	$db2 = $GLOBALS['egw_setup']->db;
322
323
	$GLOBALS['egw_setup']->oProc->RenameColumn('calendar_entry', 'cal_duration', 'cal_edatetime');
324
	$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__);
325
	if($GLOBALS['egw_setup']->oProc->num_rows())
326
	{
327
		while($GLOBALS['egw_setup']->oProc->next_record())
328
		{
329
			$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__);
330
			$db2->next_record();
331
			$tz = $db2->f('preference_value');
332
			$cal_id = $GLOBALS['egw_setup']->oProc->f('cal_id');
333
			$datetime = $GLOBALS['egw_setup']->oProc->f('cal_datetime') - ((60 * 60) * $tz);
334
			$mdatetime = $GLOBALS['egw_setup']->oProc->f('cal_mdatetime') - ((60 * 60) * $tz);
335
			$edatetime = $datetime + (60 * $GLOBALS['egw_setup']->oProc->f('cal_edatetime'));
336
			$db2->query('UPDATE calendar_entry SET cal_datetime='.$datetime.', cal_edatetime='.$edatetime.', cal_mdatetime='.$mdatetime.' WHERE cal_id='.$cal_id,__LINE__,__FILE__);
337
		}
338
	}
339
340
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.7pre3';
341
	return $GLOBALS['setup_info']['calendar']['currentver'];
342
}
343
344
345
function calendar_upgrade0_9_7pre3()
346
{
347
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.7';
348
	return $GLOBALS['setup_info']['calendar']['currentver'];
349
}
350
351
function calendar_upgrade0_9_7()
352
{
353
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.8pre1';
354
	return $GLOBALS['setup_info']['calendar']['currentver'];
355
}
356
357
function calendar_upgrade0_9_8pre1()
358
{
359
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.8pre2';
360
	return $GLOBALS['setup_info']['calendar']['currentver'];
361
}
362
363
function calendar_upgrade0_9_8pre2()
364
{
365
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.8pre3';
366
	return $GLOBALS['setup_info']['calendar']['currentver'];
367
}
368
369
function calendar_upgrade0_9_8pre3()
370
{
371
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.8pre4';
372
	return $GLOBALS['setup_info']['calendar']['currentver'];
373
}
374
375
function calendar_upgrade0_9_8pre4()
376
{
377
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.8pre5';
378
	return $GLOBALS['setup_info']['calendar']['currentver'];
379
}
380
381
function calendar_upgrade0_9_8pre5()
382
{
383
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.9pre1';
384
	return $GLOBALS['setup_info']['calendar']['currentver'];
385
}
386
387
function calendar_upgrade0_9_9pre1()
388
{
389
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.9';
390
	return $GLOBALS['setup_info']['calendar']['currentver'];
391
}
392
393
function calendar_upgrade0_9_9()
394
{
395
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre1';
396
	return $GLOBALS['setup_info']['calendar']['currentver'];
397
}
398
399
function calendar_upgrade0_9_10pre1()
400
{
401
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre2';
402
	return $GLOBALS['setup_info']['calendar']['currentver'];
403
}
404
405
function calendar_upgrade0_9_10pre2()
406
{
407
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre3';
408
	return $GLOBALS['setup_info']['calendar']['currentver'];
409
}
410
411
function calendar_upgrade0_9_10pre3()
412
{
413
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre4';
414
	return $GLOBALS['setup_info']['calendar']['currentver'];
415
}
416
417
function calendar_upgrade0_9_10pre4()
418
{
419
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre5';
420
	return $GLOBALS['setup_info']['calendar']['currentver'];
421
}
422
423
function calendar_upgrade0_9_10pre5()
424
{
425
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre6';
426
	return $GLOBALS['setup_info']['calendar']['currentver'];
427
}
428
429
function calendar_upgrade0_9_10pre6()
430
{
431
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre7';
432
	return $GLOBALS['setup_info']['calendar']['currentver'];
433
}
434
435
function calendar_upgrade0_9_10pre7()
436
{
437
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre8';
438
	return $GLOBALS['setup_info']['calendar']['currentver'];
439
}
440
441
function calendar_upgrade0_9_10pre8()
442
{
443
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre9';
444
	return $GLOBALS['setup_info']['calendar']['currentver'];
445
}
446
447
function calendar_upgrade0_9_10pre9()
448
{
449
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre10';
450
	return $GLOBALS['setup_info']['calendar']['currentver'];
451
}
452
453
function calendar_upgrade0_9_10pre10()
454
{
455
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre11';
456
	return $GLOBALS['setup_info']['calendar']['currentver'];
457
}
458
459
function calendar_upgrade0_9_10pre11()
460
{
461
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre12';
462
	return $GLOBALS['setup_info']['calendar']['currentver'];
463
}
464
465
function calendar_upgrade0_9_10pre12()
466
{
467
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre13';
468
	return $GLOBALS['setup_info']['calendar']['currentver'];
469
}
470
471
function calendar_upgrade0_9_10pre13()
472
{
473
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre14';
474
	return $GLOBALS['setup_info']['calendar']['currentver'];
475
}
476
477
function calendar_upgrade0_9_10pre14()
478
{
479
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre15';
480
	return $GLOBALS['setup_info']['calendar']['currentver'];
481
}
482
483
function calendar_upgrade0_9_10pre15()
484
{
485
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre16';
486
	return $GLOBALS['setup_info']['calendar']['currentver'];
487
}
488
489
function calendar_upgrade0_9_10pre16()
490
{
491
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre17';
492
	return $GLOBALS['setup_info']['calendar']['currentver'];
493
}
494
495
function calendar_upgrade0_9_10pre17()
496
{
497
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre18';
498
	return $GLOBALS['setup_info']['calendar']['currentver'];
499
}
500
501
function calendar_upgrade0_9_10pre18()
502
{
503
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre19';
504
	return $GLOBALS['setup_info']['calendar']['currentver'];
505
}
506
507
function calendar_upgrade0_9_10pre19()
508
{
509
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre20';
510
	return $GLOBALS['setup_info']['calendar']['currentver'];
511
}
512
513
function calendar_upgrade0_9_10pre20()
514
{
515
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre21';
516
	return $GLOBALS['setup_info']['calendar']['currentver'];
517
}
518
519
function calendar_upgrade0_9_10pre21()
520
{
521
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre22';
522
	return $GLOBALS['setup_info']['calendar']['currentver'];
523
}
524
525
function calendar_upgrade0_9_10pre22()
526
{
527
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre23';
528
	return $GLOBALS['setup_info']['calendar']['currentver'];
529
}
530
531
function calendar_upgrade0_9_10pre23()
532
{
533
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre24';
534
	return $GLOBALS['setup_info']['calendar']['currentver'];
535
}
536
537
function calendar_upgrade0_9_10pre24()
538
{
539
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre25';
540
	return $GLOBALS['setup_info']['calendar']['currentver'];
541
}
542
543
function calendar_upgrade0_9_10pre25()
544
{
545
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre26';
546
	return $GLOBALS['setup_info']['calendar']['currentver'];
547
}
548
549
function calendar_upgrade0_9_10pre26()
550
{
551
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre27';
552
	return $GLOBALS['setup_info']['calendar']['currentver'];
553
}
554
555
function calendar_upgrade0_9_10pre27()
556
{
557
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10pre28';
558
	return $GLOBALS['setup_info']['calendar']['currentver'];
559
}
560
561
function calendar_upgrade0_9_10pre28()
562
{
563
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.10';
564
	return $GLOBALS['setup_info']['calendar']['currentver'];
565
}
566
567
function calendar_upgrade0_9_10()
568
{
569
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.001';
570
	return $GLOBALS['setup_info']['calendar']['currentver'];
571
}
572
573
function calendar_upgrade0_9_11()
574
{
575
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.001';
576
	return $GLOBALS['setup_info']['calendar']['currentver'];
577
}
578
579
580
function calendar_upgrade0_9_11_001()
581
{
582
	$db2 = $GLOBALS['egw_setup']->db;
583
584
	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...
585
	{
586
		define(RECUR_NONE,0);
0 ignored issues
show
Bug introduced by
The constant RECUR_NONE was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
587
		define(RECUR_DAILY,1);
0 ignored issues
show
Bug introduced by
The constant RECUR_DAILY was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
588
		define(RECUR_WEEKLY,2);
0 ignored issues
show
Bug introduced by
The constant RECUR_WEEKLY was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
589
		define(RECUR_MONTHLY_MDAY,3);
0 ignored issues
show
Bug introduced by
The constant RECUR_MONTHLY_MDAY was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
590
		define(RECUR_MONTHLY_WDAY,4);
0 ignored issues
show
Bug introduced by
The constant RECUR_MONTHLY_WDAY was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
591
		define(RECUR_YEARLY,5);
0 ignored issues
show
Bug introduced by
The constant RECUR_YEARLY was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
592
593
		define(M_SUNDAY,1);
0 ignored issues
show
Bug introduced by
The constant M_SUNDAY was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
594
		define(M_MONDAY,2);
0 ignored issues
show
Bug introduced by
The constant M_MONDAY was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
595
		define(M_TUESDAY,4);
0 ignored issues
show
Bug introduced by
The constant M_TUESDAY was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
596
		define(M_WEDNESDAY,8);
0 ignored issues
show
Bug introduced by
The constant M_WEDNESDAY was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
597
		define(M_THURSDAY,16);
0 ignored issues
show
Bug introduced by
The constant M_THURSDAY was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
598
		define(M_FRIDAY,32);
0 ignored issues
show
Bug introduced by
The constant M_FRIDAY was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
599
		define(M_SATURDAY,64);
0 ignored issues
show
Bug introduced by
The constant M_SATURDAY was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
600
	}
601
602
// calendar_entry => phpgw_cal
603
	$GLOBALS['egw_setup']->oProc->CreateTable('phpgw_cal',
604
		Array(
605
			'fd' => array(
606
				'cal_id' => array('type' => 'auto', 'nullable' => False),
607
				'owner' => array('type' => 'int', 'precision' => 8, 'nullable' => False),
608
				'category' => array('type' => 'int', 'precision' => 8, 'default' => '0', 'nullable' => True),
609
				'groups' => array('type' => 'varchar', 'precision' => 255, 'nullable' => True),
610
				'datetime' => array('type' => 'int', 'precision' => 8, 'nullable' => True),
611
				'mdatetime' => array('type' => 'int', 'precision' => 8, 'nullable' => True),
612
				'edatetime' => array('type' => 'int', 'precision' => 8, 'nullable' => True),
613
				'priority' => array('type' => 'int', 'precision' => 8, 'nullable' => False, 'default' => '2'),
614
				'cal_type' => array('type' => 'varchar', 'precision' => 10, 'nullable' => True),
615
				'is_public' => array('type' => 'int', 'precision' => 8, 'nullable' => False, 'default' => '1'),
616
				'title' => array('type' => 'varchar', 'precision' => 80, 'nullable' => False, 'default' => '1'),
617
				'description' => array('type' => 'text', 'nullable' => True)
618
			),
619
			'pk' => array('cal_id'),
620
			'fk' => array(),
621
			'ix' => array(),
622
			'uc' => array()
623
		)
624
	);
625
626
	$GLOBALS['egw_setup']->oProc->query('SELECT * FROM calendar_entry',__LINE__,__FILE__);
627
	while($GLOBALS['egw_setup']->oProc->next_record())
628
	{
629
		$id = $GLOBALS['egw_setup']->oProc->f('cal_id');
630
		$owner = $GLOBALS['egw_setup']->oProc->f('cal_owner');
631
		$access = $GLOBALS['egw_setup']->oProc->f('cal_access');
632
		switch($access)
633
		{
634
			case 'private':
635
				$is_public = 0;
636
				break;
637
			case 'public':
638
				$is_public = 1;
639
				break;
640
			case 'group':
641
				$is_public = 2;
642
				break;
643
		}
644
		$groups = $GLOBALS['egw_setup']->oProc->f('cal_group');
645
		$datetime = $GLOBALS['egw_setup']->oProc->f('cal_datetime');
646
		$mdatetime = $GLOBALS['egw_setup']->oProc->f('cal_mdatetime');
647
		$edatetime = $GLOBALS['egw_setup']->oProc->f('cal_edatetime');
648
		$priority = $GLOBALS['egw_setup']->oProc->f('cal_priority');
649
		$type = $GLOBALS['egw_setup']->oProc->f('cal_type');
650
		$title = $GLOBALS['egw_setup']->oProc->f('cal_name');
651
		$description = $GLOBALS['egw_setup']->oProc->f('cal_description');
652
653
		$db2->query("INSERT INTO phpgw_cal(cal_id,owner,groups,datetime,mdatetime,edatetime,priority,cal_type,is_public,title,description) "
654
			. "VALUES($id,$owner,'$groups',$datetime,$mdatetime,$edatetime,$priority,'$type',$is_public,'$title','$description')",__LINE__,__FILE__);
655
	}
656
	$GLOBALS['egw_setup']->oProc->DropTable('calendar_entry');
657
658
// calendar_entry_repeats => phpgw_cal_repeats
659
	$GLOBALS['egw_setup']->oProc->CreateTable('phpgw_cal_repeats',
660
		Array(
661
			'fd' => array(
662
				'cal_id' => array('type' => 'int', 'precision' => 8,'nullable' => False),
663
				'recur_type' => array('type' => 'int', 'precision' => 8,'nullable' => False),
664
				'recur_use_end' => array('type' => 'int', 'precision' => 8,'nullable' => True),
665
				'recur_enddate' => array('type' => 'int', 'precision' => 8,'nullable' => True),
666
				'recur_interval' => array('type' => 'int', 'precision' => 8,'nullable' => True,'default' => '1'),
667
				'recur_data' => array('type' => 'int', 'precision' => 8,'nullable' => True,'default' => '1')
668
			),
669
			'pk' => array(),
670
			'fk' => array(),
671
			'ix' => array(),
672
			'uc' => array()
673
		)
674
	);
675
	$GLOBALS['egw_setup']->oProc->query('SELECT * FROM calendar_entry_repeats',__LINE__,__FILE__);
676
	while($GLOBALS['egw_setup']->oProc->next_record())
677
	{
678
		$id = $GLOBALS['egw_setup']->oProc->f('cal_id');
679
		$recur_type = $GLOBALS['egw_setup']->oProc->f('cal_type');
680
		switch($recur_type)
681
		{
682
			case 'daily':
683
				$recur_type_num = RECUR_DAILY;
684
				break;
685
			case 'weekly':
686
				$recur_type_num = RECUR_WEEKLY;
687
				break;
688
			case 'monthlybydate':
689
				$recur_type_num = RECUR_MONTHLY_MDAY;
690
				break;
691
			case 'monthlybyday':
692
				$recur_type_num = RECUR_MONTHLY_WDAY;
693
				break;
694
			case 'yearly':
695
				$recur_type_num = RECUR_YEARLY;
696
				break;
697
		}
698
		$recur_use_end = $GLOBALS['egw_setup']->oProc->f('cal_use_end');
699
		$recur_end = $GLOBALS['egw_setup']->oProc->f('cal_end');
700
		$recur_interval = $GLOBALS['egw_setup']->oProc->f('cal_frequency');
701
		$days = strtoupper($GLOBALS['egw_setup']->oProc->f('cal_days'));
702
		$recur_data = 0;
703
		$recur_data += (substr($days,0,1)=='Y'?M_SUNDAY:0);
704
		$recur_data += (substr($days,1,1)=='Y'?M_MONDAY:0);
705
		$recur_data += (substr($days,2,1)=='Y'?M_TUESDAY:0);
706
		$recur_data += (substr($days,3,1)=='Y'?M_WEDNESDAY:0);
707
		$recur_data += (substr($days,4,1)=='Y'?M_THURSDAY:0);
708
		$recur_data += (substr($days,5,1)=='Y'?M_FRIDAY:0);
709
		$recur_data += (substr($days,6,1)=='Y'?M_SATURDAY:0);
710
		$db2->query("INSERT INTO phpgw_cal_repeats(cal_id,recur_type,recur_use_end,recur_enddate,recur_interval,recur_data) "
711
			. "VALUES($id,$recur_type_num,$recur_use_end,$recur_end,$recur_interval,$recur_data)",__LINE__,__FILE__);
712
	}
713
	$GLOBALS['egw_setup']->oProc->DropTable('calendar_entry_repeats');
714
715
// calendar_entry_user => phpgw_cal_user
716
	$GLOBALS['egw_setup']->oProc->RenameTable('calendar_entry_user','phpgw_cal_user');
717
718
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.002';
719
	return $GLOBALS['setup_info']['calendar']['currentver'];
720
}
721
722
723
function calendar_upgrade0_9_11_002()
724
{
725
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.003';
726
	return $GLOBALS['setup_info']['calendar']['currentver'];
727
}
728
729
730
function calendar_upgrade0_9_11_003()
731
{
732
	$GLOBALS['egw_setup']->oProc->CreateTable('phpgw_cal_holidays',
733
		Array(
734
			'fd' => array(
735
				'locale' => array('type' => 'char', 'precision' => 2,'nullable' => False),
736
				'name' => array('type' => 'varchar', 'precision' => 50,'nullable' => False),
737
				'date_time' => array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0')
738
			),
739
			'pk' => array('locale','name'),
740
			'fk' => array(),
741
			'ix' => array(),
742
			'uc' => array()
743
		)
744
	);
745
746
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.004';
747
	return $GLOBALS['setup_info']['calendar']['currentver'];
748
}
749
750
751
function calendar_upgrade0_9_11_004()
752
{
753
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.005';
754
	return $GLOBALS['setup_info']['calendar']['currentver'];
755
}
756
757
758
function calendar_upgrade0_9_11_005()
759
{
760
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.006';
761
	return $GLOBALS['setup_info']['calendar']['currentver'];
762
}
763
764
765
function calendar_upgrade0_9_11_006()
766
{
767
	$GLOBALS['egw_setup']->oProc->DropTable('phpgw_cal_holidays');
768
	$GLOBALS['egw_setup']->oProc->CreateTable('phpgw_cal_holidays',
769
		Array(
770
			'fd' => array(
771
				'hol_id' => array('type' => 'auto','nullable' => False),
772
				'locale' => array('type' => 'char', 'precision' => 2,'nullable' => False),
773
				'name' => array('type' => 'varchar', 'precision' => 50,'nullable' => False),
774
				'date_time' => array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0')
775
			),
776
			'pk' => array('hol_id'),
777
			'fk' => array(),
778
			'ix' => array(),
779
			'uc' => array()
780
		)
781
	);
782
783
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.007';
784
	return $GLOBALS['setup_info']['calendar']['currentver'];
785
}
786
787
788
function calendar_upgrade0_9_11_007()
789
{
790
	$GLOBALS['egw_setup']->oProc->query('DELETE FROM phpgw_cal_holidays');
791
	$GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_holidays','mday',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0'));
792
	$GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_holidays','month_num',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0'));
793
	$GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_holidays','occurence',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0'));
794
	$GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_holidays','dow',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0'));
795
796
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.008';
797
	return $GLOBALS['setup_info']['calendar']['currentver'];
798
}
799
800
801
function calendar_upgrade0_9_11_008()
802
{
803
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.009';
804
	return $GLOBALS['setup_info']['calendar']['currentver'];
805
}
806
807
808
function calendar_upgrade0_9_11_009()
809
{
810
	$GLOBALS['egw_setup']->oProc->query('DELETE FROM phpgw_cal_holidays');
811
	$GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_holidays','observance_rule',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0'));
812
813
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.010';
814
	return $GLOBALS['setup_info']['calendar']['currentver'];
815
}
816
817
818
function calendar_upgrade0_9_11_010()
819
{
820
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.011';
821
	return $GLOBALS['setup_info']['calendar']['currentver'];
822
}
823
824
825
function calendar_upgrade0_9_11_011()
826
{
827
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.13.001';
828
	return $GLOBALS['setup_info']['calendar']['currentver'];
829
}
830
831
function calendar_upgrade0_9_12()
832
{
833
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.13.001';
834
	return $GLOBALS['setup_info']['calendar']['currentver'];
835
}
836
837
function calendar_upgrade0_9_13_001()
838
{
839
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.13.002';
840
	return $GLOBALS['setup_info']['calendar']['currentver'];
841
}
842
843
844
function calendar_upgrade0_9_13_002()
845
{
846
	$GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal','reference',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0'));
847
848
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.13.003';
849
	return $GLOBALS['setup_info']['calendar']['currentver'];
850
}
851
852
853
function calendar_upgrade0_9_13_003()
854
{
855
	$GLOBALS['egw_setup']->oProc->CreateTable('phpgw_cal_alarm',
856
		Array(
857
			'fd' => array(
858
				'alarm_id' => array('type' => 'auto','nullable' => False),
859
				'cal_id'   => array('type' => 'int', 'precision' => 8, 'nullable' => False),
860
				'cal_owner'	=> array('type' => 'int', 'precision' => 8, 'nullable' => False),
861
				'cal_time' => array('type' => 'int', 'precision' => 8, 'nullable' => False),
862
				'cal_text' => array('type' => 'varchar', 'precision' => 50, 'nullable' => False)
863
			),
864
			'pk' => array('alarm_id'),
865
			'fk' => array(),
866
			'ix' => array(),
867
			'uc' => array()
868
		)
869
	);
870
871
	$GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal','uid',array('type' => 'varchar', 'precision' => 255,'nullable' => False));
872
	$GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal','location',array('type' => 'varchar', 'precision' => 255,'nullable' => True));
873
874
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.13.004';
875
	return $GLOBALS['setup_info']['calendar']['currentver'];
876
}
877
878
879
function calendar_upgrade0_9_13_004()
880
{
881
	$GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_alarm','alarm_enabled',array('type' => 'int', 'precision' => 4,'nullable' => False, 'default' => '1'));
882
883
	$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.13.005';
884
	return $GLOBALS['setup_info']['calendar']['currentver'];
885
}
886
887
888
function calendar_upgrade0_9_13_005()
889
{
890
	$calendar_data = Array();
891
	$GLOBALS['egw_setup']->oProc->query('SELECT cal_id, category FROM phpgw_cal',__LINE__,__FILE__);
892
	while($GLOBALS['egw_setup']->oProc->next_record())
893
	{
894
		$calendar_data[$GLOBALS['egw_setup']->oProc->f('cal_id')] = $GLOBALS['egw_setup']->oProc->f('category');
895
	}
896
897
	$GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_cal','category',array('type' => 'varchar', 'precision' => 30,'nullable' => True));
898
899
	@reset($calendar_data);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition for reset(). This can introduce security issues, and is generally not recommended. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unhandled  annotation

899
	/** @scrutinizer ignore-unhandled */ @reset($calendar_data);

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
900
	while($calendar_data && list($cal_id,$category) = each($calendar_data))
0 ignored issues
show
Deprecated Code introduced by
The function each() has been deprecated: 7.2 ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

900
	while($calendar_data && list($cal_id,$category) = /** @scrutinizer ignore-deprecated */ each($calendar_data))

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

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