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.
21 #include "cal_internal.h"
22 #include "cal_typedef.h"
23 #include "cal_db_util.h"
27 #include "cal_utils.h"
29 void cal_db_rrule_get_rrule_from_record(calendar_record_h record, cal_rrule_s **out_rrule)
31 RET_IF(NULL == record);
33 cal_rrule_s *rrule = NULL;
34 cal_record_s *rec = (cal_record_s *)record;
36 case CAL_RECORD_TYPE_EVENT:
37 if (CALENDAR_RECURRENCE_NONE == ((cal_event_s *)record)->freq)
39 rrule = calloc(1, sizeof(cal_rrule_s));
42 rrule->freq = ((cal_event_s *)record)->freq;
43 rrule->interval = ((cal_event_s *)record)->interval;
44 rrule->bysecond = ((cal_event_s *)record)->bysecond;
45 rrule->byminute = ((cal_event_s *)record)->byminute;
46 rrule->byhour = ((cal_event_s *)record)->byhour;
47 rrule->byday = ((cal_event_s *)record)->byday;
48 rrule->bymonthday = ((cal_event_s *)record)->bymonthday;
49 rrule->byyearday = ((cal_event_s *)record)->byyearday;
50 rrule->byweekno = ((cal_event_s *)record)->byweekno;
51 rrule->bymonth = ((cal_event_s *)record)->bymonth;
52 rrule->bysetpos = ((cal_event_s *)record)->bysetpos;
53 rrule->wkst = ((cal_event_s *)record)->wkst;
54 rrule->range_type = ((cal_event_s *)record)->range_type;
55 switch (rrule->range_type) {
56 case CALENDAR_RANGE_UNTIL:
57 rrule->until = ((cal_event_s *)record)->until;
59 case CALENDAR_RANGE_COUNT:
60 rrule->count = ((cal_event_s *)record)->count;
62 case CALENDAR_RANGE_NONE:
66 case CAL_RECORD_TYPE_TODO:
67 if (CALENDAR_RECURRENCE_NONE == ((cal_todo_s *)record)->freq)
69 rrule = calloc(1, sizeof(cal_rrule_s));
72 rrule->freq = ((cal_todo_s *)record)->freq;
73 rrule->interval = ((cal_todo_s *)record)->interval;
74 rrule->bysecond = ((cal_todo_s *)record)->bysecond;
75 rrule->byminute = ((cal_todo_s *)record)->byminute;
76 rrule->byhour = ((cal_todo_s *)record)->byhour;
77 rrule->byday = ((cal_todo_s *)record)->byday;
78 rrule->bymonthday = ((cal_todo_s *)record)->bymonthday;
79 rrule->byyearday = ((cal_todo_s *)record)->byyearday;
80 rrule->byweekno = ((cal_todo_s *)record)->byweekno;
81 rrule->bymonth = ((cal_todo_s *)record)->bymonth;
82 rrule->bysetpos = ((cal_todo_s *)record)->bysetpos;
83 rrule->wkst = ((cal_todo_s *)record)->wkst;
84 rrule->range_type = ((cal_todo_s *)record)->range_type;
85 switch (rrule->range_type) {
86 case CALENDAR_RANGE_UNTIL:
87 rrule->until = ((cal_todo_s *)record)->until;
89 case CALENDAR_RANGE_COUNT:
90 rrule->count = ((cal_todo_s *)record)->count;
92 case CALENDAR_RANGE_NONE:
102 void cal_db_rrule_set_rrule_to_record(cal_rrule_s *rrule, calendar_record_h record)
104 RET_IF(NULL == rrule);
105 RET_IF(NULL == record);
107 cal_record_s *rec = (cal_record_s *)record;
109 case CAL_RECORD_TYPE_EVENT:
110 ((cal_event_s *)record)->freq = rrule->freq;
111 ((cal_event_s *)record)->range_type = rrule->range_type;
112 ((cal_event_s *)record)->until = rrule->until;
113 ((cal_event_s *)record)->count = rrule->count;
114 ((cal_event_s *)record)->interval = rrule->interval;
115 ((cal_event_s *)record)->bysecond = rrule->bysecond;
116 ((cal_event_s *)record)->byminute = rrule->byminute;
117 ((cal_event_s *)record)->byhour = rrule->byhour;
118 ((cal_event_s *)record)->byday = rrule->byday;
119 ((cal_event_s *)record)->bymonthday = rrule->bymonthday;
120 ((cal_event_s *)record)->byyearday = rrule->byyearday;
121 ((cal_event_s *)record)->byweekno = rrule->byweekno;
122 ((cal_event_s *)record)->bymonth = rrule->bymonth;
123 ((cal_event_s *)record)->bysetpos = rrule->bysetpos;
124 ((cal_event_s *)record)->wkst = rrule->wkst;
126 case CAL_RECORD_TYPE_TODO:
127 ((cal_todo_s *)record)->freq = rrule->freq;
128 ((cal_todo_s *)record)->range_type = rrule->range_type;
129 ((cal_todo_s *)record)->until = rrule->until;
130 ((cal_todo_s *)record)->count = rrule->count;
131 ((cal_todo_s *)record)->interval = rrule->interval;
132 ((cal_todo_s *)record)->bysecond = rrule->bysecond;
133 ((cal_todo_s *)record)->byminute = rrule->byminute;
134 ((cal_todo_s *)record)->byhour = rrule->byhour;
135 ((cal_todo_s *)record)->byday = rrule->byday;
136 ((cal_todo_s *)record)->bymonthday = rrule->bymonthday;
137 ((cal_todo_s *)record)->byyearday = rrule->byyearday;
138 ((cal_todo_s *)record)->byweekno = rrule->byweekno;
139 ((cal_todo_s *)record)->bymonth = rrule->bymonth;
140 ((cal_todo_s *)record)->bysetpos = rrule->bysetpos;
141 ((cal_todo_s *)record)->wkst = rrule->wkst;
148 int _cal_db_rrule_insert_record(int id, cal_rrule_s *rrule)
150 RETV_IF(NULL == rrule, CALENDAR_ERROR_INVALID_PARAMETER);
154 char query[CAL_DB_SQL_MAX_LEN] = {0};
155 char until_datetime[CAL_STR_SHORT_LEN32] = {0};
156 sqlite3_stmt *stmt = NULL;
159 RETVM_IF(rrule == NULL, CALENDAR_ERROR_INVALID_PARAMETER,
160 "Invalid argument: rrule is NULL");
162 snprintf(query, sizeof(query),
164 "event_id, freq, range_type, "
165 "until_type, until_utime, until_datetime, "
167 "bysecond, byminute, byhour, byday, "
168 "bymonthday, byyearday, byweekno, bymonth, "
179 id, rrule->freq, rrule->range_type,
180 rrule->until.type, rrule->until.time.utime,
181 rrule->count, rrule->interval,
184 ret = cal_db_util_query_prepare(query, &stmt);
185 if (CALENDAR_ERROR_NONE != ret) {
186 /* LCOV_EXCL_START */
187 ERR("cal_db_util_query_prepare() Fail(%d)", ret);
188 SECURE("query[%s]", query);
195 if (CALENDAR_TIME_LOCALTIME == rrule->until.type) {
196 snprintf(until_datetime, sizeof(until_datetime), CAL_FORMAT_LOCAL_DATETIME,
197 rrule->until.time.date.year,
198 rrule->until.time.date.month,
199 rrule->until.time.date.mday,
200 rrule->until.time.date.hour,
201 rrule->until.time.date.minute,
202 rrule->until.time.date.second);
203 cal_db_util_stmt_bind_text(stmt, index, until_datetime);
208 cal_db_util_stmt_bind_text(stmt, index, rrule->bysecond);
212 cal_db_util_stmt_bind_text(stmt, index, rrule->byminute);
216 cal_db_util_stmt_bind_text(stmt, index, rrule->byhour);
220 cal_db_util_stmt_bind_text(stmt, index, rrule->byday);
223 if (rrule->bymonthday)
224 cal_db_util_stmt_bind_text(stmt, index, rrule->bymonthday);
227 if (rrule->byyearday)
228 cal_db_util_stmt_bind_text(stmt, index, rrule->byyearday);
232 cal_db_util_stmt_bind_text(stmt, index, rrule->byweekno);
236 cal_db_util_stmt_bind_text(stmt, index, rrule->bymonth);
240 cal_db_util_stmt_bind_text(stmt, index, rrule->bysetpos);
243 ret = cal_db_util_stmt_step(stmt);
244 sqlite3_finalize(stmt);
245 if (CALENDAR_ERROR_NONE != ret) {
246 /* LCOV_EXCL_START */
247 ERR("cal_db_util_stmt_step() Fail(%d)", ret);
252 rrule_id = cal_db_util_last_insert_id();
253 DBG("rrule_id(%d)", rrule_id);
254 return CALENDAR_ERROR_NONE;
257 int cal_db_rrule_get_rrule(int id, cal_rrule_s **rrule)
259 char query[CAL_DB_SQL_MAX_LEN];
261 sqlite3_stmt *stmt = NULL;
262 cal_rrule_s *_rrule = NULL;
263 const unsigned char *temp;
266 snprintf(query, sizeof(query),
267 "SELECT id, event_id, freq, range_type, until_type, until_utime, "
268 "until_datetime, count, interval, bysecond, byminute, byhour, byday, "
269 "bymonthday, byyearday, byweekno, bymonth, bysetpos, wkst "
270 "FROM %s WHERE event_id = %d ",
271 CAL_TABLE_RRULE, id);
273 ret = cal_db_util_query_prepare(query, &stmt);
274 if (CALENDAR_ERROR_NONE != ret) {
275 /* LCOV_EXCL_START */
276 ERR("cal_db_util_query_prepare() Fail(%d)", ret);
277 SECURE("query[%s]", query);
282 ret = cal_db_util_stmt_step(stmt);
283 if (CAL_SQLITE_ROW != ret) {
284 /* LCOV_EXCL_START */
285 ERR("cal_db_util_stmt_step() Fail(%d)", ret);
286 SECURE("query[%s]", query);
287 sqlite3_finalize(stmt);
292 _rrule = calloc(1, sizeof(cal_rrule_s));
293 RETVM_IF(NULL == _rrule, CALENDAR_ERROR_OUT_OF_MEMORY, "calloc() Fail");
296 sqlite3_column_int(stmt, index++); /* id */
297 sqlite3_column_int(stmt, index++); /* event_id */
298 _rrule->freq = sqlite3_column_int(stmt, index++);
300 _rrule->range_type = sqlite3_column_int(stmt, index++);
301 _rrule->until.type = sqlite3_column_int(stmt, index++);
302 _rrule->until.time.utime = sqlite3_column_int64(stmt, index++);
304 temp = sqlite3_column_text(stmt, index++);
306 if (CALENDAR_TIME_LOCALTIME == _rrule->until.type) {
307 sscanf((const char *)temp, CAL_FORMAT_LOCAL_DATETIME,
308 &_rrule->until.time.date.year,
309 &_rrule->until.time.date.month,
310 &_rrule->until.time.date.mday,
311 &_rrule->until.time.date.hour,
312 &_rrule->until.time.date.minute,
313 &_rrule->until.time.date.second);
317 _rrule->count = sqlite3_column_int(stmt, index++);
318 _rrule->interval = sqlite3_column_int(stmt, index++);
320 temp = sqlite3_column_text(stmt, index++);
321 _rrule->bysecond = cal_strdup((const char*)temp);
323 temp = sqlite3_column_text(stmt, index++);
324 _rrule->byminute = cal_strdup((const char*)temp);
326 temp = sqlite3_column_text(stmt, index++);
327 _rrule->byhour = cal_strdup((const char*)temp);
329 temp = sqlite3_column_text(stmt, index++);
330 _rrule->byday = cal_strdup((const char*)temp);
332 temp = sqlite3_column_text(stmt, index++);
333 _rrule->bymonthday = cal_strdup((const char*)temp);
335 temp = sqlite3_column_text(stmt, index++);
336 _rrule->byyearday = cal_strdup((const char*)temp);
338 temp = sqlite3_column_text(stmt, index++);
339 _rrule->byweekno = cal_strdup((const char*)temp);
341 temp = sqlite3_column_text(stmt, index++);
342 _rrule->bymonth = cal_strdup((const char*)temp);
344 temp = sqlite3_column_text(stmt, index++);
345 _rrule->bysetpos = cal_strdup((const char*)temp);
347 _rrule->wkst = sqlite3_column_int(stmt, index++);
349 sqlite3_finalize(stmt);
352 return CALENDAR_ERROR_NONE;
355 static int _cal_db_rrule_delete_record(int id)
357 char query[CAL_DB_SQL_MAX_LEN] = {0};
360 snprintf(query, sizeof(query),
361 "DELETE FROM %s WHERE event_id = %d ",
362 CAL_TABLE_RRULE, id);
364 ret = cal_db_util_query_exec(query);
365 if (CALENDAR_ERROR_NONE != ret) {
366 /* LCOV_EXCL_START */
367 ERR("cal_db_util_query_exec() Fail(%d)", ret);
368 SECURE("[%s]", query);
373 return CALENDAR_ERROR_NONE;
376 static int _cal_db_rrule_has_record(int id, int *has_record)
378 int ret = CALENDAR_ERROR_NONE;
380 char query[CAL_DB_SQL_MAX_LEN] = {0};
382 snprintf(query, sizeof(query),
383 "SELECT count(*) FROM %s WHERE event_id = %d ",
384 CAL_TABLE_RRULE, id);
386 ret = cal_db_util_query_get_first_int_result(query, NULL, &count);
387 if (CALENDAR_ERROR_NONE != ret) {
388 /* LCOV_EXCL_START */
389 ERR("cal_db_util_query_get_first_int_result() failed");
394 *has_record = 0 < count ? 1 : 0;
395 return CALENDAR_ERROR_NONE;
398 static int _cal_db_rrule_update_record(int id, cal_rrule_s *rrule)
401 char query[CAL_DB_SQL_MAX_LEN] = {0};
402 char until_datetime[CAL_STR_SHORT_LEN32] = {0};
403 sqlite3_stmt *stmt = NULL;
405 snprintf(query, sizeof(query),
410 "until_utime = %lld, "
411 "until_datetime = ?, "
424 "WHERE event_id = %d ",
429 rrule->until.time.utime,
435 ret = cal_db_util_query_prepare(query, &stmt);
436 if (CALENDAR_ERROR_NONE != ret) {
437 /* LCOV_EXCL_START */
438 ERR("cal_db_util_query_prepare() Fail(%d)", ret);
439 SECURE("query[%s]", query);
445 if (CALENDAR_TIME_LOCALTIME == rrule->until.type) {
446 snprintf(until_datetime, sizeof(until_datetime), CAL_FORMAT_LOCAL_DATETIME,
447 rrule->until.time.date.year,
448 rrule->until.time.date.month,
449 rrule->until.time.date.mday,
450 rrule->until.time.date.hour,
451 rrule->until.time.date.minute,
452 rrule->until.time.date.second);
453 cal_db_util_stmt_bind_text(stmt, index, until_datetime);
458 cal_db_util_stmt_bind_text(stmt, index, rrule->bysecond);
462 cal_db_util_stmt_bind_text(stmt, index, rrule->byminute);
466 cal_db_util_stmt_bind_text(stmt, index, rrule->byhour);
470 cal_db_util_stmt_bind_text(stmt, index, rrule->byday);
473 if (rrule->bymonthday)
474 cal_db_util_stmt_bind_text(stmt, index, rrule->bymonthday);
477 if (rrule->byyearday)
478 cal_db_util_stmt_bind_text(stmt, index, rrule->byyearday);
482 cal_db_util_stmt_bind_text(stmt, index, rrule->byweekno);
486 cal_db_util_stmt_bind_text(stmt, index, rrule->bymonth);
490 cal_db_util_stmt_bind_text(stmt, index, rrule->bysetpos);
493 ret = cal_db_util_stmt_step(stmt);
494 sqlite3_finalize(stmt);
495 if (CALENDAR_ERROR_NONE != ret) {
496 /* LCOV_EXCL_START */
497 ERR("cal_db_util_stmt_step() Fail(%d)", ret);
502 return CALENDAR_ERROR_NONE;
505 int cal_db_rrule_insert_record(int id, cal_rrule_s *rrule)
507 RETVM_IF(NULL == rrule, CALENDAR_ERROR_INVALID_PARAMETER,
508 "Invalid argument: rrule is NULL");
510 if (CALENDAR_RECURRENCE_NONE != rrule->freq)
511 _cal_db_rrule_insert_record(id, rrule);
513 return CALENDAR_ERROR_NONE;
516 int cal_db_rrule_update_record(int id, cal_rrule_s *rrule)
520 if (NULL == rrule || rrule->freq == CALENDAR_RECURRENCE_NONE) {
522 _cal_db_rrule_delete_record(id);
523 return CALENDAR_ERROR_NONE;
525 _cal_db_rrule_has_record(id, &has_record);
527 _cal_db_rrule_update_record(id, rrule);
529 _cal_db_rrule_insert_record(id, rrule);
531 return CALENDAR_ERROR_NONE;