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) {
39 ERR("sqlite3_prepare_v2() failed[%s]", sqlite3_errmsg(db));
40 return CALENDAR_ERROR_DB_FAILED;
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;
49 *version = (int)sqlite3_column_int(stmt, 0);
50 sqlite3_finalize(stmt);
51 return CALENDAR_ERROR_NONE;
54 int cal_server_update(void)
58 int ret = CALENDAR_ERROR_NONE;
62 char query[CAL_DB_SQL_MAX_LEN] = {0};
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;
71 _cal_server_update_get_db_version(__db, &old_version);
72 DBG("[%s] old version(%d)", db_file, old_version);
74 if (old_version < 100) {
75 /* ----------------------- start modified 2013/08/22
76 * added attendee_table(cutype, delegatee_uri, member), alarm_table(summary, action, attach).
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);
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);
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);
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);
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);
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);
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);
116 /* ----------------------- end modified 2013/08/22
119 if (old_version == 100) {
120 /* ----------------------- start modified 2013/09/22
121 * added schedule_table(freq) for view table parameter.
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);
129 /* ----------------------- end modified 2013/09/22
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.
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);
144 ret = sqlite3_exec(__db,
145 "CREATE TRIGGER trg_original_mod AFTER UPDATE OF is_deleted ON schedule_table "
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;"
152 if (SQLITE_OK != ret) {
153 ERR("CREATE TRIGGER trg_original_mod failed(%d:%s)", ret, errmsg);
154 sqlite3_free(errmsg);
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);
163 ret = sqlite3_exec(__db,
164 "CREATE TRIGGER trg_schedule_del AFTER DELETE ON schedule_table "
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;"
176 if (SQLITE_OK != ret) {
177 ERR("CREATE TRIGGER trg_schedule_del failed(%d:%s)", ret, errmsg);
178 sqlite3_free(errmsg);
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) "
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);"
189 if (SQLITE_OK != ret) {
190 ERR("CREATE TRIGGER trg_schedule_del2 failed(%d:%s)", ret, errmsg);
191 sqlite3_free(errmsg);
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) "
199 " INSERT INTO deleted_table VALUES(old.id, old.type + 1, old.calendar_id, old.changed_ver, old.created_ver, old.original_event_id);"
202 if (SQLITE_OK != ret) {
203 ERR("CREATE TRIGGER trg_schedule_del3 failed(%d:%s)", ret, errmsg);
204 sqlite3_free(errmsg);
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);
213 /* ----------------------- end modified 2014/07/02
217 if (old_version == 102) {
218 /* ----------------------- start modified 2014/10/24
219 * added field is_alldy on schedule_table
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);
228 /* ----------------------- end modified 2014/10/24
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);
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);
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);
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);
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);
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);
275 return CALENDAR_ERROR_NONE;