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"
27 #include "cal_db_util.h"
29 #include "cal_db_query.h"
30 #include "cal_access_control.h"
31 #include "cal_utils.h"
33 static int _cal_db_instance_utime_delete_record(int id);
34 static int _cal_db_instance_utime_get_all_records(int offset, int limit, calendar_list_h* out_list);
35 static int _cal_db_instance_utime_get_records_with_query(calendar_query_h query, int offset, int limit, calendar_list_h* out_list);
36 static int _cal_db_instance_utime_get_count(int *out_count);
37 static int _cal_db_instance_utime_get_count_with_query(calendar_query_h query, int *out_count);
42 static void _cal_db_instance_utime_get_stmt(sqlite3_stmt *stmt, calendar_record_h record);
43 static void _cal_db_instance_utime_get_property_stmt(sqlite3_stmt *stmt,
44 unsigned int property, int *stmt_count, calendar_record_h record);
45 static void _cal_db_instance_utime_get_projection_stmt(sqlite3_stmt *stmt,
46 const unsigned int *projection, const int projection_count,
47 calendar_record_h record);
49 cal_db_plugin_cb_s cal_db_instance_utime_plugin_cb = {
50 .is_query_only = false,
51 .insert_record = NULL,
53 .update_record = NULL,
54 .delete_record = _cal_db_instance_utime_delete_record,
55 .get_all_records = _cal_db_instance_utime_get_all_records,
56 .get_records_with_query = _cal_db_instance_utime_get_records_with_query,
57 .insert_records = NULL,
58 .update_records = NULL,
59 .delete_records = NULL,
60 .get_count = _cal_db_instance_utime_get_count,
61 .get_count_with_query = _cal_db_instance_utime_get_count_with_query,
62 .replace_record = NULL,
63 .replace_records = NULL
66 static int _cal_db_instance_utime_delete_record(int id)
69 char query[CAL_DB_SQL_MAX_LEN] = {0};
71 RETVM_IF(id < 0, CALENDAR_ERROR_INVALID_PARAMETER,
72 "Invalid argument: id(%d) < 0", id);
74 snprintf(query, sizeof(query),
76 "WHERE event_id = %d ",
77 CAL_TABLE_UTIME_INSTANCE,
80 ret = cal_db_util_query_exec(query);
81 if (CALENDAR_ERROR_NONE != ret) {
83 ERR("cal_db_util_query_exec() Fail(%d)", ret);
84 SECURE("[%s]", query);
89 return CALENDAR_ERROR_NONE;
92 static int _cal_db_instance_utime_get_all_records(int offset, int limit, calendar_list_h* out_list)
94 int ret = CALENDAR_ERROR_NONE;
95 char offsetquery[CAL_DB_SQL_MAX_LEN] = {0};
96 char limitquery[CAL_DB_SQL_MAX_LEN] = {0};
97 sqlite3_stmt *stmt = NULL;
99 RETV_IF(NULL == out_list, CALENDAR_ERROR_INVALID_PARAMETER);
101 ret = calendar_list_create(out_list);
102 RETVM_IF(CALENDAR_ERROR_NONE != ret, ret, "calendar_list_create() Fail(%d)", ret);
105 snprintf(offsetquery, sizeof(offsetquery), "OFFSET %d", offset);
107 snprintf(limitquery, sizeof(limitquery), "LIMIT %d", limit);
109 char *query_str = NULL;
110 cal_db_append_string(&query_str, "SELECT * FROM");
111 cal_db_append_string(&query_str, CAL_VIEW_TABLE_UTIME_INSTANCE);
112 cal_db_append_string(&query_str, limitquery);
113 cal_db_append_string(&query_str, offsetquery);
115 ret = cal_db_util_query_prepare(query_str, &stmt);
116 if (CALENDAR_ERROR_NONE != ret) {
117 /* LCOV_EXCL_START */
118 ERR("cal_db_util_query_prepare() Fail(%d)", ret);
119 SECURE("query[%s]", query_str);
120 calendar_list_destroy(*out_list, true);
127 SECURE("[TEST]---------query[%s]", query_str);
128 while (CAL_SQLITE_ROW == cal_db_util_stmt_step(stmt)) {
129 calendar_record_h record;
130 ret = calendar_record_create(_calendar_instance_utime_calendar_book._uri, &record);
131 if (CALENDAR_ERROR_NONE != ret) {
132 /* LCOV_EXCL_START */
133 calendar_list_destroy(*out_list, true);
135 sqlite3_finalize(stmt);
140 _cal_db_instance_utime_get_stmt(stmt, record);
142 ret = calendar_list_add(*out_list, record);
143 if (CALENDAR_ERROR_NONE != ret) {
144 /* LCOV_EXCL_START */
145 calendar_list_destroy(*out_list, true);
147 calendar_record_destroy(record, true);
148 sqlite3_finalize(stmt);
154 sqlite3_finalize(stmt);
157 return CALENDAR_ERROR_NONE;
160 static int _cal_db_instance_utime_get_records_with_query(calendar_query_h query, int offset, int limit, calendar_list_h* out_list)
162 cal_query_s *que = NULL;
163 int ret = CALENDAR_ERROR_NONE;
164 char *condition = NULL;
165 char *projection = NULL;
166 GSList *bind_text = NULL, *cursor = NULL;
167 sqlite3_stmt *stmt = NULL;
171 que = (cal_query_s *)query;
173 if (CAL_STRING_EQUAL == strcmp(que->view_uri, CALENDAR_VIEW_INSTANCE_UTIME_BOOK)) {
174 table_name = cal_strdup(CAL_VIEW_TABLE_UTIME_INSTANCE);
175 } else if (CAL_STRING_EQUAL == strcmp(que->view_uri, CALENDAR_VIEW_INSTANCE_UTIME_BOOK_EXTENDED)) {
176 table_name = cal_strdup(CAL_VIEW_TABLE_UTIME_INSTANCE_EXTENDED);
178 /* LCOV_EXCL_START */
179 ERR("uri(%s) not support get records with query", que->view_uri);
180 return CALENDAR_ERROR_INVALID_PARAMETER;
186 ret = cal_db_query_create_condition(query, &condition, &bind_text);
187 if (CALENDAR_ERROR_NONE != ret) {
188 /* LCOV_EXCL_START */
189 ERR("cal_db_query_create_condition() Fail(%d), ret");
190 CAL_FREE(table_name);
196 /* make: projection */
197 ret = cal_db_query_create_projection(query, &projection);
199 char *query_str = NULL;
200 /* query: projection */
202 cal_db_append_string(&query_str, "SELECT");
203 cal_db_append_string(&query_str, projection);
204 cal_db_append_string(&query_str, "FROM");
205 cal_db_append_string(&query_str, table_name);
206 CAL_FREE(projection);
208 cal_db_append_string(&query_str, "SELECT * FROM");
209 cal_db_append_string(&query_str, table_name);
211 CAL_FREE(table_name);
213 /* query: condition */
215 cal_db_append_string(&query_str, "WHERE (");
216 cal_db_append_string(&query_str, condition);
217 cal_db_append_string(&query_str, ")");
222 ret = cal_db_query_create_order(query, condition, &order);
224 cal_db_append_string(&query_str, order);
230 char buf[CAL_STR_SHORT_LEN32] = {0};
232 snprintf(buf, sizeof(buf), "LIMIT %d", limit);
233 cal_db_append_string(&query_str, buf);
236 snprintf(buf, sizeof(buf), "OFFSET %d", offset);
237 cal_db_append_string(&query_str, buf);
242 ret = cal_db_util_query_prepare(query_str, &stmt);
243 if (CALENDAR_ERROR_NONE != ret) {
244 /* LCOV_EXCL_START */
245 ERR("cal_db_util_query_prepare() Fail(%d)", ret);
246 SECURE("query[%s]", query_str);
248 g_slist_free_full(bind_text, free);
258 g_slist_length(bind_text);
259 for (cursor = bind_text, i = 1; cursor; cursor = cursor->next, i++)
260 cal_db_util_stmt_bind_text(stmt, i, cursor->data);
263 ret = calendar_list_create(out_list);
264 if (CALENDAR_ERROR_NONE != ret) {
266 g_slist_free_full(bind_text, free);
269 /* LCOV_EXCL_START */
270 ERR("calendar_list_create() Fail");
271 sqlite3_finalize(stmt);
277 while (CAL_SQLITE_ROW == cal_db_util_stmt_step(stmt)) {
278 calendar_record_h record;
279 ret = calendar_record_create(que->view_uri, &record);
280 if (CALENDAR_ERROR_NONE != ret) {
281 /* LCOV_EXCL_START */
282 calendar_list_destroy(*out_list, true);
286 g_slist_free_full(bind_text, free);
289 sqlite3_finalize(stmt);
293 if (0 < que->projection_count) {
294 cal_record_set_projection(record,
295 que->projection, que->projection_count, que->property_count);
297 _cal_db_instance_utime_get_projection_stmt(stmt,
298 que->projection, que->projection_count,
301 _cal_db_instance_utime_get_stmt(stmt, record);
304 ret = calendar_list_add(*out_list, record);
305 if (CALENDAR_ERROR_NONE != ret) {
306 /* LCOV_EXCL_START */
307 calendar_list_destroy(*out_list, true);
309 calendar_record_destroy(record, true);
312 g_slist_free_full(bind_text, free);
315 sqlite3_finalize(stmt);
323 g_slist_free_full(bind_text, free);
326 sqlite3_finalize(stmt);
329 return CALENDAR_ERROR_NONE;
332 static int _cal_db_instance_utime_get_count(int *out_count)
334 RETV_IF(NULL == out_count, CALENDAR_ERROR_INVALID_PARAMETER);
336 char *query_str = NULL;
337 cal_db_append_string(&query_str, "SELECT count(*) FROM");
338 cal_db_append_string(&query_str, CAL_TABLE_UTIME_INSTANCE);
342 ret = cal_db_util_query_get_first_int_result(query_str, NULL, &count);
343 if (CALENDAR_ERROR_NONE != ret) {
344 /* LCOV_EXCL_START */
345 ERR("cal_db_util_query_get_first_int_result() Fail");
349 DBG("count(%d) str[%s]", count, query_str);
353 return CALENDAR_ERROR_NONE;
356 static int _cal_db_instance_utime_get_count_with_query(calendar_query_h query, int *out_count)
358 cal_query_s *que = NULL;
359 int ret = CALENDAR_ERROR_NONE;
360 char *condition = NULL;
363 GSList *bind_text = NULL;
365 que = (cal_query_s *)query;
367 if (CAL_STRING_EQUAL == strcmp(que->view_uri, CALENDAR_VIEW_INSTANCE_UTIME_BOOK)) {
368 table_name = cal_strdup(CAL_VIEW_TABLE_UTIME_INSTANCE);
369 } else if (CAL_STRING_EQUAL == strcmp(que->view_uri, CALENDAR_VIEW_INSTANCE_UTIME_BOOK_EXTENDED)) {
370 table_name = cal_strdup(CAL_VIEW_TABLE_UTIME_INSTANCE_EXTENDED);
372 /* LCOV_EXCL_START */
373 ERR("uri(%s) not support get records with query", que->view_uri);
374 return CALENDAR_ERROR_INVALID_PARAMETER;
380 ret = cal_db_query_create_condition(query, &condition, &bind_text);
381 if (CALENDAR_ERROR_NONE != ret) {
382 /* LCOV_EXCL_START */
383 ERR("cal_db_query_create_condition() Fail(%d), ret");
384 CAL_FREE(table_name);
390 char *query_str = NULL;
392 cal_db_append_string(&query_str, "SELECT count(*) FROM");
393 cal_db_append_string(&query_str, table_name);
394 CAL_FREE(table_name);
396 /* query: condition */
398 cal_db_append_string(&query_str, "WHERE (");
399 cal_db_append_string(&query_str, condition);
400 cal_db_append_string(&query_str, ")");
405 ret = cal_db_util_query_get_first_int_result(query_str, bind_text, &count);
406 if (CALENDAR_ERROR_NONE != ret) {
407 /* LCOV_EXCL_START */
408 ERR("cal_db_util_query_get_first_int_result() Fail");
410 g_slist_free_full(bind_text, free);
418 DBG("count(%d) str[%s]", count, query_str);
420 if (out_count) *out_count = count;
422 g_slist_free_full(bind_text, free);
427 return CALENDAR_ERROR_NONE;
430 static void _cal_db_instance_utime_get_stmt(sqlite3_stmt *stmt, calendar_record_h record)
432 cal_instance_utime_s* instance = (cal_instance_utime_s*)(record);
433 const unsigned char *temp;
436 instance->event_id = sqlite3_column_int(stmt, count++);
437 instance->start.type = sqlite3_column_int(stmt, count++);
438 instance->start.time.utime = sqlite3_column_int64(stmt, count++);
439 count++; /* datatime */
440 instance->end.type = sqlite3_column_int(stmt, count++);
441 instance->end.time.utime = sqlite3_column_int64(stmt, count++);
442 count++; /* datatime */
444 temp = sqlite3_column_text(stmt, count++);
445 instance->summary = cal_strdup((const char*)temp);
447 temp = sqlite3_column_text(stmt, count++);
448 instance->description = cal_strdup((const char*)temp);
450 temp = sqlite3_column_text(stmt, count++);
451 instance->location = cal_strdup((const char*)temp);
453 instance->busy_status = sqlite3_column_int(stmt, count++);
455 instance->event_status = sqlite3_column_int(stmt, count++);
457 instance->priority = sqlite3_column_int(stmt, count++);
459 instance->sensitivity = sqlite3_column_int(stmt, count++);
461 instance->has_rrule = sqlite3_column_int(stmt, count++);
462 if (0 < instance->has_rrule)
463 instance->has_rrule = 1;
465 instance->latitude = sqlite3_column_double(stmt, count++);
466 instance->longitude = sqlite3_column_double(stmt, count++);
467 instance->has_alarm = sqlite3_column_int(stmt, count++);
468 instance->original_event_id = sqlite3_column_int(stmt, count++);
469 instance->calendar_id = sqlite3_column_int(stmt, count++);
470 instance->last_mod = sqlite3_column_int64(stmt, count++);
472 temp = sqlite3_column_text(stmt, count++);
473 instance->sync_data1 = cal_strdup((const char*)temp);
478 static void _cal_db_instance_utime_get_property_stmt(sqlite3_stmt *stmt,
479 unsigned int property, int *stmt_count, calendar_record_h record)
481 cal_instance_utime_s* instance = (cal_instance_utime_s*)(record);
482 const unsigned char *temp;
485 case CAL_PROPERTY_INSTANCE_UTIME_START:
486 instance->start.type = CALENDAR_TIME_UTIME;
487 *stmt_count = *stmt_count+1;
488 instance->start.time.utime = sqlite3_column_int64(stmt, *stmt_count);
489 *stmt_count = *stmt_count+1; /* datatime */
491 case CAL_PROPERTY_INSTANCE_UTIME_END:
492 instance->end.type = CALENDAR_TIME_UTIME;
493 sqlite3_column_int(stmt, *stmt_count);
494 *stmt_count = *stmt_count+1;
495 instance->end.time.utime = sqlite3_column_int64(stmt, *stmt_count);
496 *stmt_count = *stmt_count+1; /* datatime */
498 case CAL_PROPERTY_INSTANCE_UTIME_SUMMARY:
499 temp = sqlite3_column_text(stmt, *stmt_count);
500 instance->summary = cal_strdup((const char*)temp);
502 case CAL_PROPERTY_INSTANCE_UTIME_LOCATION:
503 temp = sqlite3_column_text(stmt, *stmt_count);
504 instance->location = cal_strdup((const char*)temp);
506 case CAL_PROPERTY_INSTANCE_UTIME_BOOK_ID:
507 instance->calendar_id = sqlite3_column_int(stmt, *stmt_count);
509 case CAL_PROPERTY_INSTANCE_UTIME_DESCRIPTION:
510 temp = sqlite3_column_text(stmt, *stmt_count);
511 instance->description = cal_strdup((const char*)temp);
513 case CAL_PROPERTY_INSTANCE_UTIME_BUSY_STATUS:
514 instance->busy_status = sqlite3_column_int(stmt, *stmt_count);
516 case CAL_PROPERTY_INSTANCE_UTIME_EVENT_STATUS:
517 instance->event_status = sqlite3_column_int(stmt, *stmt_count);
519 case CAL_PROPERTY_INSTANCE_UTIME_PRIORITY:
520 instance->priority = sqlite3_column_int(stmt, *stmt_count);
522 case CAL_PROPERTY_INSTANCE_UTIME_SENSITIVITY:
523 instance->sensitivity = sqlite3_column_int(stmt, *stmt_count);
525 case CAL_PROPERTY_INSTANCE_UTIME_HAS_RRULE:
526 instance->has_rrule = sqlite3_column_int(stmt, *stmt_count);
527 if (0 < instance->has_rrule)
528 instance->has_rrule = 1;
531 case CAL_PROPERTY_INSTANCE_UTIME_LATITUDE:
532 instance->latitude = sqlite3_column_double(stmt, *stmt_count);
534 case CAL_PROPERTY_INSTANCE_UTIME_LONGITUDE:
535 instance->longitude = sqlite3_column_double(stmt, *stmt_count);
537 case CAL_PROPERTY_INSTANCE_UTIME_EVENT_ID:
538 instance->event_id = sqlite3_column_int(stmt, *stmt_count);
540 case CAL_PROPERTY_INSTANCE_UTIME_HAS_ALARM:
541 instance->has_alarm = sqlite3_column_int(stmt, *stmt_count);
543 case CAL_PROPERTY_INSTANCE_UTIME_ORIGINAL_EVENT_ID:
544 instance->original_event_id = sqlite3_column_int(stmt, *stmt_count);
546 case CAL_PROPERTY_INSTANCE_UTIME_LAST_MODIFIED_TIME:
547 instance->last_mod = sqlite3_column_int64(stmt, *stmt_count);
549 case CAL_PROPERTY_INSTANCE_UTIME_SYNC_DATA1:
550 temp = sqlite3_column_text(stmt, *stmt_count);
551 instance->sync_data1 = cal_strdup((const char*)temp);
554 sqlite3_column_int(stmt, *stmt_count);
558 *stmt_count = *stmt_count+1;
563 static void _cal_db_instance_utime_get_projection_stmt(sqlite3_stmt *stmt,
564 const unsigned int *projection, const int projection_count,
565 calendar_record_h record)
570 for (i = 0; i < projection_count; i++)
571 _cal_db_instance_utime_get_property_stmt(stmt, projection[i], &stmt_count, record);