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.
22 #include "cal_internal.h"
23 #include "cal_typedef.h"
25 #include "cal_record.h"
26 #include "cal_db_util.h"
28 #include "cal_db_query.h"
29 #include "cal_access_control.h"
30 #include "cal_utils.h"
32 static int _cal_db_instance_localtime_delete_record(int id);
33 static int _cal_db_instance_localtime_get_all_records(int offset, int limit, calendar_list_h* out_list);
34 static int _cal_db_instance_localtime_get_records_with_query(calendar_query_h query, int offset, int limit, calendar_list_h* out_list);
35 static int _cal_db_instance_localtime_get_count(int *out_count);
36 static int _cal_db_instance_localtime_get_count_with_query(calendar_query_h query, int *out_count);
41 static void _cal_db_instance_localtime_get_stmt(sqlite3_stmt *stmt, calendar_record_h record);
42 static void _cal_db_instance_localtime_get_property_stmt(sqlite3_stmt *stmt,
43 unsigned int property, int *stmt_count, calendar_record_h record);
44 static void _cal_db_instance_localtime_get_projection_stmt(sqlite3_stmt *stmt,
45 const unsigned int *projection, const int projection_count,
46 calendar_record_h record);
48 cal_db_plugin_cb_s cal_db_instance_localtime_plugin_cb = {
49 .is_query_only = false,
50 .insert_record = NULL,
52 .update_record = NULL,
53 .delete_record = _cal_db_instance_localtime_delete_record,
54 .get_all_records = _cal_db_instance_localtime_get_all_records,
55 .get_records_with_query = _cal_db_instance_localtime_get_records_with_query,
56 .insert_records = NULL,
57 .update_records = NULL,
58 .delete_records = NULL,
59 .get_count = _cal_db_instance_localtime_get_count,
60 .get_count_with_query = _cal_db_instance_localtime_get_count_with_query,
61 .replace_record = NULL,
62 .replace_records = NULL
65 static int _cal_db_instance_localtime_delete_record(int id)
67 char query[CAL_DB_SQL_MAX_LEN] = {0};
70 RETVM_IF(id < 0, CALENDAR_ERROR_INVALID_PARAMETER, "Invalid argument: id(%d) < 0", id);
72 snprintf(query, sizeof(query), "DELETE FROM %s WHERE event_id = %d ",
73 CAL_TABLE_LOCALTIME_INSTANCE, id);
75 ret = cal_db_util_query_exec(query);
76 if (CALENDAR_ERROR_NONE != ret) {
78 ERR("cal_db_util_query_exec() Fail(%d)", ret);
79 SECURE("[%s]", query);
84 return CALENDAR_ERROR_NONE;
87 static int _cal_db_instance_localtime_get_all_records(int offset, int limit, calendar_list_h* out_list)
89 int ret = CALENDAR_ERROR_NONE;
90 char offsetquery[CAL_DB_SQL_MAX_LEN] = {0};
91 char limitquery[CAL_DB_SQL_MAX_LEN] = {0};
92 sqlite3_stmt *stmt = NULL;
94 RETV_IF(NULL == out_list, CALENDAR_ERROR_INVALID_PARAMETER);
96 ret = calendar_list_create(out_list);
97 RETVM_IF(CALENDAR_ERROR_NONE != ret, ret, "calendar_list_create() Fail(%d)", ret);
100 snprintf(offsetquery, sizeof(offsetquery), "OFFSET %d", offset);
102 snprintf(limitquery, sizeof(limitquery), "LIMIT %d", limit);
104 char *query_str = NULL;
105 cal_db_append_string(&query_str, "SELECT * FROM");
106 cal_db_append_string(&query_str, CAL_VIEW_TABLE_LOCALTIME_INSTANCE);
107 cal_db_append_string(&query_str, limitquery);
108 cal_db_append_string(&query_str, offsetquery);
110 ret = cal_db_util_query_prepare(query_str, &stmt);
111 if (CALENDAR_ERROR_NONE != ret) {
112 /* LCOV_EXCL_START */
113 ERR("cal_db_util_query_prepare() Fail(%d)", ret);
114 SECURE("query[%s]", query_str);
115 calendar_list_destroy(*out_list, true);
122 SECURE("[TEST]---------query[%s]", query_str);
123 while (CAL_SQLITE_ROW == cal_db_util_stmt_step(stmt)) {
124 calendar_record_h record;
125 ret = calendar_record_create(_calendar_instance_localtime_calendar_book._uri, &record);
126 if (CALENDAR_ERROR_NONE != ret) {
127 /* LCOV_EXCL_START */
128 calendar_list_destroy(*out_list, true);
130 sqlite3_finalize(stmt);
136 _cal_db_instance_localtime_get_stmt(stmt, record);
138 ret = calendar_list_add(*out_list, record);
139 if (CALENDAR_ERROR_NONE != ret) {
140 /* LCOV_EXCL_START */
141 calendar_list_destroy(*out_list, true);
143 calendar_record_destroy(record, true);
144 sqlite3_finalize(stmt);
150 sqlite3_finalize(stmt);
153 return CALENDAR_ERROR_NONE;
156 static int _cal_db_instance_localtime_get_records_with_query(calendar_query_h query, int offset, int limit, calendar_list_h* out_list)
158 cal_query_s *que = NULL;
159 int ret = CALENDAR_ERROR_NONE;
160 char *condition = NULL;
161 char *projection = NULL;
162 GSList *bind_text = NULL, *cursor = NULL;
163 sqlite3_stmt *stmt = NULL;
167 que = (cal_query_s *)query;
169 if (CAL_STRING_EQUAL == strcmp(que->view_uri, CALENDAR_VIEW_INSTANCE_LOCALTIME_BOOK)) {
170 table_name = cal_strdup(CAL_VIEW_TABLE_LOCALTIME_INSTANCE);
171 } else if (CAL_STRING_EQUAL == strcmp(que->view_uri, CALENDAR_VIEW_INSTANCE_LOCALTIME_BOOK_EXTENDED)) {
172 table_name = cal_strdup(CAL_VIEW_TABLE_LOCALTIME_INSTANCE_EXTENDED);
174 /* LCOV_EXCL_START */
175 ERR("uri(%s) not support get records with query", que->view_uri);
176 return CALENDAR_ERROR_INVALID_PARAMETER;
182 ret = cal_db_query_create_condition(query, &condition, &bind_text);
183 if (CALENDAR_ERROR_NONE != ret) {
184 /* LCOV_EXCL_START */
185 ERR("cal_db_query_create_condition() Fail(%d), ret");
186 CAL_FREE(table_name);
192 /* make: projection */
193 ret = cal_db_query_create_projection(query, &projection);
195 char *query_str = NULL;
196 /* query: projection */
198 cal_db_append_string(&query_str, "SELECT");
199 cal_db_append_string(&query_str, projection);
200 cal_db_append_string(&query_str, "FROM");
201 cal_db_append_string(&query_str, table_name);
202 CAL_FREE(projection);
204 cal_db_append_string(&query_str, "SELECT * FROM");
205 cal_db_append_string(&query_str, table_name);
207 CAL_FREE(table_name);
209 /* query: condition */
211 cal_db_append_string(&query_str, "WHERE (");
212 cal_db_append_string(&query_str, condition);
213 cal_db_append_string(&query_str, ")");
218 ret = cal_db_query_create_order(query, condition, &order);
220 cal_db_append_string(&query_str, order);
226 char buf[CAL_STR_SHORT_LEN32] = {0};
228 snprintf(buf, sizeof(buf), "LIMIT %d", limit);
229 cal_db_append_string(&query_str, buf);
232 snprintf(buf, sizeof(buf), "OFFSET %d", offset);
233 cal_db_append_string(&query_str, buf);
238 ret = cal_db_util_query_prepare(query_str, &stmt);
239 if (CALENDAR_ERROR_NONE != ret) {
240 /* LCOV_EXCL_START */
241 ERR("cal_db_util_query_prepare() Fail(%d)", ret);
242 SECURE("query[%s]", query_str);
244 g_slist_free_full(bind_text, free);
254 g_slist_length(bind_text);
255 for (cursor = bind_text, i = 1; cursor; cursor = cursor->next, i++)
256 cal_db_util_stmt_bind_text(stmt, i, cursor->data);
259 ret = calendar_list_create(out_list);
260 if (CALENDAR_ERROR_NONE != ret) {
261 /* LCOV_EXCL_START */
262 ERR("calendar_list_create() Fail");
264 g_slist_free_full(bind_text, free);
267 sqlite3_finalize(stmt);
273 while (CAL_SQLITE_ROW == cal_db_util_stmt_step(stmt)) {
274 calendar_record_h record;
275 ret = calendar_record_create(que->view_uri, &record);
276 if (CALENDAR_ERROR_NONE != ret) {
277 /* LCOV_EXCL_START */
278 ERR("calendar_record_create() Fail(%d)", ret);
279 calendar_list_destroy(*out_list, true);
283 g_slist_free_full(bind_text, free);
286 sqlite3_finalize(stmt);
291 if (0 < que->projection_count) {
292 cal_record_set_projection(record, que->projection, que->projection_count, que->property_count);
293 _cal_db_instance_localtime_get_projection_stmt(stmt, que->projection, que->projection_count, record);
295 _cal_db_instance_localtime_get_stmt(stmt, record);
298 ret = calendar_list_add(*out_list, record);
299 if (CALENDAR_ERROR_NONE != ret) {
300 /* LCOV_EXCL_START */
301 ERR("calendar_list_add() Fail(%d)", ret);
302 calendar_list_destroy(*out_list, true);
304 calendar_record_destroy(record, true);
307 g_slist_free_full(bind_text, free);
310 sqlite3_finalize(stmt);
318 g_slist_free_full(bind_text, free);
322 sqlite3_finalize(stmt);
325 return CALENDAR_ERROR_NONE;
328 static int _cal_db_instance_localtime_get_count(int *out_count)
330 RETV_IF(NULL == out_count, CALENDAR_ERROR_INVALID_PARAMETER);
332 char *query_str = NULL;
333 cal_db_append_string(&query_str, "SELECT count(*) FROM");
334 cal_db_append_string(&query_str, CAL_TABLE_LOCALTIME_INSTANCE);
338 ret = cal_db_util_query_get_first_int_result(query_str, NULL, &count);
339 if (CALENDAR_ERROR_NONE != ret) {
340 /* LCOV_EXCL_START */
341 ERR("cal_db_util_query_get_first_int_result() Fail");
346 DBG("count(%d) str[%s]", count, query_str);
350 return CALENDAR_ERROR_NONE;
353 static int _cal_db_instance_localtime_get_count_with_query(calendar_query_h query, int *out_count)
355 cal_query_s *que = NULL;
356 int ret = CALENDAR_ERROR_NONE;
357 char *condition = NULL;
360 GSList *bind_text = NULL;
362 que = (cal_query_s *)query;
364 if (CAL_STRING_EQUAL == strcmp(que->view_uri, CALENDAR_VIEW_INSTANCE_LOCALTIME_BOOK)) {
365 table_name = cal_strdup(CAL_VIEW_TABLE_LOCALTIME_INSTANCE);
366 } else if (CAL_STRING_EQUAL == strcmp(que->view_uri, CALENDAR_VIEW_INSTANCE_LOCALTIME_BOOK_EXTENDED)) {
367 table_name = cal_strdup(CAL_VIEW_TABLE_LOCALTIME_INSTANCE_EXTENDED);
369 /* LCOV_EXCL_START */
370 ERR("uri(%s) not support get records with query", que->view_uri);
371 return CALENDAR_ERROR_INVALID_PARAMETER;
377 ret = cal_db_query_create_condition(query, &condition, &bind_text);
378 if (CALENDAR_ERROR_NONE != ret) {
379 /* LCOV_EXCL_START */
380 ERR("cal_db_query_create_condition() Fail(%d), ret");
381 CAL_FREE(table_name);
387 char *query_str = NULL;
389 cal_db_append_string(&query_str, "SELECT count(*) FROM");
390 cal_db_append_string(&query_str, table_name);
391 CAL_FREE(table_name);
393 /* query: condition */
395 cal_db_append_string(&query_str, "WHERE (");
396 cal_db_append_string(&query_str, condition);
397 cal_db_append_string(&query_str, ")");
402 ret = cal_db_util_query_get_first_int_result(query_str, bind_text, &count);
403 if (CALENDAR_ERROR_NONE != ret) {
404 /* LCOV_EXCL_START */
405 ERR("cal_db_util_query_get_first_int_result() Fail");
407 g_slist_free_full(bind_text, free);
414 DBG("count(%d) str[%s]", count, query_str);
416 if (out_count) *out_count = count;
419 g_slist_free_full(bind_text, free);
423 return CALENDAR_ERROR_NONE;
426 static void _cal_db_instance_localtime_get_stmt(sqlite3_stmt *stmt, calendar_record_h record)
428 cal_instance_localtime_s* instance = (cal_instance_localtime_s*)(record);
429 const unsigned char *temp;
432 instance->event_id = sqlite3_column_int(stmt, count++);
433 instance->start.type = sqlite3_column_int(stmt, count++);
435 temp = sqlite3_column_text(stmt, count++);
437 sscanf((const char *)temp, CAL_FORMAT_LOCAL_DATETIME, &(instance->start.time.date.year),
438 &(instance->start.time.date.month), &(instance->start.time.date.mday),
439 &(instance->start.time.date.hour), &(instance->start.time.date.minute),
440 &(instance->start.time.date.second));
441 DBG(CAL_FORMAT_LOCAL_DATETIME, instance->start.time.date.year, instance->start.time.date.month, instance->start.time.date.mday,
442 instance->start.time.date.hour, instance->start.time.date.minute, instance->start.time.date.second);
445 instance->end.type = sqlite3_column_int(stmt, count++);
447 temp = sqlite3_column_text(stmt, count++);
449 sscanf((const char *)temp, CAL_FORMAT_LOCAL_DATETIME, &(instance->end.time.date.year),
450 &(instance->end.time.date.month), &(instance->end.time.date.mday),
451 &(instance->end.time.date.hour), &(instance->end.time.date.minute),
452 &(instance->end.time.date.second));
453 DBG(CAL_FORMAT_LOCAL_DATETIME, instance->end.time.date.year, instance->end.time.date.month, instance->end.time.date.mday,
454 instance->end.time.date.hour, instance->end.time.date.minute, instance->end.time.date.second);
457 temp = sqlite3_column_text(stmt, count++);
458 instance->summary = cal_strdup((const char*)temp);
460 temp = sqlite3_column_text(stmt, count++);
461 instance->description = cal_strdup((const char*)temp);
463 temp = sqlite3_column_text(stmt, count++);
464 instance->location = cal_strdup((const char*)temp);
466 instance->busy_status = sqlite3_column_int(stmt, count++);
468 instance->event_status = sqlite3_column_int(stmt, count++);
470 instance->priority = sqlite3_column_int(stmt, count++);
472 instance->sensitivity = sqlite3_column_int(stmt, count++);
474 instance->has_rrule = sqlite3_column_int(stmt, count++);
475 if (0 < instance->has_rrule)
476 instance->has_rrule = 1;
478 instance->latitude = sqlite3_column_double(stmt, count++);
479 instance->longitude = sqlite3_column_double(stmt, count++);
480 instance->has_alarm = sqlite3_column_int(stmt, count++);
481 instance->original_event_id = sqlite3_column_int(stmt, count++);
482 instance->calendar_id = sqlite3_column_int(stmt, count++);
483 instance->last_mod = sqlite3_column_int64(stmt, count++);
485 temp = sqlite3_column_text(stmt, count++);
486 instance->sync_data1 = cal_strdup((const char*)temp);
488 instance->is_allday = sqlite3_column_int(stmt, count++);
493 static void _cal_db_instance_localtime_get_property_stmt(sqlite3_stmt *stmt,
494 unsigned int property, int *stmt_count, calendar_record_h record)
496 cal_instance_localtime_s* instance = (cal_instance_localtime_s*)(record);
497 const unsigned char *temp;
500 case CAL_PROPERTY_INSTANCE_LOCALTIME_START:
501 instance->start.type = CALENDAR_TIME_LOCALTIME;
502 *stmt_count = *stmt_count+1; /* utime */
503 *stmt_count = *stmt_count+1;
504 temp = sqlite3_column_text(stmt, *stmt_count);
506 sscanf((const char *)temp, CAL_FORMAT_LOCAL_DATETIME, &(instance->start.time.date.year),
507 &(instance->start.time.date.month), &(instance->start.time.date.mday),
508 &(instance->start.time.date.hour), &(instance->start.time.date.minute),
509 &(instance->start.time.date.second));
513 case CAL_PROPERTY_INSTANCE_LOCALTIME_END:
514 instance->end.type = CALENDAR_TIME_LOCALTIME;
515 *stmt_count = *stmt_count+1; /* utime */
516 *stmt_count = *stmt_count+1;
517 temp = sqlite3_column_text(stmt, *stmt_count);
519 sscanf((const char *)temp, CAL_FORMAT_LOCAL_DATETIME, &(instance->end.time.date.year),
520 &(instance->end.time.date.month), &(instance->end.time.date.mday),
521 &(instance->end.time.date.hour), &(instance->end.time.date.minute),
522 &(instance->end.time.date.second));
525 case CAL_PROPERTY_INSTANCE_LOCALTIME_SUMMARY:
526 temp = sqlite3_column_text(stmt, *stmt_count);
527 instance->summary = cal_strdup((const char*)temp);
529 case CAL_PROPERTY_INSTANCE_LOCALTIME_LOCATION:
530 temp = sqlite3_column_text(stmt, *stmt_count);
531 instance->location = cal_strdup((const char*)temp);
533 case CAL_PROPERTY_INSTANCE_LOCALTIME_BOOK_ID:
534 instance->calendar_id = sqlite3_column_int(stmt, *stmt_count);
536 case CAL_PROPERTY_INSTANCE_LOCALTIME_DESCRIPTION:
537 temp = sqlite3_column_text(stmt, *stmt_count);
538 instance->description = cal_strdup((const char*)temp);
540 case CAL_PROPERTY_INSTANCE_LOCALTIME_BUSY_STATUS:
541 instance->busy_status = sqlite3_column_int(stmt, *stmt_count);
543 case CAL_PROPERTY_INSTANCE_LOCALTIME_EVENT_STATUS:
544 instance->event_status = sqlite3_column_int(stmt, *stmt_count);
546 case CAL_PROPERTY_INSTANCE_LOCALTIME_PRIORITY:
547 instance->priority = sqlite3_column_int(stmt, *stmt_count);
549 case CAL_PROPERTY_INSTANCE_LOCALTIME_SENSITIVITY:
550 instance->sensitivity = sqlite3_column_int(stmt, *stmt_count);
552 case CAL_PROPERTY_INSTANCE_LOCALTIME_HAS_RRULE:
553 instance->has_rrule = sqlite3_column_int(stmt, *stmt_count);
554 if (0 < instance->has_rrule)
555 instance->has_rrule = 1;
558 case CAL_PROPERTY_INSTANCE_LOCALTIME_LATITUDE:
559 instance->latitude = sqlite3_column_double(stmt, *stmt_count);
561 case CAL_PROPERTY_INSTANCE_LOCALTIME_LONGITUDE:
562 instance->longitude = sqlite3_column_double(stmt, *stmt_count);
564 case CAL_PROPERTY_INSTANCE_LOCALTIME_EVENT_ID:
565 instance->event_id = sqlite3_column_int(stmt, *stmt_count);
567 case CAL_PROPERTY_INSTANCE_LOCALTIME_HAS_ALARM:
568 instance->has_alarm = sqlite3_column_int(stmt, *stmt_count);
570 case CAL_PROPERTY_INSTANCE_LOCALTIME_ORIGINAL_EVENT_ID:
571 instance->original_event_id = sqlite3_column_int(stmt, *stmt_count);
573 case CAL_PROPERTY_INSTANCE_LOCALTIME_LAST_MODIFIED_TIME:
574 instance->last_mod = sqlite3_column_int64(stmt, *stmt_count);
576 case CAL_PROPERTY_INSTANCE_LOCALTIME_SYNC_DATA1:
577 temp = sqlite3_column_text(stmt, *stmt_count);
578 instance->sync_data1 = cal_strdup((const char*)temp);
580 case CAL_PROPERTY_INSTANCE_LOCALTIME_IS_ALLDAY:
581 instance->is_allday = sqlite3_column_int64(stmt, *stmt_count);
585 sqlite3_column_int(stmt, *stmt_count);
589 *stmt_count = *stmt_count+1;
594 static void _cal_db_instance_localtime_get_projection_stmt(sqlite3_stmt *stmt,
595 const unsigned int *projection, const int projection_count,
596 calendar_record_h record)
601 for (i = 0; i < projection_count; i++)
602 _cal_db_instance_localtime_get_property_stmt(stmt, projection[i], &stmt_count, record);