add comment LCOV_EXCL
[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                 /* LCOV_EXCL_START */
40                 ERR("sqlite3_prepare_v2() failed[%s]", sqlite3_errmsg(db));
41                 return CALENDAR_ERROR_DB_FAILED;
42                 /* LCOV_EXCL_STOP */
43         }
44         ret = sqlite3_step(stmt);
45         if (SQLITE_ROW != ret) {
46                 /* LCOV_EXCL_START */
47                 ERR("sqlite3_step() failed[%s]", sqlite3_errmsg(db));
48                 sqlite3_finalize(stmt);
49                 return CALENDAR_ERROR_DB_FAILED;
50                 /* LCOV_EXCL_STOP */
51         }
52         if (version)
53                 *version = (int)sqlite3_column_int(stmt, 0);
54         sqlite3_finalize(stmt);
55         return CALENDAR_ERROR_NONE;
56 }
57
58 int cal_server_update(void)
59 {
60         CAL_FN_CALL();
61
62         int ret = CALENDAR_ERROR_NONE;
63         int old_version = 0;
64         char *errmsg = NULL;
65         sqlite3 *__db;
66         char query[CAL_DB_SQL_MAX_LEN] = {0};
67
68         char db_file[CAL_STR_MIDDLE_LEN] = {0};
69         snprintf(db_file, sizeof(db_file), "%s/%s", DB_PATH, CALS_DB_NAME);
70         ret = db_util_open(db_file, &__db, 0);
71         if (SQLITE_OK != ret) {
72                 /* LCOV_EXCL_START */
73                 ERR("db_util_open() fail(%d):[%s]", ret, db_file);
74                 return CALENDAR_ERROR_DB_FAILED;
75                 /* LCOV_EXCL_STOP */
76         }
77         _cal_server_update_get_db_version(__db, &old_version);
78         DBG("[%s] old version(%d)", db_file, old_version);
79
80         /* LCOV_EXCL_START */
81         if (old_version < 100) {
82                 /* ----------------------- start modified 2013/08/22
83                  * added attendee_table(cutype, delegatee_uri, member), alarm_table(summary, action, attach).
84                  */
85                 ret = sqlite3_exec(__db, "DROP VIEW event_calendar_attendee_view", NULL, 0, &errmsg);
86                 if (SQLITE_OK != ret) {
87                         ERR("sqlite3_exec() failed: DROP VIEW event_calendar_attendee_view(%d) [%s]", ret, errmsg);
88                         sqlite3_free(errmsg);
89                 }
90
91                 ret = sqlite3_exec(__db, "ALTER TABLE attendee_table ADD COLUMN attendee_cutype INTEGER", NULL, 0, &errmsg);
92                 if (SQLITE_OK != ret) {
93                         ERR("sqlite3_exec() failed: ALTER TABLE attendee_table ADD COLUMN attendee_cutype(%d) [%s]", ret, errmsg);
94                         sqlite3_free(errmsg);
95                 }
96                 ret = sqlite3_exec(__db, "ALTER TABLE attendee_table ADD COLUMN attendee_delegatee_uri TEXT", NULL, 0, &errmsg);
97                 if (SQLITE_OK != ret) {
98                         ERR("sqlite3_exec() failed: ALTER TABLE attendee_table ADD COLUMN attendee_delegatee_uri(%d) [%s]", ret, errmsg);
99                         sqlite3_free(errmsg);
100                 }
101                 ret = sqlite3_exec(__db, "ALTER TABLE attendee_table ADD COLUMN attendee_member TEXT", NULL, 0, &errmsg);
102                 if (SQLITE_OK != ret) {
103                         ERR("sqlite3_exec() failed: ALTER TABLE attendee_table ADD COLUMN attendee_member(%d) [%s]", ret, errmsg);
104                         sqlite3_free(errmsg);
105                 }
106
107                 ret = sqlite3_exec(__db, "ALTER TABLE alarm_table ADD COLUMN alarm_summary TEXT", NULL, 0, &errmsg);
108                 if (SQLITE_OK != ret) {
109                         ERR("sqlite3_exec() failed: ALTER TABLE alarm_table ADD COLUMN alarm_summary(%d) [%s]", ret, errmsg);
110                         sqlite3_free(errmsg);
111                 }
112                 ret = sqlite3_exec(__db, "ALTER TABLE alarm_table ADD COLUMN alarm_action INTEGER", NULL, 0, &errmsg);
113                 if (SQLITE_OK != ret) {
114                         ERR("sqlite3_exec() failed: ALTER TABLE alarm_table ADD COLUMN alarm_action(%d) [%s]", ret, errmsg);
115                         sqlite3_free(errmsg);
116                 }
117                 ret = sqlite3_exec(__db, "ALTER TABLE alarm_table ADD COLUMN alarm_attach TEXT", NULL, 0, &errmsg);
118                 if (SQLITE_OK != ret) {
119                         ERR("sqlite3_exec() failed: ALTER TABLE alarm_table ADD COLUMN alarm_attach(%d) [%s]", ret, errmsg);
120                         sqlite3_free(errmsg);
121                 }
122                 old_version = 100;
123                 /* ----------------------- end modified 2013/08/22
124                 */
125         }
126         if (old_version == 100) {
127                 /* ----------------------- start modified 2013/09/22
128                  * added schedule_table(freq) for view table parameter.
129                  */
130                 ret = sqlite3_exec(__db, "ALTER TABLE schedule_table ADD COLUMN freq INTEGER DEFAULT 0", NULL, 0, &errmsg);
131                 if (SQLITE_OK != ret) {
132                         ERR("sqlite3_exec() failed: ALTER TABLE schedule_table ADD COLUMN freq(%d) [%s]", ret, errmsg);
133                         sqlite3_free(errmsg);
134                 }
135                 old_version = 101;
136                 /* ----------------------- end modified 2013/09/22
137                 */
138         }
139         if (old_version == 101) {
140                 /* ----------------------- start modified 2014/07/02
141                  * added trigger depeding on schedule_table
142                  * added original_event_id in deleted_table to check exception event.
143                  */
144
145                 /* rename trig -> trg */
146                 ret = sqlite3_exec(__db, "DROP TRIGGER trig_original_mod", NULL, 0, &errmsg);
147                 if (SQLITE_OK != ret) {
148                         ERR("DROP TRIGGER trig_original_mod failed(%d:%s)", ret, errmsg);
149                         sqlite3_free(errmsg);
150                 }
151                 ret = sqlite3_exec(__db,
152                                 "CREATE TRIGGER trg_original_mod AFTER UPDATE OF is_deleted ON schedule_table "
153                                 " BEGIN "
154                                 "   DELETE FROM normal_instance_table WHERE event_id = (SELECT rowid FROM schedule_table WHERE original_event_id = old.id);"
155                                 "   DELETE FROM allday_instance_table WHERE event_id = (SELECT rowid FROM schedule_table WHERE original_event_id = old.id);"
156                                 "   UPDATE schedule_table SET is_deleted = 1 WHERE original_event_id = old.id;"
157                                 " END;",
158                                 NULL, 0, &errmsg);
159                 if (SQLITE_OK != ret) {
160                         ERR("CREATE TRIGGER trg_original_mod failed(%d:%s)", ret, errmsg);
161                         sqlite3_free(errmsg);
162                 }
163
164                 /* rename trg_sch_del -> trg_schedule_del */
165                 ret = sqlite3_exec(__db, "DROP TRIGGER trg_sch_del", NULL, 0, &errmsg);
166                 if (SQLITE_OK != ret) {
167                         ERR("DROP TRIGGER trg_sch_del failed(%d:%s)", ret, errmsg);
168                         sqlite3_free(errmsg);
169                 }
170                 ret = sqlite3_exec(__db,
171                                 "CREATE TRIGGER trg_schedule_del AFTER DELETE ON schedule_table "
172                                 "BEGIN "
173                                 "  DELETE FROM rrule_table WHERE event_id = old.id;"
174                                 "  DELETE FROM alarm_table WHERE event_id = old.id;"
175                                 "  DELETE FROM schedule_table WHERE original_event_id = old.id;"
176                                 "  DELETE FROM normal_instance_table WHERE event_id = old.id;"
177                                 "  DELETE FROM allday_instance_table WHERE event_id = old.id;"
178                                 "  DELETE FROM attendee_table WHERE event_id = old.id;"
179                                 "  DELETE FROM extended_table WHERE record_id = old.id AND record_type = 2;"
180                                 "  DELETE FROM extended_table WHERE record_id = old.id AND record_type = 3;"
181                                 "END;",
182                                 NULL, 0, &errmsg);
183                 if (SQLITE_OK != ret) {
184                         ERR("CREATE TRIGGER trg_schedule_del failed(%d:%s)", ret, errmsg);
185                         sqlite3_free(errmsg);
186                 }
187
188                 /* add trigger */
189                 ret = sqlite3_exec(__db,
190                                 "CREATE TRIGGER trg_schedule_del2 AFTER DELETE ON schedule_table "
191                                 " WHEN old.is_deleted = 0 AND old.calendar_id = (SELECT id FROM calendar_table WHERE id = old.calendar_id) "
192                                 " BEGIN "
193                                 "   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);"
194                                 " END;",
195                                 NULL, 0, &errmsg);
196                 if (SQLITE_OK != ret) {
197                         ERR("CREATE TRIGGER trg_schedule_del2 failed(%d:%s)", ret, errmsg);
198                         sqlite3_free(errmsg);
199                 }
200
201                 /* add trigger */
202                 ret = sqlite3_exec(__db,
203                                 "CREATE TRIGGER trg_schedule_del3 AFTER DELETE ON schedule_table "
204                                 " WHEN old.is_deleted = 1 AND old.calendar_id = (SELECT id FROM calendar_table WHERE id = old.calendar_id) "
205                                 " BEGIN "
206                                 "   INSERT INTO deleted_table VALUES(old.id, old.type + 1, old.calendar_id, old.changed_ver, old.created_ver, old.original_event_id);"
207                                 " END;",
208                                 NULL, 0, &errmsg);
209                 if (SQLITE_OK != ret) {
210                         ERR("CREATE TRIGGER trg_schedule_del3 failed(%d:%s)", ret, errmsg);
211                         sqlite3_free(errmsg);
212                 }
213
214                 /* add field: original_event_id in deleted_table */
215                 ret = sqlite3_exec(__db, "ALTER TABLE deleted_table ADD COLUMN original_event_id INTEGER", NULL, 0, &errmsg);
216                 if (SQLITE_OK != ret) {
217                         ERR("ALTER TABLE deleted_table failed(%d:%s)", ret, errmsg);
218                         sqlite3_free(errmsg);
219                 }
220                 /* ----------------------- end modified 2014/07/02
221                 */
222                 old_version = 102;
223         }
224         if (old_version == 102) {
225                 /* ----------------------- start modified 2014/10/24
226                  * added field is_alldy on schedule_table
227                  */
228
229                 /* add field: is_allday in deleted_table */
230                 ret = sqlite3_exec(__db, "ALTER TABLE schedule_table ADD COLUMN is_allday INTEGER DEFAULT 0", NULL, 0, &errmsg);
231                 if (SQLITE_OK != ret) {
232                         ERR("ALTER TABLE schedule_table failed(%d:%s)", ret, errmsg);
233                         sqlite3_free(errmsg);
234                 }
235                 /* ----------------------- end modified 2014/10/24
236                 */
237                 old_version = 103;
238         }
239
240         if (old_version == 103) {
241                 ret = sqlite3_exec(__db, "DROP TABLE reminder_table", NULL, 0, &errmsg);
242                 if (SQLITE_OK != ret) {
243                         ERR("DROP TABLE reminder_table failed(%d:%s)", ret, errmsg);
244                         sqlite3_free(errmsg);
245                 }
246                 old_version = 104;
247         }
248         if (old_version == 104) {
249                 ret = sqlite3_exec(__db, "ALTER TABLE alarm_table ADD COLUMN alarm_utime INTEGER", NULL, 0, &errmsg);
250                 if (SQLITE_OK != ret) {
251                         ERR("ALTER TABLE schedule_table failed(%d:%s)", ret, errmsg);
252                         sqlite3_free(errmsg);
253                 }
254                 ret = sqlite3_exec(__db, "ALTER TABLE alarm_table ADD COLUMN alarm_datetime DATE", NULL, 0, &errmsg);
255                 if (SQLITE_OK != ret) {
256                         ERR("ALTER TABLE schedule_table failed(%d:%s)", ret, errmsg);
257                         sqlite3_free(errmsg);
258                 }
259                 ret = sqlite3_exec(__db, "DROP VIEW allday_instance_view", NULL, 0, &errmsg);
260                 if (SQLITE_OK != ret) {
261                         ERR("sqlite3_exec() failed: DROP VIEW allday_instance_view(%d) [%s]", ret, errmsg);
262                         sqlite3_free(errmsg);
263                 }
264                 ret = sqlite3_exec(__db, "DROP VIEW allday_instance_view_extended", NULL, 0, &errmsg);
265                 if (SQLITE_OK != ret) {
266                         ERR("sqlite3_exec() failed: DROP VIEW allday_instance_view_extended(%d) [%s]", ret, errmsg);
267                         sqlite3_free(errmsg);
268                 }
269                 old_version = 105;
270         }
271         /* LCOV_EXCL_STOP */
272
273         /* update DB user_version */
274         snprintf(query, sizeof(query), "PRAGMA user_version = %d", __USER_VERSION);
275         ret = sqlite3_exec(__db, query, NULL, 0, &errmsg);
276         if (SQLITE_OK != ret) {
277                 /* LCOV_EXCL_START */
278                 ERR("sqlite3_exec() failed(%d) [%s]", ret, errmsg);
279                 sqlite3_free(errmsg);
280                 db_util_close(__db);
281                 return CALENDAR_ERROR_SYSTEM;
282                 /* LCOV_EXCL_STOP */
283         }
284         db_util_close(__db);
285         __db = NULL;
286
287         return CALENDAR_ERROR_NONE;
288 }
289
290