4 * Copyright (c) 2012 - 2013 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"
31 static int __cal_db_instance_normal_insert_record(calendar_record_h record, int* id);
32 //static int __cal_db_instance_normal_get_record(int id, calendar_record_h* out_record);
33 //static int __cal_db_instance_normal_update_record(calendar_record_h record);
34 static int __cal_db_instance_normal_delete_record(int id);
35 static int __cal_db_instance_normal_get_all_records(int offset, int limit, calendar_list_h* out_list);
36 static int __cal_db_instance_normal_get_records_with_query(calendar_query_h query, int offset, int limit, calendar_list_h* out_list);
37 //static int __cal_db_instance_normal_insert_records(const calendar_list_h list);
38 //static int __cal_db_instance_normal_update_records(const calendar_list_h list);
39 //static int __cal_db_instance_normal_delete_records(int ids[], int count);
40 static int __cal_db_instance_normal_get_count(int *out_count);
41 static int __cal_db_instance_normal_get_count_with_query(calendar_query_h query, int *out_count);
45 static void __cal_db_instance_normal_get_stmt(sqlite3_stmt *stmt,calendar_record_h record);
46 static void __cal_db_instance_normal_get_property_stmt(sqlite3_stmt *stmt,
47 unsigned int property, int *stmt_count, calendar_record_h record);
48 static void __cal_db_instance_normal_get_projection_stmt(sqlite3_stmt *stmt,
49 const unsigned int *projection, const int projection_count,
50 calendar_record_h record);
52 cal_db_plugin_cb_s _cal_db_instance_normal_plugin_cb = {
53 .is_query_only = false,
54 .insert_record=__cal_db_instance_normal_insert_record,
57 .delete_record=__cal_db_instance_normal_delete_record,
58 .get_all_records=__cal_db_instance_normal_get_all_records,
59 .get_records_with_query=__cal_db_instance_normal_get_records_with_query,
63 .get_count=__cal_db_instance_normal_get_count,
64 .get_count_with_query=__cal_db_instance_normal_get_count_with_query,
69 static int __cal_db_instance_normal_insert_record(calendar_record_h record, int* id)
72 char query[CAL_DB_SQL_MAX_LEN];
74 cal_instance_normal_s *normal = NULL;
75 cal_db_util_error_e dbret = CAL_DB_OK;
77 normal = (cal_instance_normal_s *)(record);
78 retvm_if(NULL == normal, CALENDAR_ERROR_INVALID_PARAMETER,
79 "Invalid argument: cal_instance_normal_s is NULL");
81 snprintf(query, sizeof(query),
84 "dtstart_utime, dtend_utime"
88 CAL_TABLE_NORMAL_INSTANCE,
90 normal->dtstart_utime, normal->dtend_utime);
92 stmt = _cal_db_util_query_prepare(query);
95 DBG("query[%s]", query);
96 ERR("_cal_db_util_query_prepare() Failed");
97 return CALENDAR_ERROR_DB_FAILED;
100 dbret = _cal_db_util_stmt_step(stmt);
101 if (CAL_DB_DONE != dbret)
103 ERR("_cal_db_util_stmt_step() Failed(%d)", dbret);
104 sqlite3_finalize(stmt);
107 case CAL_DB_ERROR_NO_SPACE:
108 return CALENDAR_ERROR_FILE_NO_SPACE;
110 return CALENDAR_ERROR_DB_FAILED;
114 index = _cal_db_util_last_insert_id();
115 sqlite3_finalize(stmt);
117 //calendar_record_set_int(record, _calendar_instance_normal.id, index);
123 return CALENDAR_ERROR_NONE;
126 static int __cal_db_instance_normal_delete_record(int id)
128 cal_db_util_error_e dbret = CAL_DB_OK;
129 char query[CAL_DB_SQL_MAX_LEN] = {0};
131 retvm_if(id < 0, CALENDAR_ERROR_INVALID_PARAMETER,
132 "Invalid argument: id(%d) < 0", id);
134 snprintf(query, sizeof(query),
136 "WHERE event_id = %d ",
137 CAL_TABLE_NORMAL_INSTANCE,
140 dbret = _cal_db_util_query_exec(query);
141 if (dbret != CAL_DB_OK)
143 ERR("_cal_db_util_query_exec() Failed(%d)", dbret);
146 case CAL_DB_ERROR_NO_SPACE:
147 return CALENDAR_ERROR_FILE_NO_SPACE;
149 return CALENDAR_ERROR_DB_FAILED;
153 return CALENDAR_ERROR_NONE;
156 static int __cal_db_instance_normal_get_all_records(int offset, int limit, calendar_list_h* out_list)
158 int ret = CALENDAR_ERROR_NONE;
159 char query[CAL_DB_SQL_MAX_LEN] = {0};
160 char offsetquery[CAL_DB_SQL_MAX_LEN] = {0};
161 char limitquery[CAL_DB_SQL_MAX_LEN] = {0};
162 sqlite3_stmt *stmt = NULL;
164 retvm_if(NULL == out_list, CALENDAR_ERROR_INVALID_PARAMETER, "Invalid parameter");
166 ret = calendar_list_create(out_list);
167 retvm_if(CALENDAR_ERROR_NONE != ret, CALENDAR_ERROR_INVALID_PARAMETER, "Invalid parameter");
171 snprintf(offsetquery, sizeof(offsetquery), "OFFSET %d", offset);
175 snprintf(limitquery, sizeof(limitquery), "LIMIT %d", limit);
177 snprintf(query, sizeof(query),
178 "SELECT * FROM %s %s %s",
179 CAL_TABLE_NORMAL_INSTANCE, limitquery, offsetquery);
181 stmt = _cal_db_util_query_prepare(query);
184 ERR("_cal_db_util_query_prepare() Failed");
185 calendar_list_destroy(*out_list, true);
187 return CALENDAR_ERROR_DB_FAILED;
190 while(CAL_DB_ROW == _cal_db_util_stmt_step(stmt))
192 calendar_record_h record;
194 ret = calendar_record_create(_calendar_instance_normal._uri,&record);
195 if( ret != CALENDAR_ERROR_NONE )
197 calendar_list_destroy(*out_list, true);
199 sqlite3_finalize(stmt);
202 __cal_db_instance_normal_get_stmt(stmt,record);
204 ret = calendar_list_add(*out_list,record);
205 if( ret != CALENDAR_ERROR_NONE )
207 calendar_list_destroy(*out_list, true);
209 calendar_record_destroy(record, true);
210 sqlite3_finalize(stmt);
214 sqlite3_finalize(stmt);
216 return CALENDAR_ERROR_NONE;
219 static int __cal_db_instance_normal_get_records_with_query(calendar_query_h query, int offset, int limit, calendar_list_h* out_list)
221 cal_query_s *que = NULL;
222 int ret = CALENDAR_ERROR_NONE;
223 char *condition = NULL;
224 char *projection = NULL;
226 GSList *bind_text = NULL, *cursor = NULL;
227 char strquery[CAL_DB_SQL_MAX_LEN] = {0};
229 sqlite3_stmt *stmt = NULL;
233 que = (cal_query_s *)query;
235 if ( 0 == strcmp(que->view_uri, CALENDAR_VIEW_INSTANCE_NORMAL_CALENDAR))
237 table_name = SAFE_STRDUP(CAL_VIEW_TABLE_NORMAL_INSTANCE);
241 ERR("uri(%s) not support get records with query",que->view_uri);
242 return CALENDAR_ERROR_INVALID_PARAMETER;
243 //table_name = SAFE_STRDUP(CAL_TABLE_NORMAL_INSTANCE);
249 ret = _cal_db_query_create_condition(query,
250 &condition, &bind_text);
251 if (ret != CALENDAR_ERROR_NONE)
253 CAL_FREE(table_name);
254 ERR("filter create fail");
260 ret = _cal_db_query_create_projection(query, &projection);
262 // query - projection
265 len = snprintf(strquery, sizeof(strquery), "SELECT %s FROM %s", projection, table_name);
269 len = snprintf(strquery, sizeof(strquery), "SELECT * FROM %s", table_name);
271 CAL_FREE(table_name);
276 len += snprintf(strquery+len, sizeof(strquery)-len, " WHERE %s", condition);
280 ret = _cal_db_query_create_order(query, &order);
283 len += snprintf(strquery+len, sizeof(strquery)-len, " %s", order);
288 len += snprintf(strquery+len, sizeof(strquery)-len, " LIMIT %d", limit);
290 len += snprintf(strquery+len, sizeof(strquery)-len, " OFFSET %d", offset);
294 stmt = _cal_db_util_query_prepare(strquery);
299 g_slist_free(bind_text);
302 CAL_FREE(projection);
303 ERR("_cal_db_util_query_prepare() Failed");
304 return CALENDAR_ERROR_DB_FAILED;
306 CAL_DBG("%s",strquery);
311 len = g_slist_length(bind_text);
312 for (cursor=bind_text, i=1; cursor;cursor=cursor->next, i++)
314 _cal_db_util_stmt_bind_text(stmt, i, cursor->data);
319 ret = calendar_list_create(out_list);
320 if (ret != CALENDAR_ERROR_NONE)
324 g_slist_free(bind_text);
327 CAL_FREE(projection);
328 ERR("calendar_list_create() Failed");
329 sqlite3_finalize(stmt);
333 while(CAL_DB_ROW == _cal_db_util_stmt_step(stmt))
335 calendar_record_h record;
337 ret = calendar_record_create(que->view_uri,&record);
338 if( ret != CALENDAR_ERROR_NONE )
340 calendar_list_destroy(*out_list, true);
345 g_slist_free(bind_text);
348 CAL_FREE(projection);
349 sqlite3_finalize(stmt);
352 if (que->projection_count > 0)
354 _cal_record_set_projection(record,
355 que->projection, que->projection_count, que->property_count);
357 __cal_db_instance_normal_get_projection_stmt(stmt,
358 que->projection, que->projection_count,
363 __cal_db_instance_normal_get_stmt(stmt,record);
366 ret = calendar_list_add(*out_list,record);
367 if( ret != CALENDAR_ERROR_NONE )
369 calendar_list_destroy(*out_list, true);
371 calendar_record_destroy(record, true);
375 g_slist_free(bind_text);
378 CAL_FREE(projection);
379 sqlite3_finalize(stmt);
386 g_slist_free(bind_text);
389 CAL_FREE(projection);
390 sqlite3_finalize(stmt);
392 return CALENDAR_ERROR_NONE;
395 static int __cal_db_instance_normal_get_count(int *out_count)
397 char query[CAL_DB_SQL_MAX_LEN] = {0};
401 retvm_if(NULL == out_count, CALENDAR_ERROR_INVALID_PARAMETER, "Invalid parameter");
403 snprintf(query, sizeof(query), "SELECT count(*) FROM %s ", CAL_TABLE_NORMAL_INSTANCE);
405 ret = _cal_db_util_query_get_first_int_result(query, NULL, &count);
406 if (CALENDAR_ERROR_NONE != ret)
408 ERR("_cal_db_util_query_get_first_int_result() failed");
411 CAL_DBG("%s=%d",query,count);
414 return CALENDAR_ERROR_NONE;
417 static int __cal_db_instance_normal_get_count_with_query(calendar_query_h query, int *out_count)
419 cal_query_s *que = NULL;
420 int ret = CALENDAR_ERROR_NONE;
421 char *condition = NULL;
422 char strquery[CAL_DB_SQL_MAX_LEN] = {0};
426 GSList *bind_text = NULL;
428 que = (cal_query_s *)query;
430 if ( 0 == strcmp(que->view_uri, CALENDAR_VIEW_INSTANCE_NORMAL_CALENDAR))
432 table_name = SAFE_STRDUP(CAL_VIEW_TABLE_NORMAL_INSTANCE);
436 ERR("uri(%s) not support get records with query",que->view_uri);
437 return CALENDAR_ERROR_INVALID_PARAMETER;
438 //table_name = SAFE_STRDUP(CAL_TABLE_NORMAL_INSTANCE);
444 ret = _cal_db_query_create_condition(query, &condition, &bind_text);
445 if (ret != CALENDAR_ERROR_NONE)
447 CAL_FREE(table_name);
448 ERR("filter create fail");
453 // query - select from
455 len = snprintf(strquery, sizeof(strquery), "SELECT count(*) FROM %s", table_name);
456 CAL_FREE(table_name);
461 len += snprintf(strquery+len, sizeof(strquery)-len, " WHERE %s", condition);
465 ret = _cal_db_util_query_get_first_int_result(strquery, bind_text, &count);
466 if (CALENDAR_ERROR_NONE != ret)
468 ERR("_cal_db_util_query_get_first_int_result() failed");
471 g_slist_free(bind_text);
476 CAL_DBG("%s=%d",strquery,count);
478 if (out_count) *out_count = count;
482 g_slist_free(bind_text);
485 return CALENDAR_ERROR_NONE;
488 static void __cal_db_instance_normal_get_stmt(sqlite3_stmt *stmt,calendar_record_h record)
490 cal_instance_normal_s* instance = (cal_instance_normal_s*)(record);
491 const unsigned char *temp;
494 instance->event_id = sqlite3_column_int(stmt, count++);
495 instance->dtstart_type = sqlite3_column_int(stmt, count++);
496 instance->dtstart_utime = sqlite3_column_int64(stmt, count++);
497 sqlite3_column_text(stmt, count++); //datetime
498 instance->dtend_type = sqlite3_column_int(stmt, count++);
499 instance->dtend_utime = sqlite3_column_int64(stmt, count++);
500 sqlite3_column_text(stmt, count++); //datetime
502 temp = sqlite3_column_text(stmt, count++);
503 instance->summary = SAFE_STRDUP(temp);
505 temp = sqlite3_column_text(stmt, count++);
506 instance->description = SAFE_STRDUP(temp);
508 temp = sqlite3_column_text(stmt, count++);
509 instance->location = SAFE_STRDUP(temp);
511 instance->busy_status = sqlite3_column_int(stmt, count++);
513 instance->event_status = sqlite3_column_int(stmt, count++);
515 instance->priority = sqlite3_column_int(stmt, count++);
517 instance->sensitivity = sqlite3_column_int(stmt, count++);
519 instance->has_rrule = sqlite3_column_int(stmt, count++);
520 if (instance->has_rrule > 0)
522 instance->has_rrule = 1;
525 instance->latitude = sqlite3_column_double(stmt,count++);
526 instance->longitude = sqlite3_column_double(stmt,count++);
527 instance->has_alarm = sqlite3_column_int(stmt,count++);
528 instance->original_event_id = sqlite3_column_int(stmt, count++);
529 instance->calendar_id = sqlite3_column_int(stmt, count++);
530 instance->last_mod = sqlite3_column_int64(stmt, count++);
535 static void __cal_db_instance_normal_get_property_stmt(sqlite3_stmt *stmt,
536 unsigned int property, int *stmt_count, calendar_record_h record)
538 cal_instance_normal_s* instance = (cal_instance_normal_s*)(record);
539 const unsigned char *temp;
543 case CAL_PROPERTY_INSTANCE_NORMAL_START:
544 sqlite3_column_int(stmt,*stmt_count);
545 *stmt_count = *stmt_count+1;
546 instance->dtstart_type = CALENDAR_TIME_UTIME;//sqlite3_column_int(stmt, *stmt_count);
547 instance->dtstart_utime = sqlite3_column_int64(stmt, *stmt_count);
548 *stmt_count = *stmt_count+1;
549 sqlite3_column_text(stmt, *stmt_count); // dtstart_datetime
551 case CAL_PROPERTY_INSTANCE_NORMAL_END:
552 sqlite3_column_int(stmt,*stmt_count);
553 *stmt_count = *stmt_count+1;
554 instance->dtend_type = CALENDAR_TIME_UTIME;//sqlite3_column_int(stmt, *stmt_count);
555 instance->dtend_utime = sqlite3_column_int64(stmt, *stmt_count);
556 *stmt_count = *stmt_count+1;
557 sqlite3_column_text(stmt, *stmt_count);
559 case CAL_PROPERTY_INSTANCE_NORMAL_SUMMARY:
560 temp = sqlite3_column_text(stmt, *stmt_count);
561 instance->summary = SAFE_STRDUP(temp);
563 case CAL_PROPERTY_INSTANCE_NORMAL_LOCATION:
564 temp = sqlite3_column_text(stmt, *stmt_count);
565 instance->location = SAFE_STRDUP(temp);
567 case CAL_PROPERTY_INSTANCE_NORMAL_CALENDAR_ID:
568 instance->calendar_id = sqlite3_column_int(stmt, *stmt_count);
570 case CAL_PROPERTY_INSTANCE_NORMAL_DESCRIPTION:
571 temp = sqlite3_column_text(stmt, *stmt_count);
572 instance->description = SAFE_STRDUP(temp);
574 case CAL_PROPERTY_INSTANCE_NORMAL_BUSY_STATUS:
575 instance->busy_status = sqlite3_column_int(stmt, *stmt_count);
577 case CAL_PROPERTY_INSTANCE_NORMAL_EVENT_STATUS:
578 instance->event_status = sqlite3_column_int(stmt, *stmt_count);
580 case CAL_PROPERTY_INSTANCE_NORMAL_PRIORITY:
581 instance->priority = sqlite3_column_int(stmt, *stmt_count);
583 case CAL_PROPERTY_INSTANCE_NORMAL_SENSITIVITY:
584 instance->sensitivity = sqlite3_column_int(stmt, *stmt_count);
586 case CAL_PROPERTY_INSTANCE_NORMAL_HAS_RRULE:
587 instance->has_rrule = sqlite3_column_int(stmt, *stmt_count);
588 if (instance->has_rrule > 0)
590 instance->has_rrule = 1;
593 case CAL_PROPERTY_INSTANCE_NORMAL_LATITUDE:
594 instance->latitude = sqlite3_column_double(stmt,*stmt_count);
596 case CAL_PROPERTY_INSTANCE_NORMAL_LONGITUDE:
597 instance->longitude = sqlite3_column_double(stmt,*stmt_count);
599 case CAL_PROPERTY_INSTANCE_NORMAL_EVENT_ID:
600 instance->event_id = sqlite3_column_int(stmt, *stmt_count);
602 case CAL_PROPERTY_INSTANCE_NORMAL_HAS_ALARM:
603 instance->has_alarm = sqlite3_column_int(stmt, *stmt_count);
605 case CAL_PROPERTY_INSTANCE_NORMAL_ORIGINAL_EVENT_ID:
606 instance->original_event_id = sqlite3_column_int(stmt, *stmt_count);
608 case CAL_PROPERTY_INSTANCE_NORMAL_LAST_MODIFIED_TIME:
609 instance->last_mod = sqlite3_column_int64(stmt, *stmt_count);
612 sqlite3_column_int(stmt, *stmt_count);
616 *stmt_count = *stmt_count+1;
621 static void __cal_db_instance_normal_get_projection_stmt(sqlite3_stmt *stmt,
622 const unsigned int *projection, const int projection_count,
623 calendar_record_h record)
628 for(i=0;i<projection_count;i++)
630 __cal_db_instance_normal_get_property_stmt(stmt,projection[i],&stmt_count,record);