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.
23 #include "cal_internal.h"
24 #include "cal_typedef.h"
26 #include "cal_record.h"
29 #include "cal_db_util.h"
31 #include "cal_db_query.h"
32 #include "cal_db_rrule.h"
33 #include "cal_db_plugin_alarm_helper.h"
34 #include "cal_db_plugin_attendee_helper.h"
35 #include "cal_db_plugin_extended_helper.h"
36 #include "cal_access_control.h"
37 #include "cal_utils.h"
39 static int _cal_db_todo_insert_record(calendar_record_h record, int* id);
40 static int _cal_db_todo_get_record(int id, calendar_record_h* out_record);
41 static int _cal_db_todo_update_record(calendar_record_h record);
42 static int _cal_db_todo_delete_record(int id);
43 static int _cal_db_todo_get_all_records(int offset, int limit, calendar_list_h* out_list);
44 static int _cal_db_todo_get_records_with_query(calendar_query_h query, int offset, int limit, calendar_list_h* out_list);
45 static int _cal_db_todo_delete_records(int ids[], int count);
46 static int _cal_db_todo_get_count(int *out_count);
47 static int _cal_db_todo_get_count_with_query(calendar_query_h query, int *out_count);
48 static int _cal_db_todo_replace_record(calendar_record_h record, int id);
49 static int _cal_db_todo_replace_records(const calendar_list_h list, int ids[], int count);
54 static void _cal_db_todo_get_stmt(sqlite3_stmt *stmt, bool is_view_table, calendar_record_h record, int *extended);
55 static void _cal_db_todo_get_property_stmt(sqlite3_stmt *stmt,
56 unsigned int property, int *stmt_count, calendar_record_h record);
57 static void _cal_db_todo_get_projection_stmt(sqlite3_stmt *stmt,
58 const unsigned int *projection, const int projection_count,
59 calendar_record_h record);
60 static int _cal_db_todo_update_dirty(calendar_record_h record);
61 static int _cal_db_todo_get_deleted_data(int id, int* calendar_book_id, int* created_ver);
62 static bool _cal_db_todo_check_calendar_book_type(calendar_record_h record);
64 cal_db_plugin_cb_s cal_db_todo_plugin_cb = {
65 .is_query_only = false,
66 .insert_record = _cal_db_todo_insert_record,
67 .get_record = _cal_db_todo_get_record,
68 .update_record = _cal_db_todo_update_record,
69 .delete_record = _cal_db_todo_delete_record,
70 .get_all_records = _cal_db_todo_get_all_records,
71 .get_records_with_query = _cal_db_todo_get_records_with_query,
72 .insert_records = NULL,
73 .update_records = NULL,
74 .delete_records = _cal_db_todo_delete_records,
75 .get_count = _cal_db_todo_get_count,
76 .get_count_with_query = _cal_db_todo_get_count_with_query,
77 .replace_record = _cal_db_todo_replace_record,
78 .replace_records = _cal_db_todo_replace_records
81 static int _cal_db_todo_insert_record(calendar_record_h record, int* id)
86 char query[CAL_DB_SQL_MAX_LEN] = {0};
87 char dtstart_datetime[CAL_STR_SHORT_LEN32] = {0};
88 char dtend_datetime[CAL_STR_SHORT_LEN32] = {0};
89 sqlite3_stmt *stmt = NULL;
90 cal_todo_s* todo = (cal_todo_s*)(record);
91 cal_rrule_s *rrule = NULL;
93 int calendar_book_id = 0;
94 calendar_record_h record_calendar = NULL;
97 RETV_IF(NULL == todo, CALENDAR_ERROR_INVALID_PARAMETER);
98 RETV_IF(false == _cal_db_todo_check_calendar_book_type(record), CALENDAR_ERROR_INVALID_PARAMETER);
100 if (cal_access_control_have_write_permission(todo->calendar_id) == false) {
101 ERR("cal_access_control_have_write_permission() Fail");
102 return CALENDAR_ERROR_PERMISSION_DENIED;
105 ret = calendar_record_get_int(record,
106 _calendar_todo.calendar_book_id, &calendar_book_id);
107 DBG("calendar_book_id(%d)", calendar_book_id);
109 ret = cal_db_get_record(_calendar_book._uri,
110 calendar_book_id, &record_calendar);
111 RETVM_IF(CALENDAR_ERROR_NONE != ret, CALENDAR_ERROR_INVALID_PARAMETER, "calendar_book_id is invalid");
113 calendar_record_destroy(record_calendar, true);
115 has_alarm = cal_db_alarm_has_alarm(todo->alarm_list);
116 input_ver = cal_db_util_get_next_ver();
118 if (CALENDAR_TIME_LOCALTIME == todo->start.type
119 && (0 == todo->start.time.date.hour)
120 && (0 == todo->start.time.date.minute)
121 && (0 == todo->start.time.date.second)
122 && (0 == todo->due.time.date.hour)
123 && (0 == todo->due.time.date.minute)
124 && (0 == todo->due.time.date.second)) {
128 ret = snprintf(query, sizeof(query),
131 "created_ver, changed_ver, "
132 "summary, description, location, categories, "
133 "task_status, priority, "
136 "latitude, longitude, "
137 "created_time, completed_time, progress, "
138 "dtstart_type, dtstart_utime, dtstart_datetime, dtstart_tzid, "
139 "dtend_type, dtend_utime, dtend_datetime, dtend_tzid, "
140 "last_mod, rrule_id, "
141 "has_alarm, system_type, updated, "
142 "sync_data1, sync_data2, sync_data3, sync_data4, "
143 "organizer_name, organizer_email, "
144 "has_attendee, has_extended, "
154 "strftime('%%s', 'now'), %lld, %d, "
157 "strftime('%%s', 'now'), %d, "
164 CAL_SCH_TYPE_TODO, /*event->cal_type,*/
165 input_ver, input_ver,
166 todo->todo_status, todo->priority,
169 todo->latitude, todo->longitude,
170 todo->completed_time, todo->progress,
171 todo->start.type, todo->start.type == CALENDAR_TIME_UTIME ? todo->start.time.utime : 0,
172 todo->due.type, todo->due.type == CALENDAR_TIME_UTIME ? todo->due.time.utime : 0,
173 0 < todo->freq ? 1 : 0,
177 (todo->attendee_list && 0 < todo->attendee_list->count) ? 1 : 0,
178 (todo->extended_list && 0 < todo->extended_list->count) ? 1 : 0,
179 todo->freq, is_allday);
181 ret = cal_db_util_query_prepare(query, &stmt);
182 if (CALENDAR_ERROR_NONE != ret) {
183 ERR("cal_db_util_query_prepare() Fail(%d)", ret);
184 SECURE("query[%s]", query);
191 cal_db_util_stmt_bind_text(stmt, count, todo->summary);
194 if (todo->description)
195 cal_db_util_stmt_bind_text(stmt, count, todo->description);
199 cal_db_util_stmt_bind_text(stmt, count, todo->location);
202 if (todo->categories)
203 cal_db_util_stmt_bind_text(stmt, count, todo->categories);
207 cal_db_util_stmt_bind_text(stmt, count, todo->uid);
210 if (CALENDAR_TIME_LOCALTIME == todo->start.type) {
211 snprintf(dtstart_datetime, sizeof(dtstart_datetime), CAL_FORMAT_LOCAL_DATETIME,
212 todo->start.time.date.year,
213 todo->start.time.date.month,
214 todo->start.time.date.mday,
215 todo->start.time.date.hour,
216 todo->start.time.date.minute,
217 todo->start.time.date.second);
218 cal_db_util_stmt_bind_text(stmt, count, dtstart_datetime);
222 if (todo->start_tzid)
223 cal_db_util_stmt_bind_text(stmt, count, todo->start_tzid);
226 if (CALENDAR_TIME_LOCALTIME == todo->due.type) {
227 snprintf(dtend_datetime, sizeof(dtend_datetime), CAL_FORMAT_LOCAL_DATETIME,
228 todo->due.time.date.year,
229 todo->due.time.date.month,
230 todo->due.time.date.mday,
231 todo->due.time.date.hour,
232 todo->due.time.date.minute,
233 todo->due.time.date.second);
234 cal_db_util_stmt_bind_text(stmt, count, dtend_datetime);
239 cal_db_util_stmt_bind_text(stmt, count, todo->due_tzid);
242 if (todo->sync_data1)
243 cal_db_util_stmt_bind_text(stmt, count, todo->sync_data1);
245 if (todo->sync_data2)
246 cal_db_util_stmt_bind_text(stmt, count, todo->sync_data2);
248 if (todo->sync_data3)
249 cal_db_util_stmt_bind_text(stmt, count, todo->sync_data3);
251 if (todo->sync_data4)
252 cal_db_util_stmt_bind_text(stmt, count, todo->sync_data4);
254 if (todo->organizer_name)
255 cal_db_util_stmt_bind_text(stmt, count, todo->organizer_name);
257 if (todo->organizer_email)
258 cal_db_util_stmt_bind_text(stmt, count, todo->organizer_email);
261 ret = cal_db_util_stmt_step(stmt);
262 if (CALENDAR_ERROR_NONE != ret) {
263 ERR("cal_db_util_stmt_step() Fail(%d)", ret);
264 SECURE("query[%s]", query);
265 sqlite3_finalize(stmt);
269 index = cal_db_util_last_insert_id();
270 sqlite3_finalize(stmt);
272 calendar_record_get_int(record, _calendar_todo.id, &tmp);
273 cal_record_set_int(record, _calendar_todo.id, index);
277 cal_db_rrule_get_rrule_from_record(record, &rrule);
278 cal_db_rrule_insert_record(index, rrule);
280 if (todo->alarm_list && 0 < todo->alarm_list->count) {
281 ret = cal_db_alarm_insert_records(todo->alarm_list, index);
282 WARN_IF(CALENDAR_ERROR_NONE != ret, "cal_db_alarm_insert_records() Fail(%x)", ret);
285 if (todo->attendee_list && 0 < todo->attendee_list->count) {
286 ret = cal_db_attendee_insert_records(todo->attendee_list, index);
287 WARN_IF(CALENDAR_ERROR_NONE != ret, "cal_db_attendee_insert_records() Fail(%x)", ret);
290 if (todo->extended_list && 0 < todo->extended_list->count) {
291 DBG("insert extended");
292 ret = cal_db_extended_insert_records(todo->extended_list, index, CALENDAR_RECORD_TYPE_TODO);
293 WARN_IF(CALENDAR_ERROR_NONE != ret, "cal_db_extended_insert_records() Fail(%x)", ret);
299 cal_db_util_notify(CAL_NOTI_TYPE_TODO);
301 cal_record_set_int(record, _calendar_todo.id, tmp);
303 return CALENDAR_ERROR_NONE;
306 static int _cal_db_todo_get_record(int id, calendar_record_h* out_record)
308 char query[CAL_DB_SQL_MAX_LEN];
309 cal_todo_s *todo = NULL;
310 cal_rrule_s *rrule = NULL;
311 sqlite3_stmt *stmt = NULL;
313 calendar_record_h record_calendar;
314 calendar_book_sync_event_type_e sync_event_type = CALENDAR_BOOK_SYNC_EVENT_FOR_ME;
317 ret = calendar_record_create(_calendar_todo._uri, out_record);
318 if (CALENDAR_ERROR_NONE != ret) {
319 ERR("calendar_record_create() Fail(%d)", ret);
320 return CALENDAR_ERROR_OUT_OF_MEMORY;
323 todo = (cal_todo_s*)(*out_record);
325 snprintf(query, sizeof(query), "SELECT "CAL_QUERY_SCHEDULE_A_ALL" FROM %s AS A "
326 "WHERE id=%d AND (type = %d OR type = %d) AND calendar_id IN "
327 "(select id from %s where deleted = 0)",
329 id, CALENDAR_BOOK_TYPE_TODO, CALENDAR_BOOK_TYPE_NONE,
331 ret = cal_db_util_query_prepare(query, &stmt);
332 if (CALENDAR_ERROR_NONE != ret) {
333 ERR("cal_db_util_query_prepare() Fail(%d)", ret);
334 SECURE("query[%s]", query);
335 calendar_record_destroy(*out_record, true);
340 ret = cal_db_util_stmt_step(stmt);
341 if (CAL_SQLITE_ROW != ret) {
342 ERR("cal_db_util_stmt_step() Fail(%d)", ret);
343 sqlite3_finalize(stmt);
344 calendar_record_destroy(*out_record, true);
346 if (CALENDAR_ERROR_NONE == ret)
347 return CALENDAR_ERROR_DB_RECORD_NOT_FOUND;
351 _cal_db_todo_get_stmt(stmt, false, *out_record, &extended);
352 sqlite3_finalize(stmt);
355 ret = cal_db_get_record(_calendar_book._uri, todo->calendar_id, &record_calendar);
356 if (CALENDAR_ERROR_NONE == ret) {
357 ret = calendar_record_get_int(record_calendar,
358 _calendar_book.sync_event, (int *)&sync_event_type);
359 calendar_record_destroy(record_calendar, true);
361 if (todo->is_deleted == 1 && sync_event_type != CALENDAR_BOOK_SYNC_EVENT_FOR_EVERY_AND_REMAIN
363 calendar_record_destroy(*out_record, true);
365 return CALENDAR_ERROR_DB_RECORD_NOT_FOUND;
368 if (CALENDAR_RECURRENCE_NONE != todo->freq) {
369 ret = cal_db_rrule_get_rrule(todo->index, &rrule);
370 if (CALENDAR_ERROR_NONE == ret) {
371 cal_db_rrule_set_rrule_to_record(rrule, *out_record);
376 if (todo->has_alarm == 1)
377 cal_db_alarm_get_records(todo->index, todo->alarm_list);
379 if (todo->has_attendee == 1)
380 cal_db_attendee_get_records(todo->index, todo->attendee_list);
383 cal_db_extended_get_records(todo->index, CALENDAR_RECORD_TYPE_TODO, todo->extended_list);
385 return CALENDAR_ERROR_NONE;
388 static int _cal_db_todo_update_record(calendar_record_h record)
390 char query[CAL_DB_SQL_MAX_LEN] = {0};
391 char dtstart_datetime[CAL_STR_SHORT_LEN32] = {0};
392 char dtend_datetime[CAL_STR_SHORT_LEN32] = {0};
393 sqlite3_stmt *stmt = NULL;
394 cal_todo_s* todo = (cal_todo_s*)(record);
395 cal_rrule_s *rrule = NULL;
399 RETV_IF(NULL == todo, CALENDAR_ERROR_INVALID_PARAMETER);
401 if (cal_access_control_have_write_permission(todo->calendar_id) == false) {
402 ERR("cal_access_control_have_write_permission() Fail");
403 return CALENDAR_ERROR_PERMISSION_DENIED;
406 if (todo->common.properties_flags != NULL)
407 return _cal_db_todo_update_dirty(record);
409 has_alarm = cal_db_alarm_has_alarm(todo->alarm_list);
411 if (CALENDAR_TIME_LOCALTIME == todo->start.type
412 && (0 == todo->start.time.date.hour)
413 && (0 == todo->start.time.date.minute)
414 && (0 == todo->start.time.date.second)
415 && (0 == todo->due.time.date.hour)
416 && (0 == todo->due.time.date.minute)
417 && (0 == todo->due.time.date.second)) {
421 snprintf(query, sizeof(query), "UPDATE %s SET "
435 "completed_time = %lld,"
437 "dtstart_type = %d, "
438 "dtstart_utime = %lld, "
439 "dtstart_datetime = ?, "
442 "dtend_utime = %lld, "
443 "dtend_datetime = ?, "
445 "last_mod = strftime('%%s', 'now'), "
453 "organizer_name = ?, "
454 "organizer_email = ?, "
456 "has_extended = %d, "
460 cal_db_util_get_next_ver(),
461 CAL_SCH_TYPE_TODO,/*todo->cal_type,*/
468 todo->completed_time,
471 todo->start.type == CALENDAR_TIME_UTIME ? todo->start.time.utime : 0,
473 todo->due.type == CALENDAR_TIME_UTIME ? todo->due.time.utime : 0,
477 (todo->attendee_list && 0 < todo->attendee_list->count) ? 1 : 0,
478 (todo->extended_list && 0 < todo->extended_list->count) ? 1 : 0,
482 ret = cal_db_util_query_prepare(query, &stmt);
483 if (CALENDAR_ERROR_NONE != ret) {
484 ERR("cal_db_util_query_prepare() Fail(%d)", ret);
485 SECURE("query[%s]", query);
492 cal_db_util_stmt_bind_text(stmt, count, todo->summary);
495 if (todo->description)
496 cal_db_util_stmt_bind_text(stmt, count, todo->description);
500 cal_db_util_stmt_bind_text(stmt, count, todo->location);
503 if (todo->categories)
504 cal_db_util_stmt_bind_text(stmt, count, todo->categories);
508 cal_db_util_stmt_bind_text(stmt, count, todo->uid);
511 if (CALENDAR_TIME_LOCALTIME == todo->start.type) {
512 snprintf(dtstart_datetime, sizeof(dtstart_datetime), CAL_FORMAT_LOCAL_DATETIME,
513 todo->start.time.date.year,
514 todo->start.time.date.month,
515 todo->start.time.date.mday,
516 todo->start.time.date.hour,
517 todo->start.time.date.minute,
518 todo->start.time.date.second);
519 cal_db_util_stmt_bind_text(stmt, count, dtstart_datetime);
523 if (todo->start_tzid)
524 cal_db_util_stmt_bind_text(stmt, count, todo->start_tzid);
527 if (CALENDAR_TIME_LOCALTIME == todo->due.type) {
528 snprintf(dtend_datetime, sizeof(dtend_datetime), CAL_FORMAT_LOCAL_DATETIME,
529 todo->due.time.date.year,
530 todo->due.time.date.month,
531 todo->due.time.date.mday,
532 todo->due.time.date.hour,
533 todo->due.time.date.minute,
534 todo->due.time.date.second);
535 cal_db_util_stmt_bind_text(stmt, count, dtend_datetime);
540 cal_db_util_stmt_bind_text(stmt, count, todo->due_tzid);
543 if (todo->sync_data1)
544 cal_db_util_stmt_bind_text(stmt, count, todo->sync_data1);
546 if (todo->sync_data2)
547 cal_db_util_stmt_bind_text(stmt, count, todo->sync_data2);
549 if (todo->sync_data3)
550 cal_db_util_stmt_bind_text(stmt, count, todo->sync_data3);
552 if (todo->sync_data4)
553 cal_db_util_stmt_bind_text(stmt, count, todo->sync_data4);
555 if (todo->organizer_name)
556 cal_db_util_stmt_bind_text(stmt, count, todo->organizer_name);
558 if (todo->organizer_email)
559 cal_db_util_stmt_bind_text(stmt, count, todo->organizer_email);
562 ret = cal_db_util_stmt_step(stmt);
563 sqlite3_finalize(stmt);
564 if (CALENDAR_ERROR_NONE != ret) {
565 ERR("cal_db_util_stmt_step() Fail(%d)", ret);
569 cal_db_rrule_get_rrule_from_record(record, &rrule);
570 cal_db_rrule_update_record(todo->index, rrule);
573 cal_db_alarm_delete_with_id(todo->index);
574 cal_db_attendee_delete_with_id(todo->index);
575 cal_db_extended_delete_with_id(todo->index, CALENDAR_RECORD_TYPE_TODO);
577 if (todo->alarm_list && 0 < todo->alarm_list->count) {
578 ret = cal_db_alarm_insert_records(todo->alarm_list, todo->index);
579 WARN_IF(CALENDAR_ERROR_NONE != ret, "cal_db_alarm_insert_records() Fail(%d)", ret);
582 if (todo->attendee_list && 0 < todo->attendee_list->count) {
583 ret = cal_db_attendee_insert_records(todo->attendee_list, todo->index);
584 WARN_IF(CALENDAR_ERROR_NONE != ret, "cal_db_attendee_insert_records() Fail(%d)", ret);
588 if (todo->extended_list && 0 < todo->extended_list->count) {
589 DBG("insert extended");
590 ret = cal_db_extended_insert_records(todo->extended_list, todo->index, CALENDAR_RECORD_TYPE_TODO);
591 WARN_IF(CALENDAR_ERROR_NONE != ret, "cal_db_extended_insert_records() Fail(%d)", ret);
594 cal_db_util_notify(CAL_NOTI_TYPE_TODO);
596 return CALENDAR_ERROR_NONE;
599 static int _cal_db_todo_delete_record(int id)
602 int calendar_book_id = 0;
603 char query[CAL_DB_SQL_MAX_LEN] = {0};
605 calendar_book_sync_event_type_e sync_event_type = CALENDAR_BOOK_SYNC_EVENT_FOR_ME;
607 RETVM_IF(id < 0, CALENDAR_ERROR_INVALID_PARAMETER, "id(%d) < 0", id);
609 ret = _cal_db_todo_get_deleted_data(id, &calendar_book_id, &created_ver);
610 if (CALENDAR_ERROR_NONE != ret) {
611 DBG("_cal_db_event_get_deleted_data() Fail");
615 if (cal_access_control_have_write_permission(calendar_book_id) == false) {
616 ERR("cal_access_control_have_write_permission() Fail");
617 return CALENDAR_ERROR_PERMISSION_DENIED;
620 snprintf(query, sizeof(query), "SELECT sync_event FROM %s WHERE id = %d ",
621 CAL_TABLE_CALENDAR, calendar_book_id);
622 ret = cal_db_util_query_get_first_int_result(query, NULL, (int *)&sync_event_type);
623 if (CALENDAR_ERROR_NONE != ret) {
624 ERR("cal_db_util_query_get_first_int_result() Fail");
627 DBG("sync_event_type(%d)", sync_event_type);
629 if (sync_event_type == CALENDAR_BOOK_SYNC_EVENT_FOR_EVERY_AND_REMAIN) {
630 DBG("set is_delete");
631 snprintf(query, sizeof(query), "UPDATE %s SET is_deleted = 1, changed_ver = %d, "
632 "last_mod = strftime('%%s','now') WHERE id = %d ",
633 CAL_TABLE_SCHEDULE, cal_db_util_get_next_ver(), id);
635 ret = cal_db_util_query_exec(query);
636 if (CALENDAR_ERROR_NONE != ret) {
637 ERR("cal_db_util_query_exec() Fail(%d)", ret);
638 SECURE("[%s]", query);
641 DBG("attendee, alarm and rrule will be deleted by trigger after sync clean");
643 cal_db_util_get_next_ver();
646 snprintf(query, sizeof(query), "DELETE FROM %s WHERE id = %d ", CAL_TABLE_SCHEDULE, id);
647 ret = cal_db_util_query_exec(query);
648 if (CALENDAR_ERROR_NONE != ret) {
649 ERR("cal_db_util_query_exec() Fail(%d)", ret);
650 SECURE("[%s]", query);
653 DBG("attendee, alarm and rrule is deleted by trigger");
655 cal_db_util_notify(CAL_NOTI_TYPE_TODO);
657 return CALENDAR_ERROR_NONE;
660 static int _cal_db_todo_replace_record(calendar_record_h record, int id)
662 int ret = CALENDAR_ERROR_NONE;
663 char query[CAL_DB_SQL_MAX_LEN] = {0};
664 char dtstart_datetime[CAL_STR_SHORT_LEN32] = {0};
665 char dtend_datetime[CAL_STR_SHORT_LEN32] = {0};
666 sqlite3_stmt *stmt = NULL;
667 cal_todo_s* todo = (cal_todo_s*)(record);
668 cal_rrule_s *rrule = NULL;
671 RETV_IF(NULL == todo, CALENDAR_ERROR_INVALID_PARAMETER);
674 if (cal_access_control_have_write_permission(todo->calendar_id) == false) {
675 ERR("cal_access_control_have_write_permission() Fail");
676 return CALENDAR_ERROR_PERMISSION_DENIED;
679 if (todo->common.properties_flags)
680 return _cal_db_todo_update_dirty(record);
683 if (CALENDAR_TIME_LOCALTIME == todo->start.type
684 && (0 == todo->start.time.date.hour)
685 && (0 == todo->start.time.date.minute)
686 && (0 == todo->start.time.date.second)
687 && (0 == todo->due.time.date.hour)
688 && (0 == todo->due.time.date.minute)
689 && (0 == todo->due.time.date.second)) {
693 has_alarm = cal_db_alarm_has_alarm(todo->alarm_list);
694 snprintf(query, sizeof(query), "UPDATE %s SET "
708 "completed_time = %lld,"
710 "dtstart_type = %d, "
711 "dtstart_utime = %lld, "
712 "dtstart_datetime = ?, "
715 "dtend_utime = %lld, "
716 "dtend_datetime = ?, "
718 "last_mod = strftime('%%s', 'now'), "
726 "organizer_name = ?, "
727 "organizer_email = ?, "
729 "has_extended = %d, "
733 cal_db_util_get_next_ver(),
734 CAL_SCH_TYPE_TODO,/*todo->cal_type,*/
741 todo->completed_time,
744 todo->start.type == CALENDAR_TIME_UTIME ? todo->start.time.utime : 0,
746 todo->due.type == CALENDAR_TIME_UTIME ? todo->due.time.utime : 0,
750 (todo->attendee_list && 0 < todo->attendee_list->count) ? 1 : 0,
751 (todo->extended_list && 0 < todo->extended_list->count) ? 1 : 0,
755 ret = cal_db_util_query_prepare(query, &stmt);
756 if (CALENDAR_ERROR_NONE != ret) {
757 ERR("cal_db_util_query_prepare() Fail(%d)", ret);
758 SECURE("query[%s]", query);
765 cal_db_util_stmt_bind_text(stmt, count, todo->summary);
768 if (todo->description)
769 cal_db_util_stmt_bind_text(stmt, count, todo->description);
773 cal_db_util_stmt_bind_text(stmt, count, todo->location);
776 if (todo->categories)
777 cal_db_util_stmt_bind_text(stmt, count, todo->categories);
781 cal_db_util_stmt_bind_text(stmt, count, todo->uid);
784 if (CALENDAR_TIME_LOCALTIME == todo->start.type) {
785 snprintf(dtstart_datetime, sizeof(dtstart_datetime), CAL_FORMAT_LOCAL_DATETIME,
786 todo->start.time.date.year,
787 todo->start.time.date.month,
788 todo->start.time.date.mday,
789 todo->start.time.date.hour,
790 todo->start.time.date.minute,
791 todo->start.time.date.second);
792 cal_db_util_stmt_bind_text(stmt, count, dtstart_datetime);
796 if (todo->start_tzid)
797 cal_db_util_stmt_bind_text(stmt, count, todo->start_tzid);
800 if (CALENDAR_TIME_LOCALTIME == todo->due.type) {
801 snprintf(dtend_datetime, sizeof(dtend_datetime), CAL_FORMAT_LOCAL_DATETIME,
802 todo->due.time.date.year,
803 todo->due.time.date.month,
804 todo->due.time.date.mday,
805 todo->due.time.date.hour,
806 todo->due.time.date.minute,
807 todo->due.time.date.second);
808 cal_db_util_stmt_bind_text(stmt, count, dtend_datetime);
813 cal_db_util_stmt_bind_text(stmt, count, todo->due_tzid);
816 if (todo->sync_data1)
817 cal_db_util_stmt_bind_text(stmt, count, todo->sync_data1);
819 if (todo->sync_data2)
820 cal_db_util_stmt_bind_text(stmt, count, todo->sync_data2);
822 if (todo->sync_data3)
823 cal_db_util_stmt_bind_text(stmt, count, todo->sync_data3);
825 if (todo->sync_data4)
826 cal_db_util_stmt_bind_text(stmt, count, todo->sync_data4);
828 if (todo->organizer_name)
829 cal_db_util_stmt_bind_text(stmt, count, todo->organizer_name);
831 if (todo->organizer_email)
832 cal_db_util_stmt_bind_text(stmt, count, todo->organizer_email);
835 ret = cal_db_util_stmt_step(stmt);
836 sqlite3_finalize(stmt);
837 if (CALENDAR_ERROR_NONE != ret) {
838 ERR("cal_db_util_stmt_step() Fail(%d)", ret);
842 cal_db_rrule_get_rrule_from_record(record, &rrule);
843 cal_db_rrule_update_record(id, rrule);
846 cal_db_alarm_delete_with_id(id);
847 cal_db_attendee_delete_with_id(id);
848 cal_db_extended_delete_with_id(id, CALENDAR_RECORD_TYPE_TODO);
850 if (todo->alarm_list && 0 < todo->alarm_list->count) {
851 ret = cal_db_alarm_insert_records(todo->alarm_list, id);
852 WARN_IF(CALENDAR_ERROR_NONE != ret, "cal_db_alarm_insert_records() Fail(%x)", ret);
855 if (todo->attendee_list && 0 < todo->attendee_list->count) {
856 ret = cal_db_attendee_insert_records(todo->attendee_list, id);
857 WARN_IF(CALENDAR_ERROR_NONE != ret, "cal_db_attendee_insert_records() Fail(%x)", ret);
860 if (todo->extended_list && 0 < todo->extended_list->count) {
861 DBG("insert extended");
862 ret = cal_db_extended_insert_records(todo->extended_list, id, CALENDAR_RECORD_TYPE_TODO);
863 WARN_IF(CALENDAR_ERROR_NONE != ret, "cal_db_extended_insert_records() Fail(%d)", ret);
866 cal_db_util_notify(CAL_NOTI_TYPE_TODO);
868 return CALENDAR_ERROR_NONE;
871 static int _cal_db_todo_get_all_records(int offset, int limit, calendar_list_h* out_list)
873 int ret = CALENDAR_ERROR_NONE;
874 char offsetquery[CAL_DB_SQL_MAX_LEN] = {0};
875 char limitquery[CAL_DB_SQL_MAX_LEN] = {0};
876 sqlite3_stmt *stmt = NULL;
878 RETV_IF(NULL == out_list, CALENDAR_ERROR_INVALID_PARAMETER);
880 ret = calendar_list_create(out_list);
881 RETVM_IF(CALENDAR_ERROR_NONE != ret, ret, "calendar_list_create() Fail(%d)", ret);
884 snprintf(offsetquery, sizeof(offsetquery), "OFFSET %d", offset);
887 snprintf(limitquery, sizeof(limitquery), "LIMIT %d", limit);
889 char *query_str = NULL;
890 cal_db_append_string(&query_str, "SELECT * FROM");
891 cal_db_append_string(&query_str, CAL_VIEW_TABLE_TODO);
892 cal_db_append_string(&query_str, limitquery);
893 cal_db_append_string(&query_str, offsetquery);
895 ret = cal_db_util_query_prepare(query_str, &stmt);
896 if (CALENDAR_ERROR_NONE != ret) {
897 ERR("cal_db_util_query_prepare() Fail(%d)", ret);
898 SECURE("query[%s]", query_str);
899 calendar_list_destroy(*out_list, true);
905 while (CAL_SQLITE_ROW == cal_db_util_stmt_step(stmt)) {
906 calendar_record_h record;
908 ret = calendar_record_create(_calendar_todo._uri, &record);
909 if (CALENDAR_ERROR_NONE != ret) {
910 calendar_list_destroy(*out_list, true);
912 sqlite3_finalize(stmt);
916 _cal_db_todo_get_stmt(stmt, true, record, &extended);
919 int has_attendee = 0, has_alarm = 0;
921 cal_todo_s* ptodo = (cal_todo_s*) record;
922 calendar_record_get_int(record, _calendar_todo.id, &record_id);
923 if (CALENDAR_ERROR_NONE == calendar_record_get_int(record, _calendar_todo.has_attendee, &has_attendee)) {
924 if (has_attendee == 1)
925 cal_db_attendee_get_records(record_id, ptodo->attendee_list);
927 if (CALENDAR_ERROR_NONE == calendar_record_get_int(record, _calendar_todo.has_alarm, &has_alarm)) {
929 cal_db_alarm_get_records(record_id, ptodo->alarm_list);
933 cal_db_extended_get_records(record_id, CALENDAR_RECORD_TYPE_TODO, ptodo->extended_list);
935 ret = calendar_list_add(*out_list, record);
936 if (CALENDAR_ERROR_NONE != ret) {
937 calendar_list_destroy(*out_list, true);
939 calendar_record_destroy(record, true);
940 sqlite3_finalize(stmt);
945 sqlite3_finalize(stmt);
948 return CALENDAR_ERROR_NONE;
951 static int _cal_db_todo_get_records_with_query(calendar_query_h query, int offset, int limit, calendar_list_h* out_list)
953 cal_query_s *que = NULL;
954 int ret = CALENDAR_ERROR_NONE;
955 char *condition = NULL;
956 char *projection = NULL;
957 GSList *bind_text = NULL, *cursor = NULL;
958 sqlite3_stmt *stmt = NULL;
962 que = (cal_query_s *)query;
964 if (CAL_STRING_EQUAL == strcmp(que->view_uri, CALENDAR_VIEW_TODO)) {
965 table_name = cal_strdup(CAL_VIEW_TABLE_TODO);
966 } else if (CAL_STRING_EQUAL == strcmp(que->view_uri, CALENDAR_VIEW_TODO_CALENDAR)) {
967 table_name = cal_strdup(CAL_VIEW_TABLE_TODO_CALENDAR);
969 ERR("uri(%s) not support get records with query", que->view_uri);
970 return CALENDAR_ERROR_INVALID_PARAMETER;
975 ret = cal_db_query_create_condition(query, &condition, &bind_text);
976 if (CALENDAR_ERROR_NONE != ret) {
977 ERR("cal_db_query_create_condition() Fail(%d), ret");
978 CAL_FREE(table_name);
983 /* make: projection */
984 ret = cal_db_query_create_projection(query, &projection);
986 char *query_str = NULL;
988 /* query: projection */
990 cal_db_append_string(&query_str, "SELECT");
991 cal_db_append_string(&query_str, projection);
992 cal_db_append_string(&query_str, "FROM");
993 cal_db_append_string(&query_str, table_name);
994 CAL_FREE(projection);
996 cal_db_append_string(&query_str, "SELECT * FROM");
997 cal_db_append_string(&query_str, table_name);
999 CAL_FREE(table_name);
1001 /* query: condition */
1003 cal_db_append_string(&query_str, "WHERE (");
1004 cal_db_append_string(&query_str, condition);
1005 cal_db_append_string(&query_str, ")");
1010 ret = cal_db_query_create_order(query, condition, &order);
1012 cal_db_append_string(&query_str, order);
1015 CAL_FREE(condition);
1018 char buf[CAL_STR_SHORT_LEN32] = {0};
1020 snprintf(buf, sizeof(buf), "LIMIT %d", limit);
1021 cal_db_append_string(&query_str, buf);
1024 snprintf(buf, sizeof(buf), "OFFSET %d", offset);
1025 cal_db_append_string(&query_str, buf);
1030 ret = cal_db_util_query_prepare(query_str, &stmt);
1031 if (CALENDAR_ERROR_NONE != ret) {
1032 ERR("cal_db_util_query_prepare() Fail(%d)", ret);
1033 SECURE("query[%s]", query_str);
1035 g_slist_free_full(bind_text, free);
1044 g_slist_length(bind_text);
1045 for (cursor = bind_text, i = 1; cursor; cursor = cursor->next, i++)
1046 cal_db_util_stmt_bind_text(stmt, i, cursor->data);
1049 ret = calendar_list_create(out_list);
1050 if (CALENDAR_ERROR_NONE != ret) {
1052 g_slist_free_full(bind_text, free);
1055 ERR("calendar_list_create() Fail");
1056 sqlite3_finalize(stmt);
1057 CAL_FREE(query_str);
1061 while (CAL_SQLITE_ROW == cal_db_util_stmt_step(stmt)) {
1062 calendar_record_h record;
1064 int attendee = 1, alarm = 1;
1065 ret = calendar_record_create(_calendar_todo._uri, &record);
1066 if (CALENDAR_ERROR_NONE != ret) {
1067 calendar_list_destroy(*out_list, true);
1071 g_slist_free_full(bind_text, free);
1074 sqlite3_finalize(stmt);
1075 CAL_FREE(query_str);
1078 if (0 < que->projection_count) {
1079 cal_record_set_projection(record,
1080 que->projection, que->projection_count, que->property_count);
1082 _cal_db_todo_get_projection_stmt(stmt,
1083 que->projection, que->projection_count,
1086 cal_todo_s *todo = NULL;
1087 _cal_db_todo_get_stmt(stmt, true, record, &extended);
1088 todo = (cal_todo_s*)(record);
1090 attendee = todo->has_attendee;
1091 alarm = todo->has_alarm;
1096 if (cal_db_query_find_projection_property(query, CAL_PROPERTY_TODO_CALENDAR_ALARM) == true && alarm == 1) {
1097 cal_todo_s* todo = (cal_todo_s*) record;
1098 cal_db_alarm_get_records(todo->index, todo->alarm_list);
1100 if (cal_db_query_find_projection_property(query, CAL_PROPERTY_TODO_CALENDAR_ATTENDEE) == true && attendee == 1) {
1101 cal_todo_s* todo = (cal_todo_s*) record;
1102 cal_db_attendee_get_records(todo->index, todo->attendee_list);
1104 if (cal_db_query_find_projection_property(query, CAL_PROPERTY_TODO_EXTENDED) == true && extended == 1) {
1105 cal_todo_s* todo = (cal_todo_s*) record;
1106 cal_db_extended_get_records(todo->index, CALENDAR_RECORD_TYPE_TODO, todo->extended_list);
1109 ret = calendar_list_add(*out_list, record);
1110 if (CALENDAR_ERROR_NONE != ret) {
1111 calendar_list_destroy(*out_list, true);
1113 calendar_record_destroy(record, true);
1116 g_slist_free_full(bind_text, free);
1119 sqlite3_finalize(stmt);
1120 CAL_FREE(query_str);
1126 g_slist_free_full(bind_text, free);
1130 sqlite3_finalize(stmt);
1131 CAL_FREE(query_str);
1133 return CALENDAR_ERROR_NONE;
1136 static int _cal_db_todo_delete_records(int ids[], int count)
1140 for (i = 0; i < count; i++) {
1141 ret = _cal_db_todo_delete_record(ids[i]);
1142 if (CALENDAR_ERROR_NONE != ret) {
1143 ERR("_cal_db_todo_delete_record() Fail(%d)", ret);
1144 return CALENDAR_ERROR_DB_FAILED;
1147 return CALENDAR_ERROR_NONE;
1150 static int _cal_db_todo_get_count(int *out_count)
1152 RETV_IF(NULL == out_count, CALENDAR_ERROR_INVALID_PARAMETER);
1154 char *query_str = NULL;
1155 cal_db_append_string(&query_str, "SELECT count(*) FROM");
1156 cal_db_append_string(&query_str, CAL_VIEW_TABLE_TODO);
1160 ret = cal_db_util_query_get_first_int_result(query_str, NULL, &count);
1161 if (CALENDAR_ERROR_NONE != ret) {
1162 ERR("cal_db_util_query_get_first_int_result() Fail");
1163 CAL_FREE(query_str);
1166 DBG("count(%d) str[%s]", count, query_str);
1167 CAL_FREE(query_str);
1170 return CALENDAR_ERROR_NONE;
1173 static int _cal_db_todo_replace_records(const calendar_list_h list, int ids[], int count)
1175 calendar_record_h record;
1180 ERR("Invalid argument: list is NULL");
1181 return CALENDAR_ERROR_INVALID_PARAMETER;
1184 ret = calendar_list_first(list);
1185 if (CALENDAR_ERROR_NONE != ret) {
1186 ERR("list first error");
1190 for (i = 0; i < count; i++) {
1191 if (CALENDAR_ERROR_NONE == calendar_list_get_current_record_p(list, &record)) {
1192 ret = _cal_db_todo_replace_record(record, ids[i]);
1193 if (CALENDAR_ERROR_NONE != ret) {
1194 ERR("_cal_db_todo_replace_record() Fail(%d)", ret);
1195 return CALENDAR_ERROR_DB_FAILED;
1198 if (CALENDAR_ERROR_NO_DATA != calendar_list_next(list))
1202 return CALENDAR_ERROR_NONE;
1206 static int _cal_db_todo_get_count_with_query(calendar_query_h query, int *out_count)
1208 cal_query_s *que = NULL;
1209 int ret = CALENDAR_ERROR_NONE;
1210 char *condition = NULL;
1213 GSList *bind_text = NULL;
1215 que = (cal_query_s *)query;
1217 if (CAL_STRING_EQUAL == strcmp(que->view_uri, CALENDAR_VIEW_TODO)) {
1218 table_name = cal_strdup(CAL_VIEW_TABLE_TODO);
1219 } else if (CAL_STRING_EQUAL == strcmp(que->view_uri, CALENDAR_VIEW_TODO_CALENDAR)) {
1220 table_name = cal_strdup(CAL_VIEW_TABLE_TODO_CALENDAR);
1222 ERR("uri(%s) not support get records with query", que->view_uri);
1223 return CALENDAR_ERROR_INVALID_PARAMETER;
1228 ret = cal_db_query_create_condition(query, &condition, &bind_text);
1229 if (CALENDAR_ERROR_NONE != ret) {
1230 CAL_FREE(table_name);
1231 ERR("cal_db_query_create_condition() Fail(%d), ret");
1236 char *query_str = NULL;
1238 cal_db_append_string(&query_str, "SELECT count(*) FROM");
1239 cal_db_append_string(&query_str, table_name);
1240 CAL_FREE(table_name);
1242 /* query: condition */
1244 cal_db_append_string(&query_str, "WHERE (");
1245 cal_db_append_string(&query_str, condition);
1246 cal_db_append_string(&query_str, ")");
1247 CAL_FREE(condition);
1251 ret = cal_db_util_query_get_first_int_result(query_str, bind_text, &count);
1252 if (CALENDAR_ERROR_NONE != ret) {
1253 ERR("cal_db_util_query_get_first_int_result() Fail");
1255 g_slist_free_full(bind_text, free);
1258 CAL_FREE(query_str);
1261 DBG("count(%d) str[%s]", count, query_str);
1263 if (out_count) *out_count = count;
1265 g_slist_free_full(bind_text, free);
1269 CAL_FREE(query_str);
1270 return CALENDAR_ERROR_NONE;
1273 static void _cal_db_todo_get_stmt(sqlite3_stmt *stmt, bool is_view_table, calendar_record_h record, int *extended)
1275 cal_todo_s *todo = NULL;
1276 const unsigned char *temp;
1279 todo = (cal_todo_s*)(record);
1281 todo->index = sqlite3_column_int(stmt, count++);
1282 sqlite3_column_int(stmt, count++);
1284 temp = sqlite3_column_text(stmt, count++);
1285 todo->summary = cal_strdup((const char*)temp);
1286 temp = sqlite3_column_text(stmt, count++);
1287 todo->description = cal_strdup((const char*)temp);
1289 temp = sqlite3_column_text(stmt, count++);
1290 todo->location = cal_strdup((const char*)temp);
1292 temp = sqlite3_column_text(stmt, count++);
1293 todo->categories = cal_strdup((const char*)temp);
1295 sqlite3_column_text(stmt, count++);
1297 todo->todo_status = sqlite3_column_int(stmt, count++);
1298 todo->priority = sqlite3_column_int(stmt, count++);
1299 sqlite3_column_int(stmt, count++);
1300 sqlite3_column_int(stmt, count++);
1301 sqlite3_column_int(stmt, count++);
1302 todo->sensitivity = sqlite3_column_int(stmt, count++);
1304 temp = sqlite3_column_text(stmt, count++);
1305 todo->uid = cal_strdup((const char*)temp);
1307 temp = sqlite3_column_text(stmt, count++);
1308 todo->organizer_name = cal_strdup((const char*)temp);
1310 temp = sqlite3_column_text(stmt, count++);
1311 todo->organizer_email = cal_strdup((const char*)temp);
1313 sqlite3_column_int(stmt, count++);
1315 todo->calendar_id = sqlite3_column_int(stmt, count++);
1317 sqlite3_column_int(stmt, count++);
1319 todo->latitude = sqlite3_column_double(stmt, count++);
1320 todo->longitude = sqlite3_column_double(stmt, count++);
1321 sqlite3_column_int(stmt, count++);
1323 todo->created_time = sqlite3_column_int64(stmt, count++);
1325 todo->completed_time = sqlite3_column_int64(stmt, count++);
1327 todo->progress = sqlite3_column_int(stmt, count++);
1329 sqlite3_column_int(stmt, count++);
1330 sqlite3_column_int(stmt, count++);
1331 todo->is_deleted = sqlite3_column_int(stmt, count++);
1333 todo->start.type = sqlite3_column_int(stmt, count++);
1335 if (todo->start.type == CALENDAR_TIME_UTIME) {
1336 todo->start.time.utime = sqlite3_column_int64(stmt, count++);
1337 count++; /* dtstart_datetime */
1339 count++; /* dtstart_utime */
1340 temp = sqlite3_column_text(stmt, count++);
1342 sscanf((const char *)temp, CAL_FORMAT_LOCAL_DATETIME, &(todo->start.time.date.year),
1343 &(todo->start.time.date.month), &(todo->start.time.date.mday),
1344 &(todo->start.time.date.hour), &(todo->start.time.date.minute),
1345 &(todo->start.time.date.second));
1349 temp = sqlite3_column_text(stmt, count++);
1350 todo->start_tzid = cal_strdup((const char*)temp);
1351 todo->due.type = sqlite3_column_int(stmt, count++);
1352 if (todo->due.type == CALENDAR_TIME_UTIME) {
1353 todo->due.time.utime = sqlite3_column_int64(stmt, count++);
1354 count++; /* datatime */
1357 temp = sqlite3_column_text(stmt, count++);
1359 sscanf((const char *)temp, CAL_FORMAT_LOCAL_DATETIME, &(todo->due.time.date.year),
1360 &(todo->due.time.date.month), &(todo->due.time.date.mday),
1361 &(todo->due.time.date.hour), &(todo->due.time.date.minute),
1362 &(todo->due.time.date.second));
1365 temp = sqlite3_column_text(stmt, count++);
1366 todo->due_tzid = cal_strdup((const char*)temp);
1368 todo->last_mod = sqlite3_column_int64(stmt, count++);
1369 sqlite3_column_int(stmt, count++);
1371 sqlite3_column_text(stmt, count++);
1372 sqlite3_column_text(stmt, count++);
1373 todo->has_attendee = sqlite3_column_int(stmt, count++);
1374 todo->has_alarm = sqlite3_column_int(stmt, count++);
1375 todo->system_type = sqlite3_column_int(stmt, count++);
1376 todo->updated = sqlite3_column_int(stmt, count++);
1377 temp = sqlite3_column_text(stmt, count++);
1378 todo->sync_data1 = cal_strdup((const char*)temp);
1379 temp = sqlite3_column_text(stmt, count++);
1380 todo->sync_data2 = cal_strdup((const char*)temp);
1381 temp = sqlite3_column_text(stmt, count++);
1382 todo->sync_data3 = cal_strdup((const char*)temp);
1383 temp = sqlite3_column_text(stmt, count++);
1384 todo->sync_data4 = cal_strdup((const char*)temp);
1386 sqlite3_column_int(stmt, count++);
1389 *extended = sqlite3_column_int(stmt, count++);
1391 todo->freq = sqlite3_column_int(stmt, count++);
1392 todo->is_allday = sqlite3_column_int(stmt, count++);
1394 if (is_view_table == true) {
1395 if (todo->freq <= 0)
1398 todo->range_type = sqlite3_column_int(stmt, count++);
1399 todo->until.type = sqlite3_column_int(stmt, count++);
1400 todo->until.time.utime = sqlite3_column_int64(stmt, count++);
1402 temp = sqlite3_column_text(stmt, count++);
1404 if (CALENDAR_TIME_LOCALTIME == todo->until.type) {
1405 sscanf((const char *)temp, CAL_FORMAT_LOCAL_DATETIME,
1406 &todo->until.time.date.year,
1407 &todo->until.time.date.month,
1408 &todo->until.time.date.mday,
1409 &todo->until.time.date.hour,
1410 &todo->until.time.date.minute,
1411 &todo->until.time.date.second);
1415 todo->count = sqlite3_column_int(stmt, count++);
1416 todo->interval = sqlite3_column_int(stmt, count++);
1418 temp = sqlite3_column_text(stmt, count++);
1419 todo->bysecond = cal_strdup((const char*)temp);
1421 temp = sqlite3_column_text(stmt, count++);
1422 todo->byminute = cal_strdup((const char*)temp);
1424 temp = sqlite3_column_text(stmt, count++);
1425 todo->byhour = cal_strdup((const char*)temp);
1427 temp = sqlite3_column_text(stmt, count++);
1428 todo->byday = cal_strdup((const char*)temp);
1430 temp = sqlite3_column_text(stmt, count++);
1431 todo->bymonthday = cal_strdup((const char*)temp);
1433 temp = sqlite3_column_text(stmt, count++);
1434 todo->byyearday = cal_strdup((const char*)temp);
1436 temp = sqlite3_column_text(stmt, count++);
1437 todo->byweekno = cal_strdup((const char*)temp);
1439 temp = sqlite3_column_text(stmt, count++);
1440 todo->bymonth = cal_strdup((const char*)temp);
1442 temp = sqlite3_column_text(stmt, count++);
1443 todo->bysetpos = cal_strdup((const char*)temp);
1445 todo->wkst = sqlite3_column_int(stmt, count++);
1447 sqlite3_column_int(stmt, count++);
1451 static void _cal_db_todo_get_property_stmt(sqlite3_stmt *stmt,
1452 unsigned int property, int *stmt_count, calendar_record_h record)
1454 cal_todo_s *todo = NULL;
1455 const unsigned char *temp;
1457 todo = (cal_todo_s*)(record);
1460 case CAL_PROPERTY_TODO_ID:
1461 todo->index = sqlite3_column_int(stmt, *stmt_count);
1463 case CAL_PROPERTY_TODO_CALENDAR_ID:
1464 todo->calendar_id = sqlite3_column_int(stmt, *stmt_count);
1466 case CAL_PROPERTY_TODO_SUMMARY:
1467 temp = sqlite3_column_text(stmt, *stmt_count);
1468 todo->summary = cal_strdup((const char*)temp);
1470 case CAL_PROPERTY_TODO_DESCRIPTION:
1471 temp = sqlite3_column_text(stmt, *stmt_count);
1472 todo->description = cal_strdup((const char*)temp);
1474 case CAL_PROPERTY_TODO_LOCATION:
1475 temp = sqlite3_column_text(stmt, *stmt_count);
1476 todo->location = cal_strdup((const char*)temp);
1478 case CAL_PROPERTY_TODO_CATEGORIES:
1479 temp = sqlite3_column_text(stmt, *stmt_count);
1480 todo->categories = cal_strdup((const char*)temp);
1482 case CAL_PROPERTY_TODO_TODO_STATUS:
1483 todo->todo_status = sqlite3_column_int(stmt, *stmt_count);
1485 case CAL_PROPERTY_TODO_PRIORITY:
1486 todo->priority = sqlite3_column_int(stmt, *stmt_count);
1488 case CAL_PROPERTY_TODO_SENSITIVITY:
1489 todo->sensitivity = sqlite3_column_int(stmt, *stmt_count);
1491 case CAL_PROPERTY_TODO_UID:
1492 temp = sqlite3_column_text(stmt, *stmt_count);
1493 todo->uid = cal_strdup((const char*)temp);
1495 case CAL_PROPERTY_TODO_LATITUDE:
1496 todo->latitude = sqlite3_column_double(stmt, *stmt_count);
1498 case CAL_PROPERTY_TODO_LONGITUDE:
1499 todo->longitude = sqlite3_column_double(stmt, *stmt_count);
1501 case CAL_PROPERTY_TODO_PROGRESS:
1502 todo->progress = sqlite3_column_int(stmt, *stmt_count);
1504 case CAL_PROPERTY_TODO_COMPLETED_TIME:
1505 todo->completed_time = sqlite3_column_int64(stmt, *stmt_count);
1507 case CAL_PROPERTY_TODO_CREATED_TIME:
1508 todo->created_time = sqlite3_column_int64(stmt, *stmt_count);
1510 case CAL_PROPERTY_TODO_LAST_MODIFIED_TIME:
1511 todo->last_mod = sqlite3_column_int64(stmt, *stmt_count);
1513 case CAL_PROPERTY_TODO_IS_DELETED:
1514 todo->is_deleted = sqlite3_column_int(stmt, *stmt_count);
1516 case CAL_PROPERTY_TODO_FREQ:
1517 todo->freq = sqlite3_column_int(stmt, *stmt_count);
1519 case CAL_PROPERTY_TODO_RANGE_TYPE:
1520 todo->range_type = sqlite3_column_int(stmt, *stmt_count);
1522 case CAL_PROPERTY_TODO_UNTIL:
1523 todo->until.type = sqlite3_column_int(stmt, *stmt_count);
1524 if (todo->until.type == CALENDAR_TIME_UTIME) {
1525 *stmt_count = *stmt_count+1;
1526 todo->until.time.utime = sqlite3_column_int64(stmt, *stmt_count);
1527 *stmt_count = *stmt_count+1; /* until_datetime */
1529 *stmt_count = *stmt_count+1;
1530 *stmt_count = *stmt_count+1;
1531 temp = sqlite3_column_text(stmt, *stmt_count);
1533 sscanf((const char *)temp, CAL_FORMAT_LOCAL_DATETIME, &(todo->until.time.date.year),
1534 &(todo->until.time.date.month), &(todo->until.time.date.mday),
1535 &(todo->until.time.date.hour), &(todo->until.time.date.minute),
1536 &(todo->until.time.date.second));
1540 case CAL_PROPERTY_TODO_COUNT:
1541 todo->count = sqlite3_column_int(stmt, *stmt_count);
1543 case CAL_PROPERTY_TODO_INTERVAL:
1544 todo->interval = sqlite3_column_int(stmt, *stmt_count);
1546 case CAL_PROPERTY_TODO_BYSECOND:
1547 temp = sqlite3_column_text(stmt, *stmt_count);
1548 todo->bysecond = cal_strdup((const char*)temp);
1550 case CAL_PROPERTY_TODO_BYMINUTE:
1551 temp = sqlite3_column_text(stmt, *stmt_count);
1552 todo->byminute = cal_strdup((const char*)temp);
1554 case CAL_PROPERTY_TODO_BYHOUR:
1555 temp = sqlite3_column_text(stmt, *stmt_count);
1556 todo->byhour = cal_strdup((const char*)temp);
1558 case CAL_PROPERTY_TODO_BYDAY:
1559 temp = sqlite3_column_text(stmt, *stmt_count);
1560 todo->byday = cal_strdup((const char*)temp);
1562 case CAL_PROPERTY_TODO_BYMONTHDAY:
1563 temp = sqlite3_column_text(stmt, *stmt_count);
1564 todo->bymonthday = cal_strdup((const char*)temp);
1566 case CAL_PROPERTY_TODO_BYYEARDAY:
1567 temp = sqlite3_column_text(stmt, *stmt_count);
1568 todo->byyearday = cal_strdup((const char*)temp);
1570 case CAL_PROPERTY_TODO_BYWEEKNO:
1571 temp = sqlite3_column_text(stmt, *stmt_count);
1572 todo->byweekno = cal_strdup((const char*)temp);
1574 case CAL_PROPERTY_TODO_BYMONTH:
1575 temp = sqlite3_column_text(stmt, *stmt_count);
1576 todo->bymonth = cal_strdup((const char*)temp);
1578 case CAL_PROPERTY_TODO_BYSETPOS:
1579 temp = sqlite3_column_text(stmt, *stmt_count);
1580 todo->bysetpos = cal_strdup((const char*)temp);
1582 case CAL_PROPERTY_TODO_WKST:
1583 todo->wkst = sqlite3_column_int(stmt, *stmt_count);
1585 case CAL_PROPERTY_TODO_HAS_ALARM:
1586 todo->has_alarm = sqlite3_column_int(stmt, *stmt_count);
1588 case CAL_PROPERTY_TODO_SYNC_DATA1:
1589 temp = sqlite3_column_text(stmt, *stmt_count);
1590 todo->sync_data1 = cal_strdup((const char*)temp);
1592 case CAL_PROPERTY_TODO_SYNC_DATA2:
1593 temp = sqlite3_column_text(stmt, *stmt_count);
1594 todo->sync_data2 = cal_strdup((const char*)temp);
1596 case CAL_PROPERTY_TODO_SYNC_DATA3:
1597 temp = sqlite3_column_text(stmt, *stmt_count);
1598 todo->sync_data3 = cal_strdup((const char*)temp);
1600 case CAL_PROPERTY_TODO_SYNC_DATA4:
1601 temp = sqlite3_column_text(stmt, *stmt_count);
1602 todo->sync_data4 = cal_strdup((const char*)temp);
1604 case CAL_PROPERTY_TODO_START:
1605 todo->start.type = sqlite3_column_int(stmt, *stmt_count);
1606 if (todo->start.type == CALENDAR_TIME_UTIME) {
1607 *stmt_count = *stmt_count+1;
1608 todo->start.time.utime = sqlite3_column_int64(stmt, *stmt_count);
1609 *stmt_count = *stmt_count+1; /* datetime */
1611 *stmt_count = *stmt_count+1; /* utime */
1612 *stmt_count = *stmt_count+1;
1613 temp = sqlite3_column_text(stmt, *stmt_count);
1615 sscanf((const char *)temp, CAL_FORMAT_LOCAL_DATETIME, &(todo->start.time.date.year),
1616 &(todo->start.time.date.month), &(todo->start.time.date.mday),
1617 &(todo->start.time.date.hour), &(todo->start.time.date.minute),
1618 &(todo->start.time.date.second));
1622 case CAL_PROPERTY_TODO_START_TZID:
1623 temp = sqlite3_column_text(stmt, *stmt_count);
1624 todo->start_tzid = cal_strdup((const char*)temp);
1626 case CAL_PROPERTY_TODO_DUE:
1627 todo->due.type = sqlite3_column_int(stmt, *stmt_count);
1628 if (todo->due.type == CALENDAR_TIME_UTIME) {
1629 *stmt_count = *stmt_count+1;
1630 todo->due.time.utime = sqlite3_column_int64(stmt, *stmt_count);
1631 *stmt_count = *stmt_count+1; /* datatime */
1633 *stmt_count = *stmt_count+1; /* utime */
1634 *stmt_count = *stmt_count+1;
1635 temp = sqlite3_column_text(stmt, *stmt_count);
1637 sscanf((const char *)temp, CAL_FORMAT_LOCAL_DATETIME, &(todo->due.time.date.year),
1638 &(todo->due.time.date.month), &(todo->due.time.date.mday),
1639 &(todo->due.time.date.hour), &(todo->due.time.date.minute),
1640 &(todo->due.time.date.second));
1644 case CAL_PROPERTY_TODO_DUE_TZID:
1645 temp = sqlite3_column_text(stmt, *stmt_count);
1646 todo->due_tzid = cal_strdup((const char*)temp);
1648 case CAL_PROPERTY_TODO_ORGANIZER_NAME:
1649 temp = sqlite3_column_text(stmt, *stmt_count);
1650 todo->organizer_name = cal_strdup((const char*)temp);
1652 case CAL_PROPERTY_TODO_ORGANIZER_EMAIL:
1653 temp = sqlite3_column_text(stmt, *stmt_count);
1654 todo->organizer_email = cal_strdup((const char*)temp);
1656 case CAL_PROPERTY_TODO_HAS_ATTENDEE:
1657 todo->has_attendee = sqlite3_column_int(stmt, *stmt_count);
1660 sqlite3_column_int(stmt, *stmt_count);
1664 *stmt_count = *stmt_count+1;
1667 static void _cal_db_todo_get_projection_stmt(sqlite3_stmt *stmt,
1668 const unsigned int *projection, const int projection_count,
1669 calendar_record_h record)
1674 for (i = 0; i < projection_count; i++)
1675 _cal_db_todo_get_property_stmt(stmt, projection[i], &stmt_count, record);
1678 static bool _cal_db_todo_check_calendar_book_type(calendar_record_h record)
1682 cal_todo_s *todo = (cal_todo_s *)record;
1683 char query[CAL_DB_SQL_MAX_LEN];
1684 sqlite3_stmt *stmt = NULL;
1686 snprintf(query, sizeof(query), "SELECT store_type FROM %s WHERE id = %d ",
1687 CAL_TABLE_CALENDAR, todo->calendar_id);
1689 ret = cal_db_util_query_prepare(query, &stmt);
1690 if (CALENDAR_ERROR_NONE != ret) {
1691 ERR("cal_db_util_query_prepare() Fail(%d)", ret);
1692 SECURE("query[%s]", query);
1696 ret = cal_db_util_stmt_step(stmt);
1697 if (CAL_SQLITE_ROW != ret) {
1698 ERR("cal_db_util_stmt_step() Fail(%d)", ret);
1699 sqlite3_finalize(stmt);
1702 store_type = sqlite3_column_int(stmt, 0);
1703 sqlite3_finalize(stmt);
1705 switch (store_type) {
1706 case CALENDAR_BOOK_TYPE_NONE:
1707 case CALENDAR_BOOK_TYPE_TODO:
1710 case CALENDAR_BOOK_TYPE_EVENT:
1719 static int _cal_db_todo_update_dirty(calendar_record_h record)
1722 int ret = CALENDAR_ERROR_NONE;
1723 calendar_record_h original_record;
1725 ret = calendar_record_get_int(record, _calendar_todo.id, &todo_id);
1726 RETV_IF(CALENDAR_ERROR_NONE != ret, ret);
1728 DBG("id=%d", todo_id);
1730 RETV_IF(false == _cal_db_todo_check_calendar_book_type(record), CALENDAR_ERROR_INVALID_PARAMETER);
1732 ret = _cal_db_todo_get_record(todo_id, &original_record);
1733 if (CALENDAR_ERROR_NONE != ret) {
1734 ERR("_cal_db_todo_get_record() Fail(%d)", ret);
1738 cal_record_s *_record = NULL;
1739 const cal_property_info_s* property_info = NULL;
1740 int property_info_count = 0;
1743 _record = (cal_record_s *)record;
1745 property_info = cal_view_get_property_info(_record->view_uri, &property_info_count);
1747 for (i = 0; i < property_info_count; i++) {
1748 if (true == cal_record_check_property_flag(record, property_info[i].property_id , CAL_PROPERTY_FLAG_DIRTY)) {
1749 if (CAL_PROPERTY_CHECK_DATA_TYPE(property_info[i].property_id, CAL_PROPERTY_DATA_TYPE_INT) == true) {
1751 ret = calendar_record_get_int(record, property_info[i].property_id, &tmp);
1752 if (CALENDAR_ERROR_NONE != ret)
1754 ret = cal_record_set_int(original_record, property_info[i].property_id, tmp);
1755 if (CALENDAR_ERROR_NONE != ret)
1757 } else if (CAL_PROPERTY_CHECK_DATA_TYPE(property_info[i].property_id, CAL_PROPERTY_DATA_TYPE_STR) == true) {
1759 ret = calendar_record_get_str_p(record, property_info[i].property_id, &tmp);
1760 if (CALENDAR_ERROR_NONE != ret)
1762 ret = cal_record_set_str(original_record, property_info[i].property_id, tmp);
1763 if (CALENDAR_ERROR_NONE != ret)
1765 } else if (CAL_PROPERTY_CHECK_DATA_TYPE(property_info[i].property_id, CAL_PROPERTY_DATA_TYPE_DOUBLE) == true) {
1767 ret = calendar_record_get_double(record, property_info[i].property_id, &tmp);
1768 if (CALENDAR_ERROR_NONE != ret)
1770 ret = cal_record_set_double(original_record, property_info[i].property_id, tmp);
1771 if (CALENDAR_ERROR_NONE != ret)
1773 } else if (CAL_PROPERTY_CHECK_DATA_TYPE(property_info[i].property_id, CAL_PROPERTY_DATA_TYPE_LLI) == true) {
1774 long long int tmp = 0;
1775 ret = calendar_record_get_lli(record, property_info[i].property_id, &tmp);
1776 if (CALENDAR_ERROR_NONE != ret)
1778 ret = cal_record_set_lli(original_record, property_info[i].property_id, tmp);
1779 if (CALENDAR_ERROR_NONE != ret)
1781 } else if (CAL_PROPERTY_CHECK_DATA_TYPE(property_info[i].property_id, CAL_PROPERTY_DATA_TYPE_CALTIME) == true) {
1782 calendar_time_s tmp = {0,};
1783 ret = calendar_record_get_caltime(record, property_info[i].property_id, &tmp);
1784 if (CALENDAR_ERROR_NONE != ret)
1786 ret = cal_record_set_caltime(original_record, property_info[i].property_id, tmp);
1787 if (CALENDAR_ERROR_NONE != ret)
1793 cal_todo_s *tmp = (cal_todo_s *)original_record;
1794 cal_todo_s *tmp_src = (cal_todo_s *)record;
1796 cal_list_clone((calendar_list_h)tmp_src->alarm_list, (calendar_list_h *)&tmp->alarm_list);
1797 cal_list_clone((calendar_list_h)tmp_src->attendee_list, (calendar_list_h *)&tmp->attendee_list);
1798 cal_list_clone((calendar_list_h)tmp_src->extended_list, (calendar_list_h *)&tmp->extended_list);
1800 CAL_RECORD_RESET_COMMON((cal_record_s*)original_record);
1801 ret = _cal_db_todo_update_record(original_record);
1803 calendar_record_destroy(original_record, true);
1808 static int _cal_db_todo_get_deleted_data(int id, int* calendar_book_id, int* created_ver)
1811 char query[CAL_DB_SQL_MAX_LEN];
1812 sqlite3_stmt *stmt = NULL;
1814 snprintf(query, sizeof(query), "SELECT calendar_id, created_ver "
1815 "FROM %s WHERE id = %d ",
1816 CAL_TABLE_SCHEDULE, id);
1818 ret = cal_db_util_query_prepare(query, &stmt);
1819 if (CALENDAR_ERROR_NONE != ret) {
1820 ERR("cal_db_util_query_prepare() Fail(%d)", ret);
1821 SECURE("query[%s]", query);
1825 ret = cal_db_util_stmt_step(stmt);
1826 if (CAL_SQLITE_ROW != ret) {
1827 ERR("cal_db_util_stmt_step() Fail(%d)", ret);
1828 sqlite3_finalize(stmt);
1832 *calendar_book_id = sqlite3_column_int(stmt, 0);
1833 *created_ver = sqlite3_column_int(stmt, 1);
1834 sqlite3_finalize(stmt);
1836 return CALENDAR_ERROR_NONE;