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_allday_delete_record(int id);
33 static int _cal_db_instance_allday_get_all_records(int offset, int limit, calendar_list_h* out_list);
34 static int _cal_db_instance_allday_get_records_with_query(calendar_query_h query, int offset, int limit, calendar_list_h* out_list);
35 static int _cal_db_instance_allday_get_count(int *out_count);
36 static int _cal_db_instance_allday_get_count_with_query(calendar_query_h query, int *out_count);
41 static void _cal_db_instance_allday_get_stmt(sqlite3_stmt *stmt, calendar_record_h record);
42 static void _cal_db_instance_allday_get_property_stmt(sqlite3_stmt *stmt,
43 unsigned int property, int *stmt_count, calendar_record_h record);
44 static void _cal_db_instance_allday_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_allday_plugin_cb = {
49 .is_query_only = false,
50 .insert_record = NULL,
52 .update_record = NULL,
53 .delete_record = _cal_db_instance_allday_delete_record,
54 .get_all_records = _cal_db_instance_allday_get_all_records,
55 .get_records_with_query = _cal_db_instance_allday_get_records_with_query,
56 .insert_records = NULL,
57 .update_records = NULL,
58 .delete_records = NULL,
59 .get_count = _cal_db_instance_allday_get_count,
60 .get_count_with_query = _cal_db_instance_allday_get_count_with_query,
61 .replace_record = NULL,
62 .replace_records = NULL
65 static int _cal_db_instance_allday_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_ALLDAY_INSTANCE, id);
75 ret = cal_db_util_query_exec(query);
76 if (CALENDAR_ERROR_NONE != ret) {
77 ERR("cal_db_util_query_exec() Fail(%d)", ret);
78 SECURE("[%s]", query);
82 return CALENDAR_ERROR_NONE;
85 static int _cal_db_instance_allday_get_all_records(int offset, int limit, calendar_list_h* out_list)
87 int ret = CALENDAR_ERROR_NONE;
88 char offsetquery[CAL_DB_SQL_MAX_LEN] = {0};
89 char limitquery[CAL_DB_SQL_MAX_LEN] = {0};
90 sqlite3_stmt *stmt = NULL;
92 RETV_IF(NULL == out_list, CALENDAR_ERROR_INVALID_PARAMETER);
94 ret = calendar_list_create(out_list);
95 RETVM_IF(CALENDAR_ERROR_NONE != ret, ret, "calendar_list_create() Fail(%d)", ret);
98 snprintf(offsetquery, sizeof(offsetquery), "OFFSET %d", offset);
100 snprintf(limitquery, sizeof(limitquery), "LIMIT %d", limit);
102 char *query_str = NULL;
103 cal_db_append_string(&query_str, "SELECT * FROM");
104 cal_db_append_string(&query_str, CAL_VIEW_TABLE_ALLDAY_INSTANCE);
105 cal_db_append_string(&query_str, limitquery);
106 cal_db_append_string(&query_str, offsetquery);
108 ret = cal_db_util_query_prepare(query_str, &stmt);
109 if (CALENDAR_ERROR_NONE != ret) {
110 ERR("cal_db_util_query_prepare() Fail(%d)", ret);
111 SECURE("query[%s]", query_str);
112 calendar_list_destroy(*out_list, true);
118 SECURE("[TEST]---------query[%s]", query_str);
119 while (CAL_SQLITE_ROW == cal_db_util_stmt_step(stmt)) {
120 calendar_record_h record;
121 ret = calendar_record_create(_calendar_instance_localtime_calendar_book._uri, &record);
122 if (CALENDAR_ERROR_NONE != ret) {
123 calendar_list_destroy(*out_list, true);
125 sqlite3_finalize(stmt);
130 _cal_db_instance_allday_get_stmt(stmt, record);
132 ret = calendar_list_add(*out_list, record);
133 if (CALENDAR_ERROR_NONE != ret) {
134 calendar_list_destroy(*out_list, true);
136 calendar_record_destroy(record, true);
137 sqlite3_finalize(stmt);
142 sqlite3_finalize(stmt);
145 return CALENDAR_ERROR_NONE;
148 static int _cal_db_instance_allday_get_records_with_query(calendar_query_h query, int offset, int limit, calendar_list_h* out_list)
150 cal_query_s *que = NULL;
151 int ret = CALENDAR_ERROR_NONE;
152 char *condition = NULL;
153 char *projection = NULL;
154 GSList *bind_text = NULL, *cursor = NULL;
155 sqlite3_stmt *stmt = NULL;
159 que = (cal_query_s *)query;
161 if (CAL_STRING_EQUAL == strcmp(que->view_uri, CALENDAR_VIEW_INSTANCE_LOCALTIME_CALENDAR)) {
162 table_name = cal_strdup(CAL_VIEW_TABLE_ALLDAY_INSTANCE);
163 } else if (CAL_STRING_EQUAL == strcmp(que->view_uri, CALENDAR_VIEW_INSTANCE_LOCALTIME_CALENDAR_EXTENDED)) {
164 table_name = cal_strdup(CAL_VIEW_TABLE_ALLDAY_INSTANCE_EXTENDED);
166 ERR("uri(%s) not support get records with query", que->view_uri);
167 return CALENDAR_ERROR_INVALID_PARAMETER;
172 ret = cal_db_query_create_condition(query, &condition, &bind_text);
173 if (CALENDAR_ERROR_NONE != ret) {
174 CAL_FREE(table_name);
175 ERR("cal_db_query_create_condition() Fail(%d), ret");
180 /* make: projection */
181 ret = cal_db_query_create_projection(query, &projection);
183 char *query_str = NULL;
184 /* query: projection */
186 cal_db_append_string(&query_str, "SELECT");
187 cal_db_append_string(&query_str, projection);
188 cal_db_append_string(&query_str, "FROM");
189 cal_db_append_string(&query_str, table_name);
190 CAL_FREE(projection);
192 cal_db_append_string(&query_str, "SELECT * FROM");
193 cal_db_append_string(&query_str, table_name);
195 CAL_FREE(table_name);
197 /* query: condition */
199 cal_db_append_string(&query_str, "WHERE (");
200 cal_db_append_string(&query_str, condition);
201 cal_db_append_string(&query_str, ")");
206 ret = cal_db_query_create_order(query, condition, &order);
208 cal_db_append_string(&query_str, order);
214 char buf[CAL_STR_SHORT_LEN32] = {0};
216 snprintf(buf, sizeof(buf), "LIMIT %d", limit);
217 cal_db_append_string(&query_str, buf);
220 snprintf(buf, sizeof(buf), "OFFSET %d", offset);
221 cal_db_append_string(&query_str, buf);
226 ret = cal_db_util_query_prepare(query_str, &stmt);
227 if (CALENDAR_ERROR_NONE != ret) {
228 ERR("cal_db_util_query_prepare() Fail(%d)", ret);
229 SECURE("query[%s]", query_str);
231 g_slist_free_full(bind_text, free);
240 g_slist_length(bind_text);
241 for (cursor = bind_text, i = 1; cursor; cursor = cursor->next, i++)
242 cal_db_util_stmt_bind_text(stmt, i, cursor->data);
245 ret = calendar_list_create(out_list);
246 if (CALENDAR_ERROR_NONE != ret) {
248 g_slist_free_full(bind_text, free);
251 ERR("calendar_list_create() Fail");
252 sqlite3_finalize(stmt);
257 while (CAL_SQLITE_ROW == cal_db_util_stmt_step(stmt)) {
258 calendar_record_h record;
259 ret = calendar_record_create(que->view_uri, &record);
260 if (CALENDAR_ERROR_NONE != ret) {
261 calendar_list_destroy(*out_list, true);
265 g_slist_free_full(bind_text, free);
268 sqlite3_finalize(stmt);
272 if (0 < que->projection_count) {
273 cal_record_set_projection(record, que->projection, que->projection_count, que->property_count);
274 _cal_db_instance_allday_get_projection_stmt(stmt, que->projection, que->projection_count, record);
276 _cal_db_instance_allday_get_stmt(stmt, record);
279 ret = calendar_list_add(*out_list, record);
280 if (CALENDAR_ERROR_NONE != ret) {
281 calendar_list_destroy(*out_list, true);
283 calendar_record_destroy(record, true);
286 g_slist_free_full(bind_text, free);
289 sqlite3_finalize(stmt);
296 g_slist_free_full(bind_text, free);
300 sqlite3_finalize(stmt);
303 return CALENDAR_ERROR_NONE;
306 static int _cal_db_instance_allday_get_count(int *out_count)
308 RETV_IF(NULL == out_count, CALENDAR_ERROR_INVALID_PARAMETER);
310 char *query_str = NULL;
311 cal_db_append_string(&query_str, "SELECT count(*) FROM");
312 cal_db_append_string(&query_str, CAL_TABLE_ALLDAY_INSTANCE);
316 ret = cal_db_util_query_get_first_int_result(query_str, NULL, &count);
317 if (CALENDAR_ERROR_NONE != ret) {
318 ERR("cal_db_util_query_get_first_int_result() Fail");
322 DBG("count(%d) str[%s]", count, query_str);
326 return CALENDAR_ERROR_NONE;
329 static int _cal_db_instance_allday_get_count_with_query(calendar_query_h query, int *out_count)
331 cal_query_s *que = NULL;
332 int ret = CALENDAR_ERROR_NONE;
333 char *condition = NULL;
336 GSList *bind_text = NULL;
338 que = (cal_query_s *)query;
340 if (CAL_STRING_EQUAL == strcmp(que->view_uri, CALENDAR_VIEW_INSTANCE_LOCALTIME_CALENDAR)) {
341 table_name = cal_strdup(CAL_VIEW_TABLE_ALLDAY_INSTANCE);
342 } else if (CAL_STRING_EQUAL == strcmp(que->view_uri, CALENDAR_VIEW_INSTANCE_LOCALTIME_CALENDAR_EXTENDED)) {
343 table_name = cal_strdup(CAL_VIEW_TABLE_ALLDAY_INSTANCE_EXTENDED);
345 ERR("uri(%s) not support get records with query", que->view_uri);
346 return CALENDAR_ERROR_INVALID_PARAMETER;
351 ret = cal_db_query_create_condition(query, &condition, &bind_text);
352 if (CALENDAR_ERROR_NONE != ret) {
353 CAL_FREE(table_name);
354 ERR("cal_db_query_create_condition() Fail(%d), ret");
359 char *query_str = NULL;
361 cal_db_append_string(&query_str, "SELECT count(*) FROM");
362 cal_db_append_string(&query_str, table_name);
363 CAL_FREE(table_name);
365 /* query: condition */
367 cal_db_append_string(&query_str, "WHERE (");
368 cal_db_append_string(&query_str, condition);
369 cal_db_append_string(&query_str, ")");
374 ret = cal_db_util_query_get_first_int_result(query_str, bind_text, &count);
375 if (CALENDAR_ERROR_NONE != ret) {
376 ERR("cal_db_util_query_get_first_int_result() Fail");
378 g_slist_free_full(bind_text, free);
384 DBG("count(%d) str[%s]", count, query_str);
386 if (out_count) *out_count = count;
389 g_slist_free_full(bind_text, free);
393 return CALENDAR_ERROR_NONE;
396 static void _cal_db_instance_allday_get_stmt(sqlite3_stmt *stmt, calendar_record_h record)
398 cal_instance_allday_s* instance = (cal_instance_allday_s*)(record);
399 const unsigned char *temp;
402 instance->event_id = sqlite3_column_int(stmt, count++);
403 instance->start.type = sqlite3_column_int(stmt, count++);
405 temp = sqlite3_column_text(stmt, count++);
407 sscanf((const char *)temp, CAL_FORMAT_LOCAL_DATETIME, &(instance->start.time.date.year),
408 &(instance->start.time.date.month), &(instance->start.time.date.mday),
409 &(instance->start.time.date.hour), &(instance->start.time.date.minute),
410 &(instance->start.time.date.second));
411 DBG(CAL_FORMAT_LOCAL_DATETIME, instance->start.time.date.year, instance->start.time.date.month, instance->start.time.date.mday,
412 instance->start.time.date.hour, instance->start.time.date.minute, instance->start.time.date.second);
415 instance->end.type = sqlite3_column_int(stmt, count++);
417 temp = sqlite3_column_text(stmt, count++);
419 sscanf((const char *)temp, CAL_FORMAT_LOCAL_DATETIME, &(instance->end.time.date.year),
420 &(instance->end.time.date.month), &(instance->end.time.date.mday),
421 &(instance->end.time.date.hour), &(instance->end.time.date.minute),
422 &(instance->end.time.date.second));
423 DBG(CAL_FORMAT_LOCAL_DATETIME, instance->end.time.date.year, instance->end.time.date.month, instance->end.time.date.mday,
424 instance->end.time.date.hour, instance->end.time.date.minute, instance->end.time.date.second);
427 temp = sqlite3_column_text(stmt, count++);
428 instance->summary = cal_strdup((const char*)temp);
430 temp = sqlite3_column_text(stmt, count++);
431 instance->description = cal_strdup((const char*)temp);
433 temp = sqlite3_column_text(stmt, count++);
434 instance->location = cal_strdup((const char*)temp);
436 instance->busy_status = sqlite3_column_int(stmt, count++);
438 instance->event_status = sqlite3_column_int(stmt, count++);
440 instance->priority = sqlite3_column_int(stmt, count++);
442 instance->sensitivity = sqlite3_column_int(stmt, count++);
444 instance->has_rrule = sqlite3_column_int(stmt, count++);
445 if (0 < instance->has_rrule)
446 instance->has_rrule = 1;
448 instance->latitude = sqlite3_column_double(stmt, count++);
449 instance->longitude = sqlite3_column_double(stmt, count++);
450 instance->has_alarm = sqlite3_column_int(stmt, count++);
451 instance->original_event_id = sqlite3_column_int(stmt, count++);
452 instance->calendar_id = sqlite3_column_int(stmt, count++);
453 instance->last_mod = sqlite3_column_int64(stmt, count++);
455 temp = sqlite3_column_text(stmt, count++);
456 instance->sync_data1 = cal_strdup((const char*)temp);
458 instance->is_allday = sqlite3_column_int(stmt, count++);
463 static void _cal_db_instance_allday_get_property_stmt(sqlite3_stmt *stmt,
464 unsigned int property, int *stmt_count, calendar_record_h record)
466 cal_instance_allday_s* instance = (cal_instance_allday_s*)(record);
467 const unsigned char *temp;
470 case CAL_PROPERTY_INSTANCE_ALLDAY_START:
471 instance->start.type = CALENDAR_TIME_LOCALTIME;
472 *stmt_count = *stmt_count+1; /* utime */
473 *stmt_count = *stmt_count+1;
474 temp = sqlite3_column_text(stmt, *stmt_count);
476 sscanf((const char *)temp, CAL_FORMAT_LOCAL_DATETIME, &(instance->start.time.date.year),
477 &(instance->start.time.date.month), &(instance->start.time.date.mday),
478 &(instance->start.time.date.hour), &(instance->start.time.date.minute),
479 &(instance->start.time.date.second));
483 case CAL_PROPERTY_INSTANCE_ALLDAY_END:
484 instance->end.type = CALENDAR_TIME_LOCALTIME;
485 *stmt_count = *stmt_count+1; /* utime */
486 *stmt_count = *stmt_count+1;
487 temp = sqlite3_column_text(stmt, *stmt_count);
489 sscanf((const char *)temp, CAL_FORMAT_LOCAL_DATETIME, &(instance->end.time.date.year),
490 &(instance->end.time.date.month), &(instance->end.time.date.mday),
491 &(instance->end.time.date.hour), &(instance->end.time.date.minute),
492 &(instance->end.time.date.second));
495 case CAL_PROPERTY_INSTANCE_ALLDAY_SUMMARY:
496 temp = sqlite3_column_text(stmt, *stmt_count);
497 instance->summary = cal_strdup((const char*)temp);
499 case CAL_PROPERTY_INSTANCE_ALLDAY_LOCATION:
500 temp = sqlite3_column_text(stmt, *stmt_count);
501 instance->location = cal_strdup((const char*)temp);
503 case CAL_PROPERTY_INSTANCE_ALLDAY_CALENDAR_ID:
504 instance->calendar_id = sqlite3_column_int(stmt, *stmt_count);
506 case CAL_PROPERTY_INSTANCE_ALLDAY_DESCRIPTION:
507 temp = sqlite3_column_text(stmt, *stmt_count);
508 instance->description = cal_strdup((const char*)temp);
510 case CAL_PROPERTY_INSTANCE_ALLDAY_BUSY_STATUS:
511 instance->busy_status = sqlite3_column_int(stmt, *stmt_count);
513 case CAL_PROPERTY_INSTANCE_ALLDAY_EVENT_STATUS:
514 instance->event_status = sqlite3_column_int(stmt, *stmt_count);
516 case CAL_PROPERTY_INSTANCE_ALLDAY_PRIORITY:
517 instance->priority = sqlite3_column_int(stmt, *stmt_count);
519 case CAL_PROPERTY_INSTANCE_ALLDAY_SENSITIVITY:
520 instance->sensitivity = sqlite3_column_int(stmt, *stmt_count);
522 case CAL_PROPERTY_INSTANCE_ALLDAY_HAS_RRULE:
523 instance->has_rrule = sqlite3_column_int(stmt, *stmt_count);
524 if (0 < instance->has_rrule)
525 instance->has_rrule = 1;
528 case CAL_PROPERTY_INSTANCE_ALLDAY_LATITUDE:
529 instance->latitude = sqlite3_column_double(stmt, *stmt_count);
531 case CAL_PROPERTY_INSTANCE_ALLDAY_LONGITUDE:
532 instance->longitude = sqlite3_column_double(stmt, *stmt_count);
534 case CAL_PROPERTY_INSTANCE_ALLDAY_EVENT_ID:
535 instance->event_id = sqlite3_column_int(stmt, *stmt_count);
537 case CAL_PROPERTY_INSTANCE_ALLDAY_HAS_ALARM:
538 instance->has_alarm = sqlite3_column_int(stmt, *stmt_count);
540 case CAL_PROPERTY_INSTANCE_ALLDAY_ORIGINAL_EVENT_ID:
541 instance->original_event_id = sqlite3_column_int(stmt, *stmt_count);
543 case CAL_PROPERTY_INSTANCE_ALLDAY_LAST_MODIFIED_TIME:
544 instance->last_mod = sqlite3_column_int64(stmt, *stmt_count);
546 case CAL_PROPERTY_INSTANCE_ALLDAY_SYNC_DATA1:
547 temp = sqlite3_column_text(stmt, *stmt_count);
548 instance->sync_data1 = cal_strdup((const char*)temp);
550 case CAL_PROPERTY_INSTANCE_ALLDAY_IS_ALLDAY:
551 instance->is_allday = sqlite3_column_int64(stmt, *stmt_count);
555 sqlite3_column_int(stmt, *stmt_count);
559 *stmt_count = *stmt_count+1;
564 static void _cal_db_instance_allday_get_projection_stmt(sqlite3_stmt *stmt,
565 const unsigned int *projection, const int projection_count,
566 calendar_record_h record)
571 for (i = 0; i < projection_count; i++)
572 _cal_db_instance_allday_get_property_stmt(stmt, projection[i], &stmt_count, record);