PageRenderTime 81ms CodeModel.GetById 26ms RepoModel.GetById 1ms app.codeStats 0ms

/contacts-service/helper/sqlite.c

https://review.tizen.org/git/
C | 353 lines | 283 code | 50 blank | 20 comment | 68 complexity | 5adf526832e729bc17a3acb3756f49e5 MD5 | raw file
Possible License(s): GPL-3.0, AGPL-3.0, GPL-2.0, MPL-2.0, JSON, WTFPL, CC-BY-SA-4.0, CC-BY-3.0, BSD-3-Clause, LGPL-2.0, MPL-2.0-no-copyleft-exception, AGPL-1.0, 0BSD, Zlib, Unlicense, BSD-2-Clause, Apache-2.0, LGPL-3.0, ISC, MIT, CC-BY-SA-3.0, CC0-1.0, LGPL-2.1
  1. /*
  2. * Contacts Service Helper
  3. *
  4. * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
  5. *
  6. * Contact: Youngjae Shin <yj99.shin@samsung.com>
  7. *
  8. * Licensed under the Apache License, Version 2.0 (the "License");
  9. * you may not use this file except in compliance with the License.
  10. * You may obtain a copy of the License at
  11. *
  12. * http://www.apache.org/licenses/LICENSE-2.0
  13. *
  14. * Unless required by applicable law or agreed to in writing, software
  15. * distributed under the License is distributed on an "AS IS" BASIS,
  16. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  17. * See the License for the specific language governing permissions and
  18. * limitations under the License.
  19. *
  20. */
  21. #include <unistd.h>
  22. #include <string.h>
  23. #include <db-util.h>
  24. #include <fcntl.h>
  25. #include "cts-errors.h"
  26. #include "cts-schema.h"
  27. #include "cts-sqlite.h"
  28. #include "cts-utils.h"
  29. #include "internal.h"
  30. #include "normalize.h"
  31. #include "utils.h"
  32. static sqlite3 *helper_db;
  33. int helper_db_open(sqlite3 **db)
  34. {
  35. HELPER_FN_CALL;
  36. int ret;
  37. if (!helper_db)
  38. {
  39. ret = db_util_open(CTS_DB_PATH, &helper_db, 0);
  40. h_retvm_if(ret != SQLITE_OK, CTS_ERR_DB_NOT_OPENED,
  41. "db_util_open() Failed(%d)", ret);
  42. }
  43. if (db)
  44. *db = helper_db;
  45. return CTS_SUCCESS;
  46. }
  47. int helper_db_close(void)
  48. {
  49. if (helper_db)
  50. {
  51. db_util_close(helper_db);
  52. helper_db = NULL;
  53. }
  54. return CTS_SUCCESS;
  55. }
  56. int helper_begin_trans(void)
  57. {
  58. int ret = -1;
  59. ret = sqlite3_exec(helper_db, "BEGIN IMMEDIATE TRANSACTION",
  60. NULL, NULL, NULL);
  61. while (SQLITE_BUSY == ret) {
  62. sleep(1);
  63. ret = sqlite3_exec(helper_db, "BEGIN IMMEDIATE TRANSACTION",
  64. NULL, NULL, NULL);
  65. }
  66. if (SQLITE_OK != ret)
  67. {
  68. ERR("sqlite3_exec() Failed(%d)", ret);
  69. return CTS_ERR_DB_FAILED;
  70. }
  71. return CTS_SUCCESS;
  72. }
  73. #define CTS_COMMIT_TRY_MAX 3
  74. int helper_end_trans(bool success)
  75. {
  76. int ret = -1, i=0;
  77. char *errmsg = NULL;
  78. if (success) {
  79. ret = sqlite3_exec(helper_db, "COMMIT TRANSACTION",
  80. NULL, NULL, &errmsg);
  81. if (SQLITE_OK != ret)
  82. {
  83. ERR("sqlite3_exec(COMMIT) Failed(%d, %s)", ret, errmsg);
  84. sqlite3_free(errmsg);
  85. while (SQLITE_BUSY == ret && i<CTS_COMMIT_TRY_MAX) {
  86. i++;
  87. sleep(1);
  88. ret = sqlite3_exec(helper_db, "COMMIT TRANSACTION",
  89. NULL, NULL, NULL);
  90. }
  91. if (SQLITE_OK != ret) {
  92. ERR("sqlite3_exec() Failed(%d)", ret);
  93. sqlite3_exec(helper_db, "ROLLBACK TRANSACTION",
  94. NULL, NULL, NULL);
  95. return CTS_ERR_DB_FAILED;
  96. }
  97. }
  98. }
  99. else {
  100. sqlite3_exec(helper_db, "ROLLBACK TRANSACTION", NULL, NULL, NULL);
  101. }
  102. return CTS_SUCCESS;
  103. }
  104. int helper_update_default_language(int prev_lang, int new_lang)
  105. {
  106. int ret;
  107. sqlite3* db = NULL;
  108. char *errmsg = NULL;
  109. char query[CTS_SQL_MIN_LEN] = {0};
  110. ret = helper_db_open(&db);
  111. h_retvm_if(CTS_SUCCESS != ret, ret, "helper_db_open() Failed(%d)", ret);
  112. ret = helper_begin_trans();
  113. h_retvm_if(ret, ret, "helper_begin_trans() Failed(%d)", ret);
  114. snprintf(query, sizeof(query), "UPDATE %s SET %s=%d WHERE datatype = %d AND %s=%d",
  115. CTS_TABLE_DATA, CTS_SCHEMA_DATA_NAME_LANG_INFO, prev_lang, CTS_DATA_NAME,
  116. CTS_SCHEMA_DATA_NAME_LANG_INFO, CTS_LANG_DEFAULT);
  117. ret = sqlite3_exec(db, query, NULL, NULL, &errmsg);
  118. if (SQLITE_OK != ret)
  119. {
  120. ERR("sqlite3_exec(%s) Failed(%d, %s)", query, ret, errmsg);
  121. sqlite3_free(errmsg);
  122. helper_end_trans(false);
  123. return CTS_ERR_DB_FAILED;
  124. }
  125. snprintf(query, sizeof(query), "UPDATE %s SET %s=%d WHERE datatype = %d AND %s=%d",
  126. CTS_TABLE_DATA, CTS_SCHEMA_DATA_NAME_LANG_INFO, CTS_LANG_DEFAULT, CTS_DATA_NAME,
  127. CTS_SCHEMA_DATA_NAME_LANG_INFO, new_lang);
  128. ret = sqlite3_exec(db, query, NULL, NULL, &errmsg);
  129. if (SQLITE_OK != ret)
  130. {
  131. ERR("sqlite3_exec(%s) Failed(%d, %s)", query, ret, errmsg);
  132. sqlite3_free(errmsg);
  133. helper_end_trans(false);
  134. return CTS_ERR_DB_FAILED;
  135. }
  136. ret = helper_set_default_language(new_lang);
  137. if (CTS_SUCCESS != ret) {
  138. helper_end_trans(false);
  139. return ret;
  140. }
  141. ret = helper_end_trans(true);
  142. helper_db_close();
  143. return ret;
  144. }
  145. int helper_insert_SDN_contact(const char *name, const char *number)
  146. {
  147. int ret;
  148. sqlite3* db = NULL;
  149. sqlite3_stmt* stmt = NULL;
  150. char query[CTS_SQL_MIN_LEN] = {0};
  151. ret = helper_db_open(&db);
  152. h_retvm_if(CTS_SUCCESS != ret, ret, "helper_db_open() Failed(%d)", ret);
  153. snprintf(query, sizeof(query), "INSERT INTO %s(name, number) VALUES(?,?)",
  154. CTS_TABLE_SIM_SERVICES);
  155. ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
  156. if(SQLITE_OK != ret) {
  157. ERR("sqlite3_prepare_v2(%s) Failed(%s)", query, sqlite3_errmsg(db));
  158. helper_db_close();
  159. return CTS_ERR_DB_FAILED;
  160. }
  161. sqlite3_bind_text(stmt, 1, name, strlen(name), SQLITE_STATIC);
  162. sqlite3_bind_text(stmt, 2, number, strlen(number), SQLITE_STATIC);
  163. ret = sqlite3_step(stmt);
  164. if (SQLITE_DONE != ret) {
  165. ERR("sqlite3_step() Failed(%d)", ret);
  166. sqlite3_finalize(stmt);
  167. helper_db_close();
  168. return CTS_ERR_DB_FAILED;
  169. }
  170. sqlite3_finalize(stmt);
  171. helper_db_close();
  172. return CTS_SUCCESS;
  173. }
  174. int helper_delete_SDN_contact(void)
  175. {
  176. int ret;
  177. sqlite3* db = NULL;
  178. sqlite3_stmt* stmt = NULL;
  179. char query[CTS_SQL_MAX_LEN] = {0};
  180. ret = helper_db_open(&db);
  181. h_retvm_if(CTS_SUCCESS != ret, ret, "helper_db_open() Failed(%d)", ret);
  182. snprintf(query, sizeof(query), "DELETE FROM %s", CTS_TABLE_SIM_SERVICES);
  183. ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
  184. if(SQLITE_OK != ret) {
  185. ERR("sqlite3_prepare_v2(%s) Failed(%s)", query, sqlite3_errmsg(db));
  186. helper_db_close();
  187. return CTS_ERR_DB_FAILED;
  188. }
  189. ret = sqlite3_step(stmt);
  190. if (SQLITE_DONE != ret) {
  191. ERR("sqlite3_step() Failed(%d)", ret);
  192. sqlite3_finalize(stmt);
  193. helper_db_close();
  194. return CTS_ERR_DB_FAILED;
  195. }
  196. sqlite3_finalize(stmt);
  197. helper_db_close();
  198. return CTS_SUCCESS;
  199. }
  200. static inline int helper_get_display_name(char *display, char *first,
  201. char *last, char *dest, int dest_size)
  202. {
  203. if (display) {
  204. snprintf(dest, dest_size, "%s", display);
  205. }
  206. else {
  207. if (NULL == first && NULL == last)
  208. return CTS_ERR_NO_DATA;
  209. if (!last)
  210. snprintf(dest, dest_size, "%s", first);
  211. else if (!first)
  212. snprintf(dest, dest_size, "%s", last);
  213. else if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY))
  214. snprintf(dest, dest_size, "%s %s", first, last);
  215. else
  216. snprintf(dest, dest_size, "%s, %s", last, first);
  217. }
  218. return CTS_SUCCESS;
  219. }
  220. int helper_update_collation()
  221. {
  222. int ret;
  223. sqlite3* db = NULL;
  224. cts_stmt stmt = NULL;
  225. char query[CTS_SQL_MIN_LEN] = {0};
  226. char sortkey[CTS_SQL_MIN_LEN];
  227. char dest[CTS_SQL_MIN_LEN];
  228. ret = helper_db_open(&db);
  229. h_retvm_if(CTS_SUCCESS != ret, ret, "helper_db_open() Failed(%d)", ret);
  230. ret = helper_begin_trans();
  231. if(CTS_SUCCESS != ret) {
  232. ERR("helper_begin_trans() Failed(%d)", ret);
  233. helper_db_close();
  234. return ret;
  235. }
  236. snprintf(query, sizeof(query),
  237. "SELECT contact_id, data2, data3, data5 FROM %s WHERE datatype = %d",
  238. CTS_TABLE_DATA, CTS_DATA_NAME);
  239. ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
  240. if(SQLITE_OK != ret) {
  241. ERR("sqlite3_prepare_v2(%s) Failed(%s)", query, sqlite3_errmsg(db));
  242. helper_end_trans(false);
  243. helper_db_close();
  244. return CTS_ERR_DB_FAILED;
  245. }
  246. while (SQLITE_ROW == (ret = sqlite3_step(stmt))) {
  247. cts_stmt update_stmt = NULL;
  248. int contact_id = sqlite3_column_int(stmt, 0);
  249. char *first = (char*)sqlite3_column_text(stmt, 1);
  250. char *last = (char*)sqlite3_column_text(stmt, 2);
  251. char *display = (char*)sqlite3_column_text(stmt, 3);
  252. ret = helper_get_display_name(display, first, last, dest, sizeof(dest));
  253. if (CTS_SUCCESS != ret)
  254. continue;
  255. ret = helper_collation_str(dest, sortkey, sizeof(sortkey));
  256. if (CTS_SUCCESS != ret) {
  257. ERR("helper_collation_str() Failed(%d)", ret);
  258. sqlite3_finalize(stmt);
  259. helper_end_trans(false);
  260. helper_db_close();
  261. return CTS_ERR_DB_FAILED;
  262. }
  263. snprintf(query, sizeof(query), "UPDATE %s SET %s=? WHERE contact_id=%d",
  264. CTS_TABLE_DATA, CTS_SCHEMA_DATA_NAME_SORTING_KEY,
  265. contact_id);
  266. ret = sqlite3_prepare_v2(db, query, strlen(query), &update_stmt, NULL);
  267. if(SQLITE_OK != ret) {
  268. ERR("sqlite3_prepare_v2(%s) Failed(%s)", query, sqlite3_errmsg(db));
  269. sqlite3_finalize(stmt);
  270. helper_end_trans(false);
  271. helper_db_close();
  272. return CTS_ERR_DB_FAILED;
  273. }
  274. sqlite3_bind_text(update_stmt, 1, sortkey, strlen(sortkey), SQLITE_STATIC);
  275. HELPER_DBG("query : %s", query);
  276. ret = sqlite3_step(update_stmt);
  277. if (SQLITE_DONE != ret) {
  278. ERR("sqlite3_exec(%s) Failed(%d, %s)", query, ret, sqlite3_errmsg(db));
  279. sqlite3_finalize(stmt);
  280. sqlite3_finalize(update_stmt);
  281. helper_end_trans(false);
  282. helper_db_close();
  283. return CTS_ERR_DB_FAILED;
  284. }
  285. sqlite3_finalize(update_stmt);
  286. }
  287. if (SQLITE_ROW != ret && SQLITE_DONE != ret) {
  288. ERR("sqlite3_step() Failed(%d)", ret);
  289. sqlite3_finalize(stmt);
  290. helper_end_trans(false);
  291. helper_db_close();
  292. return CTS_ERR_DB_FAILED;
  293. }
  294. sqlite3_finalize(stmt);
  295. ret = helper_end_trans(true);
  296. if (CTS_SUCCESS == ret) {
  297. int fd = open(CTS_NOTI_CONTACT_CHANGED_DEF, O_TRUNC | O_RDWR);
  298. if (0 <= fd)
  299. close(fd);
  300. }
  301. helper_db_close();
  302. return ret;
  303. }