4 * Copyright (c) 2012 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
24 #include "cal_typedef.h"
25 #include "cal_internal.h"
28 #define __USER_VERSION 105
30 static int _cal_server_update_get_db_version(sqlite3 *db, int *version)
32 int ret = CALENDAR_ERROR_NONE;
33 char query[CAL_DB_SQL_MAX_LEN] = {0};
34 sqlite3_stmt *stmt = NULL;
36 snprintf(query, sizeof(query), "PRAGMA user_version;");
37 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
38 if (SQLITE_OK != ret) {
40 ERR("sqlite3_prepare_v2() failed[%s]", sqlite3_errmsg(db));
41 return CALENDAR_ERROR_DB_FAILED;
44 ret = sqlite3_step(stmt);
45 if (SQLITE_ROW != ret) {
47 ERR("sqlite3_step() failed[%s]", sqlite3_errmsg(db));
48 sqlite3_finalize(stmt);
49 return CALENDAR_ERROR_DB_FAILED;
53 *version = (int)sqlite3_column_int(stmt, 0);
54 sqlite3_finalize(stmt);
55 return CALENDAR_ERROR_NONE;
58 int cal_server_update(void)
62 int ret = CALENDAR_ERROR_NONE;
66 char query[CAL_DB_SQL_MAX_LEN] = {0};
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) {
73 ERR("db_util_open() fail(%d):[%s]", ret, db_file);
74 return CALENDAR_ERROR_DB_FAILED;
77 _cal_server_update_get_db_version(__db, &old_version);
78 DBG("[%s] old version(%d)", db_file, old_version);
81 if (old_version < 100) {
82 /* ----------------------- start modified 2013/08/22
83 * added attendee_table(cutype, delegatee_uri, member), alarm_table(summary, action, attach).
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);
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);
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);
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);
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);
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);
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);
123 /* ----------------------- end modified 2013/08/22
126 if (old_version == 100) {
127 /* ----------------------- start modified 2013/09/22
128 * added schedule_table(freq) for view table parameter.
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);
136 /* ----------------------- end modified 2013/09/22
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.
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);
151 ret = sqlite3_exec(__db,
152 "CREATE TRIGGER trg_original_mod AFTER UPDATE OF is_deleted ON schedule_table "
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;"
159 if (SQLITE_OK != ret) {
160 ERR("CREATE TRIGGER trg_original_mod failed(%d:%s)", ret, errmsg);
161 sqlite3_free(errmsg);
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);
170 ret = sqlite3_exec(__db,
171 "CREATE TRIGGER trg_schedule_del AFTER DELETE ON schedule_table "
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;"
183 if (SQLITE_OK != ret) {
184 ERR("CREATE TRIGGER trg_schedule_del failed(%d:%s)", ret, errmsg);
185 sqlite3_free(errmsg);
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) "
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);"
196 if (SQLITE_OK != ret) {
197 ERR("CREATE TRIGGER trg_schedule_del2 failed(%d:%s)", ret, errmsg);
198 sqlite3_free(errmsg);
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) "
206 " INSERT INTO deleted_table VALUES(old.id, old.type + 1, old.calendar_id, old.changed_ver, old.created_ver, old.original_event_id);"
209 if (SQLITE_OK != ret) {
210 ERR("CREATE TRIGGER trg_schedule_del3 failed(%d:%s)", ret, errmsg);
211 sqlite3_free(errmsg);
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);
220 /* ----------------------- end modified 2014/07/02
224 if (old_version == 102) {
225 /* ----------------------- start modified 2014/10/24
226 * added field is_alldy on schedule_table
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);
235 /* ----------------------- end modified 2014/10/24
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);
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);
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);
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);
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);
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);
281 return CALENDAR_ERROR_SYSTEM;
287 return CALENDAR_ERROR_NONE;