4 * Copyright (c) 2010 - 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.
20 #include "ctsvc_internal.h"
21 #include "ctsvc_db_schema.h"
22 #include "ctsvc_db_sqlite.h"
23 #include "ctsvc_db_init.h"
24 #include "ctsvc_db_query.h"
25 #include "ctsvc_db_plugin_profile_helper.h"
26 #include "ctsvc_record.h"
27 #include "ctsvc_notification.h"
30 int ctsvc_db_profile_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count)
34 ctsvc_profile_s *profile;
36 ret = contacts_record_create(_contacts_profile._uri, (contacts_record_h*)&profile);
37 RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create Fail(%d)", ret);
39 profile->id = ctsvc_stmt_get_int(stmt, start_count++);
40 profile->contact_id = ctsvc_stmt_get_int(stmt, start_count++);
44 temp = ctsvc_stmt_get_text(stmt, start_count++);
45 profile->uid = SAFE_STRDUP(temp);
46 temp = ctsvc_stmt_get_text(stmt, start_count++);
47 profile->text = SAFE_STRDUP(temp);
48 profile->order = ctsvc_stmt_get_int(stmt, start_count++);
49 temp = ctsvc_stmt_get_text(stmt, start_count++);
50 profile->service_operation = SAFE_STRDUP(temp);
51 temp = ctsvc_stmt_get_text(stmt, start_count++);
52 profile->mime = SAFE_STRDUP(temp);
53 temp = ctsvc_stmt_get_text(stmt, start_count++);
54 profile->app_id = SAFE_STRDUP(temp);
55 temp = ctsvc_stmt_get_text(stmt, start_count++);
56 profile->uri = SAFE_STRDUP(temp);
57 temp = ctsvc_stmt_get_text(stmt, start_count++);
58 profile->category = SAFE_STRDUP(temp);
59 temp = ctsvc_stmt_get_text(stmt, start_count++);
60 profile->extra_data = SAFE_STRDUP(temp);
62 *record = (contacts_record_h)profile;
63 return CONTACTS_ERROR_NONE;
66 static inline int __ctsvc_profile_bind_stmt(cts_stmt stmt, ctsvc_profile_s *profile, int start_cnt)
69 ctsvc_stmt_bind_text(stmt, start_cnt, profile->uid);
71 ctsvc_stmt_bind_text(stmt, start_cnt+1, profile->text);
72 ctsvc_stmt_bind_int(stmt, start_cnt+2, profile->order);
73 if (profile->service_operation)
74 ctsvc_stmt_bind_text(stmt, start_cnt+3, profile->service_operation);
76 ctsvc_stmt_bind_text(stmt, start_cnt+4, profile->mime);
78 ctsvc_stmt_bind_text(stmt, start_cnt+5, profile->app_id);
80 ctsvc_stmt_bind_text(stmt, start_cnt+6, profile->uri);
81 if (profile->category)
82 ctsvc_stmt_bind_text(stmt, start_cnt+7, profile->category);
83 if (profile->extra_data)
84 ctsvc_stmt_bind_text(stmt, start_cnt+8, profile->extra_data);
85 return CONTACTS_ERROR_NONE;
88 int ctsvc_db_profile_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id)
92 char query[CTS_SQL_MAX_LEN] = {0};
93 ctsvc_profile_s *profile = (ctsvc_profile_s*)record;
95 RETV_IF(NULL == profile->text, CONTACTS_ERROR_NONE);
96 RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
97 "contact_id(%d) is mandatory field to insert profile record ", profile->contact_id);
98 RETVM_IF(0 < profile->id, CONTACTS_ERROR_INVALID_PARAMETER,
99 "id(%d), This record is already inserted", profile->id);
101 snprintf(query, sizeof(query),
102 "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, data3, data4, data5, "
103 "data6, data7, data8, data9, data10, data11) "
104 "VALUES(%d, %d, %d, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
105 contact_id, is_my_profile, CONTACTS_DATA_TYPE_PROFILE);
107 ret = ctsvc_query_prepare(query, &stmt);
108 RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
110 __ctsvc_profile_bind_stmt(stmt, profile, 1);
112 ret = ctsvc_stmt_step(stmt);
113 if (CONTACTS_ERROR_NONE != ret) {
114 /* LCOV_EXCL_START */
115 ERR("ctsvc_stmt_step() Fail(%d)", ret);
116 ctsvc_stmt_finalize(stmt);
121 /* profile->id = ctsvc_db_get_last_insert_id(); */
123 *id = ctsvc_db_get_last_insert_id();
124 ctsvc_stmt_finalize(stmt);
126 if (false == is_my_profile)
127 ctsvc_set_profile_noti();
129 return CONTACTS_ERROR_NONE;
133 int ctsvc_db_profile_update(contacts_record_h record, bool is_my_profile)
136 int ret = CONTACTS_ERROR_NONE;
138 GSList *bind_text = NULL;
139 GSList *cursor = NULL;
140 ctsvc_profile_s *profile = (ctsvc_profile_s*)record;
141 char query[CTS_SQL_MAX_LEN] = {0};
143 RETVM_IF(0 == profile->id, CONTACTS_ERROR_INVALID_PARAMETER, "profile of contact has no ID.");
145 snprintf(query, sizeof(query),
146 "SELECT id FROM "CTS_TABLE_DATA" WHERE id = %d", profile->id);
147 ret = ctsvc_query_get_first_int_result(query, &id);
148 RETV_IF(ret != CONTACTS_ERROR_NONE, ret);
150 RETVM_IF(CTSVC_PROPERTY_FLAG_DIRTY != (profile->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY), CONTACTS_ERROR_NONE, "No update");
153 if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
154 if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_update_record_with_set_query(set, bind_text, CTS_TABLE_DATA, profile->id))) break;
155 if (false == is_my_profile)
156 ctsvc_set_profile_noti();
159 CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s*)record);
163 for (cursor = bind_text; cursor; cursor = cursor->next) {
167 g_slist_free(bind_text);
174 int ctsvc_db_profile_delete(int id, bool is_my_profile)
177 char query[CTS_SQL_MIN_LEN] = {0};
179 snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d",
180 id, CONTACTS_DATA_TYPE_PROFILE);
182 ret = ctsvc_query_exec(query);
183 RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
185 if (false == is_my_profile)
186 ctsvc_set_profile_noti();
188 return CONTACTS_ERROR_NONE;