c5904829c2ea4dc4bbda452c531b65f7599c7fc4
[platform/core/pim/calendar-service.git] / server / cal_server_update.c
1 /*
2  * Calendar Service
3  *
4  * Copyright (c) 2012 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19
20 #include <sqlite3.h>
21 #include <db-util.h>
22 #include <stdlib.h>
23
24 #include "cal_typedef.h"
25 #include "cal_internal.h"
26 #include "cal_db.h"
27
28 #define __USER_VERSION 105
29
30 static int _cal_server_update_get_db_version(sqlite3 *db, int *version)
31 {
32         int ret = CALENDAR_ERROR_NONE;
33         char query[CAL_DB_SQL_MAX_LEN] = {0};
34         sqlite3_stmt *stmt = NULL;
35
36         snprintf(query, sizeof(query), "PRAGMA user_version;");
37         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
38         if (SQLITE_OK != ret) {
39                 ERR("sqlite3_prepare_v2() failed[%s]", sqlite3_errmsg(db));
40                 return CALENDAR_ERROR_DB_FAILED;
41         }
42         ret = sqlite3_step(stmt);
43         if (SQLITE_ROW != ret) {
44                 ERR("sqlite3_step() failed[%s]", sqlite3_errmsg(db));
45                 sqlite3_finalize(stmt);
46                 return CALENDAR_ERROR_DB_FAILED;
47         }
48         if (version)
49                 *version = (int)sqlite3_column_int(stmt, 0);
50         sqlite3_finalize(stmt);
51         return CALENDAR_ERROR_NONE;
52 }
53
54 int cal_server_update(void)
55 {
56         CAL_FN_CALL();
57
58         int ret = CALENDAR_ERROR_NONE;
59         int old_version = 0;
60         char *errmsg = NULL;
61         sqlite3 *__db;
62         char query[CAL_DB_SQL_MAX_LEN] = {0};
63
64         char db_file[CAL_STR_MIDDLE_LEN] = {0};
65         snprintf(db_file, sizeof(db_file), "%s/%s", DB_PATH, CALS_DB_NAME);
66         ret = db_util_open(db_file, &__db, 0);
67         if (SQLITE_OK != ret) {
68                 ERR("db_util_open() fail(%d):[%s]", ret, db_file);
69                 return CALENDAR_ERROR_DB_FAILED;
70         }
71         _cal_server_update_get_db_version(__db, &old_version);
72         DBG("[%s] old version(%d)", db_file, old_version);
73
74         if (old_version < 100) {
75                 /* ----------------------- start modified 2013/08/22
76                  * added attendee_table(cutype, delegatee_uri, member), alarm_table(summary, action, attach).
77                  */
78                 ret = sqlite3_exec(__db, "DROP VIEW event_calendar_attendee_view", NULL, 0, &errmsg);
79                 if (SQLITE_OK != ret) {
80                         ERR("sqlite3_exec() failed: DROP VIEW event_calendar_attendee_view(%d) [%s]", ret, errmsg);
81                         sqlite3_free(errmsg);
82                 }
83
84                 ret = sqlite3_exec(__db, "ALTER TABLE attendee_table ADD COLUMN attendee_cutype INTEGER", NULL, 0, &errmsg);
85                 if (SQLITE_OK != ret) {
86                         ERR("sqlite3_exec() failed: ALTER TABLE attendee_table ADD COLUMN attendee_cutype(%d) [%s]", ret, errmsg);
87                         sqlite3_free(errmsg);
88                 }
89                 ret = sqlite3_exec(__db, "ALTER TABLE attendee_table ADD COLUMN attendee_delegatee_uri TEXT", NULL, 0, &errmsg);
90                 if (SQLITE_OK != ret) {
91                         ERR("sqlite3_exec() failed: ALTER TABLE attendee_table ADD COLUMN attendee_delegatee_uri(%d) [%s]", ret, errmsg);
92                         sqlite3_free(errmsg);
93                 }
94                 ret = sqlite3_exec(__db, "ALTER TABLE attendee_table ADD COLUMN attendee_member TEXT", NULL, 0, &errmsg);
95                 if (SQLITE_OK != ret) {
96                         ERR("sqlite3_exec() failed: ALTER TABLE attendee_table ADD COLUMN attendee_member(%d) [%s]", ret, errmsg);
97                         sqlite3_free(errmsg);
98                 }
99
100                 ret = sqlite3_exec(__db, "ALTER TABLE alarm_table ADD COLUMN alarm_summary TEXT", NULL, 0, &errmsg);
101                 if (SQLITE_OK != ret) {
102                         ERR("sqlite3_exec() failed: ALTER TABLE alarm_table ADD COLUMN alarm_summary(%d) [%s]", ret, errmsg);
103                         sqlite3_free(errmsg);
104                 }
105                 ret = sqlite3_exec(__db, "ALTER TABLE alarm_table ADD COLUMN alarm_action INTEGER", NULL, 0, &errmsg);
106                 if (SQLITE_OK != ret) {
107                         ERR("sqlite3_exec() failed: ALTER TABLE alarm_table ADD COLUMN alarm_action(%d) [%s]", ret, errmsg);
108                         sqlite3_free(errmsg);
109                 }
110                 ret = sqlite3_exec(__db, "ALTER TABLE alarm_table ADD COLUMN alarm_attach TEXT", NULL, 0, &errmsg);
111                 if (SQLITE_OK != ret) {
112                         ERR("sqlite3_exec() failed: ALTER TABLE alarm_table ADD COLUMN alarm_attach(%d) [%s]", ret, errmsg);
113                         sqlite3_free(errmsg);
114                 }
115                 old_version = 100;
116                 /* ----------------------- end modified 2013/08/22
117                  */
118         }
119         if (old_version == 100) {
120                 /* ----------------------- start modified 2013/09/22
121                  * added schedule_table(freq) for view table parameter.
122                  */
123                 ret = sqlite3_exec(__db, "ALTER TABLE schedule_table ADD COLUMN freq INTEGER DEFAULT 0", NULL, 0, &errmsg);
124                 if (SQLITE_OK != ret) {
125                         ERR("sqlite3_exec() failed: ALTER TABLE schedule_table ADD COLUMN freq(%d) [%s]", ret, errmsg);
126                         sqlite3_free(errmsg);
127                 }
128                 old_version = 101;
129                 /* ----------------------- end modified 2013/09/22
130                  */
131         }
132         if (old_version == 101) {
133                 /* ----------------------- start modified 2014/07/02
134                  * added trigger depeding on schedule_table
135                  * added original_event_id in deleted_table to check exception event.
136                  */
137
138                 /* rename trig -> trg */
139                 ret = sqlite3_exec(__db, "DROP TRIGGER trig_original_mod", NULL, 0, &errmsg);
140                 if (SQLITE_OK != ret) {
141                         ERR("DROP TRIGGER trig_original_mod failed(%d:%s)", ret, errmsg);
142                         sqlite3_free(errmsg);
143                 }
144                 ret = sqlite3_exec(__db,
145                                 "CREATE TRIGGER trg_original_mod AFTER UPDATE OF is_deleted ON schedule_table "
146                                 " BEGIN "
147                                 "   DELETE FROM normal_instance_table WHERE event_id = (SELECT rowid FROM schedule_table WHERE original_event_id = old.id);"
148                                 "   DELETE FROM allday_instance_table WHERE event_id = (SELECT rowid FROM schedule_table WHERE original_event_id = old.id);"
149                                 "   UPDATE schedule_table SET is_deleted = 1 WHERE original_event_id = old.id;"
150                                 " END;",
151                                 NULL, 0, &errmsg);
152                 if (SQLITE_OK != ret) {
153                         ERR("CREATE TRIGGER trg_original_mod failed(%d:%s)", ret, errmsg);
154                         sqlite3_free(errmsg);
155                 }
156
157                 /* rename trg_sch_del -> trg_schedule_del */
158                 ret = sqlite3_exec(__db, "DROP TRIGGER trg_sch_del", NULL, 0, &errmsg);
159                 if (SQLITE_OK != ret) {
160                         ERR("DROP TRIGGER trg_sch_del failed(%d:%s)", ret, errmsg);
161                         sqlite3_free(errmsg);
162                 }
163                 ret = sqlite3_exec(__db,
164                                 "CREATE TRIGGER trg_schedule_del AFTER DELETE ON schedule_table "
165                                 "BEGIN "
166                                 "  DELETE FROM rrule_table WHERE event_id = old.id;"
167                                 "  DELETE FROM alarm_table WHERE event_id = old.id;"
168                                 "  DELETE FROM schedule_table WHERE original_event_id = old.id;"
169                                 "  DELETE FROM normal_instance_table WHERE event_id = old.id;"
170                                 "  DELETE FROM allday_instance_table WHERE event_id = old.id;"
171                                 "  DELETE FROM attendee_table WHERE event_id = old.id;"
172                                 "  DELETE FROM extended_table WHERE record_id = old.id AND record_type = 2;"
173                                 "  DELETE FROM extended_table WHERE record_id = old.id AND record_type = 3;"
174                                 "END;",
175                                 NULL, 0, &errmsg);
176                 if (SQLITE_OK != ret) {
177                         ERR("CREATE TRIGGER trg_schedule_del failed(%d:%s)", ret, errmsg);
178                         sqlite3_free(errmsg);
179                 }
180
181                 /* add trigger */
182                 ret = sqlite3_exec(__db,
183                                 "CREATE TRIGGER trg_schedule_del2 AFTER DELETE ON schedule_table "
184                                 " WHEN old.is_deleted = 0 AND old.calendar_id = (SELECT id FROM calendar_table WHERE id = old.calendar_id) "
185                                 " BEGIN "
186                                 "   INSERT INTO deleted_table VALUES(old.id, old.type + 1, old.calendar_id, (SELECT ver FROM version_table) + 1, old.created_ver, old.original_event_id);"
187                                 " END;",
188                                 NULL, 0, &errmsg);
189                 if (SQLITE_OK != ret) {
190                         ERR("CREATE TRIGGER trg_schedule_del2 failed(%d:%s)", ret, errmsg);
191                         sqlite3_free(errmsg);
192                 }
193
194                 /* add trigger */
195                 ret = sqlite3_exec(__db,
196                                 "CREATE TRIGGER trg_schedule_del3 AFTER DELETE ON schedule_table "
197                                 " WHEN old.is_deleted = 1 AND old.calendar_id = (SELECT id FROM calendar_table WHERE id = old.calendar_id) "
198                                 " BEGIN "
199                                 "   INSERT INTO deleted_table VALUES(old.id, old.type + 1, old.calendar_id, old.changed_ver, old.created_ver, old.original_event_id);"
200                                 " END;",
201                                 NULL, 0, &errmsg);
202                 if (SQLITE_OK != ret) {
203                         ERR("CREATE TRIGGER trg_schedule_del3 failed(%d:%s)", ret, errmsg);
204                         sqlite3_free(errmsg);
205                 }
206
207                 /* add field: original_event_id in deleted_table */
208                 ret = sqlite3_exec(__db, "ALTER TABLE deleted_table ADD COLUMN original_event_id INTEGER", NULL, 0, &errmsg);
209                 if (SQLITE_OK != ret) {
210                         ERR("ALTER TABLE deleted_table failed(%d:%s)", ret, errmsg);
211                         sqlite3_free(errmsg);
212                 }
213                 /* ----------------------- end modified 2014/07/02
214                  */
215                 old_version = 102;
216         }
217         if (old_version == 102) {
218                 /* ----------------------- start modified 2014/10/24
219                  * added field is_alldy on schedule_table
220                  */
221
222                 /* add field: is_allday in deleted_table */
223                 ret = sqlite3_exec(__db, "ALTER TABLE schedule_table ADD COLUMN is_allday INTEGER DEFAULT 0", NULL, 0, &errmsg);
224                 if (SQLITE_OK != ret) {
225                         ERR("ALTER TABLE schedule_table failed(%d:%s)", ret, errmsg);
226                         sqlite3_free(errmsg);
227                 }
228                 /* ----------------------- end modified 2014/10/24
229                  */
230                 old_version = 103;
231         }
232
233         if (old_version == 103) {
234                 ret = sqlite3_exec(__db, "DROP TABLE reminder_table", NULL, 0, &errmsg);
235                 if (SQLITE_OK != ret) {
236                         ERR("DROP TABLE reminder_table failed(%d:%s)", ret, errmsg);
237                         sqlite3_free(errmsg);
238                 }
239                 old_version = 104;
240         }
241         if (old_version == 104) {
242                 ret = sqlite3_exec(__db, "ALTER TABLE alarm_table ADD COLUMN alarm_utime INTEGER", NULL, 0, &errmsg);
243                 if (SQLITE_OK != ret) {
244                         ERR("ALTER TABLE schedule_table failed(%d:%s)", ret, errmsg);
245                         sqlite3_free(errmsg);
246                 }
247                 ret = sqlite3_exec(__db, "ALTER TABLE alarm_table ADD COLUMN alarm_datetime DATE", NULL, 0, &errmsg);
248                 if (SQLITE_OK != ret) {
249                         ERR("ALTER TABLE schedule_table failed(%d:%s)", ret, errmsg);
250                         sqlite3_free(errmsg);
251                 }
252                 ret = sqlite3_exec(__db, "DROP VIEW allday_instance_view", NULL, 0, &errmsg);
253                 if (SQLITE_OK != ret) {
254                         ERR("sqlite3_exec() failed: DROP VIEW allday_instance_view(%d) [%s]", ret, errmsg);
255                         sqlite3_free(errmsg);
256                 }
257                 ret = sqlite3_exec(__db, "DROP VIEW allday_instance_view_extended", NULL, 0, &errmsg);
258                 if (SQLITE_OK != ret) {
259                         ERR("sqlite3_exec() failed: DROP VIEW allday_instance_view_extended(%d) [%s]", ret, errmsg);
260                         sqlite3_free(errmsg);
261                 }
262                 old_version = 105;
263         }
264
265         /* update DB user_version */
266         snprintf(query, sizeof(query), "PRAGMA user_version = %d", __USER_VERSION);
267         ret = sqlite3_exec(__db, query, NULL, 0, &errmsg);
268         if (SQLITE_OK != ret) {
269                 ERR("sqlite3_exec() failed(%d) [%s]", ret, errmsg);
270                 sqlite3_free(errmsg);
271         }
272         db_util_close(__db);
273         __db = NULL;
274
275         return CALENDAR_ERROR_NONE;
276 }
277
278