2 This file is part of Telegram application for tizen
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public
15 License along with this library; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 #include "tg_db_manager.h"
24 #include "tg_common.h"
25 #include "tg_engine.h"
28 static const Eina_Bool is_use_persistent_db_open = EINA_FALSE;
36 sqlite3 *create_database()
40 static char dbfile[PATH_MAX];
42 snprintf(dbfile, sizeof(dbfile), "%s" DB_FILENAME, app_get_data_path());
43 if (is_use_persistent_db_open) {
47 ret = sqlite3_open(dbfile, &tg_db_info.db);
49 LOGE("DB creation failed in the persistent connection");
50 return tg_db_info.db = NULL;
53 ret = sqlite3_open(dbfile, &db);
54 sqlite3_busy_timeout(db, 3000);
56 LOGE("DB creation failed");
61 if (is_use_persistent_db_open)
67 void close_database(sqlite3 *db)
69 if (!is_use_persistent_db_open)
76 if (is_use_persistent_db_open)
83 if (is_use_persistent_db_open) {
85 sqlite3_close(tg_db_info.db);
90 Eina_Bool create_table(const char *table_name, Eina_List *column_names, Eina_List *column_types)
92 if (!table_name || ! column_names || !column_types)
95 sqlite3 *db = create_database();
101 int col_count = eina_list_count(column_names);
103 Eina_Strbuf *var_query = eina_strbuf_new();
109 eina_strbuf_append(var_query, "CREATE TABLE IF NOT EXISTS ");
110 eina_strbuf_append(var_query, table_name);
111 eina_strbuf_append(var_query, "(");
113 for(int col = 0; col < col_count ; col++) {
114 eina_strbuf_append_printf(var_query, "%s %s", eina_list_nth(column_names, col), eina_list_nth(column_types, col));
116 if (col < col_count - 1)
117 eina_strbuf_append(var_query, ", ");
119 eina_strbuf_append(var_query, ");");
122 ret = sqlite3_exec(db,eina_strbuf_string_get(var_query), NULL, NULL, &err_msg);
124 eina_strbuf_free(var_query);
125 if( ret != SQLITE_OK ){
126 LOGE("table cretion failed, %s", err_msg);
127 sqlite3_free(err_msg);
132 Eina_Bool insert_table(const char *table_name, Eina_List *column_names, Eina_List *column_types, Eina_List *column_values)
134 if (!table_name || ! column_names || !column_types || !column_values)
137 sqlite3 *db = create_database();
143 int col_count = eina_list_count(column_names);
145 Eina_Strbuf *var_query = eina_strbuf_new();
151 eina_strbuf_append(var_query, "INSERT INTO ");
152 eina_strbuf_append(var_query, table_name);
153 eina_strbuf_append(var_query, "(");
155 for (int col = 0; col < col_count; col++) {
157 char *col_name = eina_list_nth(column_names, col);
158 eina_strbuf_append(var_query, col_name);
160 if (col < col_count - 1)
161 eina_strbuf_append(var_query, ",");
163 eina_strbuf_append(var_query, ") VALUES (");
166 int col_val_count = eina_list_count(column_names);
168 for (int col = 0; col < col_val_count; col++) {
170 char *col_type = eina_list_nth(column_types, col);
171 if (!strcmp(col_type, "INTEGER") || !strcmp(col_type, "INTEGER PRIMARY KEY NOT NULL")) {
173 eina_strbuf_append_printf(var_query, "%d", *((int*)eina_list_nth(column_values, col)));
174 } else if (!strcmp(col_type, "TEXT") || !strcmp(col_type, "TEXT PRIMARY KEY NOT NULL")) {
176 char* escaped_text = replace(eina_list_nth(column_values, col), '\'', "''");
178 eina_strbuf_append_printf(var_query, "'%s'", escaped_text);
183 if (col < col_count - 1)
184 eina_strbuf_append(var_query, ", ");
186 eina_strbuf_append(var_query, ");");
189 ret = sqlite3_exec(db, eina_strbuf_string_get(var_query), NULL, NULL, &err_msg);
191 eina_strbuf_free(var_query);
192 if (ret != SQLITE_OK) {
193 sqlite3_free(err_msg);
201 Eina_Bool update_table(const char *table_name, Eina_List *column_names, Eina_List *column_types, Eina_List *column_values, const char *where_clause)
203 if (!table_name || ! column_names || !column_types || !column_values)
206 sqlite3 *db = create_database();
212 int col_count = eina_list_count(column_names);
214 Eina_Strbuf *var_query = eina_strbuf_new();
220 eina_strbuf_append(var_query, "UPDATE ");
221 eina_strbuf_append(var_query, table_name);
222 eina_strbuf_append(var_query, " SET ");
224 int col_val_count = eina_list_count(column_values);
226 for(int col = 0; col < col_val_count ; col++) {
227 char* col_name = eina_list_nth(column_names, col);
228 char* col_type = eina_list_nth(column_types, col);
230 if(!strcmp(col_type, "INTEGER") || !strcmp(col_type, "INTEGER PRIMARY KEY NOT NULL")) {
232 eina_strbuf_append_printf(var_query, "%s = %d", col_name, *((int*)eina_list_nth(column_values, col)));
234 } else if(!strcmp(col_type, "TEXT") || !strcmp(col_type, "TEXT PRIMARY KEY NOT NULL")) {
236 char* escaped_text = replace(eina_list_nth(column_values, col), '\'', "''");
238 eina_strbuf_append_printf(var_query, "%s = '%s'", col_name, escaped_text);
243 if (col < col_count - 1)
244 eina_strbuf_append(var_query, ", ");
246 eina_strbuf_append(var_query, " ");
249 eina_strbuf_append(var_query, " WHERE ");
250 eina_strbuf_append(var_query, where_clause);
251 eina_strbuf_append(var_query, "; ");
253 ret = sqlite3_exec(db, eina_strbuf_string_get(var_query), NULL, NULL, &err_msg);
256 eina_strbuf_free(var_query);
257 if( ret != SQLITE_OK ){
258 sqlite3_free(err_msg);
264 Eina_Bool get_values_from_table(const char *table_name, Eina_List *column_names, int (*callback)(void*, int, char**, char**), const char *where_clause, void *data_to_callback)
269 if (get_number_of_rows(table_name, NULL) == 0) {
270 DBG("There are no rows on [%s]", table_name);
274 sqlite3* db = create_database();
278 Eina_Strbuf *var_query = eina_strbuf_new();
284 eina_strbuf_append(var_query, "SELECT ");
287 var_query = realloc(var_query, strlen(var_query) + 3);
288 eina_strbuf_append(var_query, "* ");
291 int col_count = eina_list_count(column_names);
292 char* col_name = NULL;
293 for(int col = 0; col < col_count ; col++) {
294 eina_strbuf_append(var_query, eina_list_nth(column_names, col));
295 if (col < col_count - 1)
296 eina_strbuf_append(var_query, ", ");
298 eina_strbuf_append(var_query, " ");
302 eina_strbuf_append(var_query, "FROM ");
303 eina_strbuf_append(var_query, table_name);
306 eina_strbuf_append(var_query, " WHERE ");
307 eina_strbuf_append(var_query, where_clause);
309 eina_strbuf_append(var_query, ";");
311 ret = sqlite3_exec(db, eina_strbuf_string_get(var_query), callback,(void*)data_to_callback, &err_msg);
313 eina_strbuf_free(var_query);
314 if( ret != SQLITE_OK ){
315 sqlite3_free(err_msg);
321 Eina_List *get_values_from_table_sync(const char *table_name, Eina_List *column_names, Eina_List *column_types, const char *where_clause)
323 Eina_List *query_vals = NULL;
326 return (Eina_List *)NULL;
328 sqlite3 *db = create_database();
331 /*****No rows identification*****/
333 char *row_cnt_qry = (char *)malloc(strlen("SELECT COUNT(*) FROM ") + strlen(table_name) + strlen(";") +1);
339 strcpy(row_cnt_qry, "SELECT COUNT(*) FROM ");
340 strcat(row_cnt_qry, table_name);
341 strcat(row_cnt_qry, ";");
345 if (sqlite3_prepare_v2(db, row_cnt_qry, -1, &stmt, NULL) == SQLITE_OK) {
346 if (sqlite3_step(stmt) == SQLITE_ERROR)
349 no_of_rows = sqlite3_column_int(stmt, 0);
351 sqlite3_finalize(stmt);
357 return (Eina_List *)NULL;
359 /********************************/
360 db = create_database();
366 int str_len = strlen("SELECT ") + 1;
367 char *var_query = (char*)malloc(str_len);
373 strcpy(var_query, "SELECT ");
375 var_query = realloc(var_query, strlen(var_query) + 3);
376 strcat(var_query, " *");
379 int col_count = eina_list_count(column_names);
380 char *col_name = NULL;
381 for (int col = 0; col < col_count; col++) {
382 col_name = eina_list_nth(column_names, col);
383 var_query = realloc(var_query, strlen(var_query)+strlen(col_name) + 1);
384 strcat(var_query, col_name);
386 var_query = realloc(var_query, strlen(var_query)+strlen(" ") + 1);
388 if (col < col_count - 1) {
389 var_query = realloc(var_query, strlen(var_query) + 3);
390 strcat(var_query, ", ");
392 var_query = realloc(var_query, strlen(var_query) + 2);
393 strcat(var_query, " ");
399 var_query = realloc(var_query, strlen(var_query) + strlen("FROM ") + 2);
400 strcat(var_query, "FROM ");
401 var_query = realloc(var_query, strlen(var_query) + strlen(table_name) + 1);
402 strcat(var_query, table_name);
405 var_query = realloc(var_query, strlen(var_query)+strlen(" WHERE ") + 1);
406 strcat(var_query, " WHERE ");
407 var_query = realloc(var_query, strlen(var_query)+strlen(where_clause) + 1);
408 strcat(var_query, where_clause);
411 var_query = realloc(var_query, strlen(var_query) + 2);
412 strcat(var_query, ";");
415 ret = sqlite3_prepare_v2(db, var_query, -1, &stmt, 0);
419 if (ret != SQLITE_OK) {
420 sqlite3_free(err_msg);
424 while (sqlite3_step(stmt) == SQLITE_ROW) {
425 int col_val_count = eina_list_count(column_names);
426 Eina_List *row_vals = NULL;
427 for (int col = 0; col < col_val_count; col++) {
428 char *col_type = eina_list_nth(column_types, col);
429 if (!strcmp(col_type, "INTEGER") || !strcmp(col_type, "INTEGER PRIMARY KEY NOT NULL")) {
430 long long temp = sqlite3_column_int64(stmt, col);
431 int *val_int = (int *)malloc(sizeof(int));
433 row_vals = eina_list_append(row_vals, val_int);
434 } else if (!strcmp(col_type, "TEXT") || !strcmp(col_type, "TEXT PRIMARY KEY NOT NULL")) {
435 const char *text = (const char *)sqlite3_column_text(stmt, col);
438 val_text = strdup(text);
444 row_vals = eina_list_append(row_vals, val_text);
448 query_vals = eina_list_append(query_vals, row_vals);
454 Eina_List *get_values_from_table_sync_order_by(const char *table_name, Eina_List *column_names, Eina_List *column_types, const char *order_column, Eina_Bool is_asc, const char *where_clause)
456 Eina_List *query_vals = NULL;
461 sqlite3 *db = create_database();
465 char *row_cnt_qry = (char*)malloc(strlen("SELECT COUNT(*) FROM ") + strlen(table_name) + strlen(";") +1);
471 strcpy(row_cnt_qry, "SELECT COUNT(*) FROM ");
472 strcat(row_cnt_qry, table_name);
473 strcat(row_cnt_qry, ";");
477 if (sqlite3_prepare_v2(db, row_cnt_qry, -1, &stmt, NULL) == SQLITE_OK) {
478 if (sqlite3_step(stmt) == SQLITE_ERROR)
481 no_of_rows = sqlite3_column_int(stmt, 0);
483 sqlite3_finalize(stmt);
490 /********************************/
491 db = create_database();
496 int str_len = strlen("SELECT ") + 1;
497 char *var_query = (char*)malloc(str_len);
503 strcpy(var_query, "SELECT ");
505 var_query = realloc(var_query, strlen(var_query) + 3);
506 strcat(var_query, " *");
509 int col_count = eina_list_count(column_names);
510 char *col_name = NULL;
511 for (int col = 0; col < col_count; col++) {
512 col_name = eina_list_nth(column_names, col);
513 var_query = realloc(var_query, strlen(var_query)+strlen(col_name) + 1);
514 strcat(var_query, col_name);
516 var_query = realloc(var_query, strlen(var_query)+strlen(" ") + 1);
518 if (col < col_count - 1) {
519 var_query = realloc(var_query, strlen(var_query) + 3);
520 strcat(var_query, ", ");
522 var_query = realloc(var_query, strlen(var_query) + 2);
523 strcat(var_query, " ");
529 var_query = realloc(var_query, strlen(var_query) + strlen("FROM ") + 2);
530 strcat(var_query, "FROM ");
531 var_query = realloc(var_query, strlen(var_query) + strlen(table_name) + 1);
532 strcat(var_query, table_name);
535 var_query = realloc(var_query, strlen(var_query)+strlen(" WHERE ") + 1);
536 strcat(var_query, " WHERE ");
537 var_query = realloc(var_query, strlen(var_query)+strlen(where_clause) + 1);
538 strcat(var_query, where_clause);
542 var_query = realloc(var_query, strlen(var_query)+strlen(" ORDER BY ") + 1);
543 strcat(var_query, " ORDER BY ");
544 var_query = realloc(var_query, strlen(var_query)+strlen(order_column) + 1);
545 strcat(var_query, order_column);
547 var_query = realloc(var_query, strlen(var_query)+strlen(" ASC ") + 1);
548 strcat(var_query, " ASC ");
550 var_query = realloc(var_query, strlen(var_query)+strlen(" DESC ") + 1);
551 strcat(var_query, " DESC ");
557 var_query = realloc(var_query, strlen(var_query) + 2);
558 strcat(var_query, ";");
560 ret = sqlite3_prepare_v2(db, var_query, -1, &stmt, 0);
563 if (ret != SQLITE_OK)
566 while (sqlite3_step(stmt) == SQLITE_ROW) {
567 int col_val_count = eina_list_count(column_names);
568 Eina_List *row_vals = NULL;
569 for (int col = 0; col < col_val_count; col++) {
570 char *col_type = eina_list_nth(column_types, col);
571 if (!strcmp(col_type, "INTEGER") || !strcmp(col_type, "INTEGER PRIMARY KEY NOT NULL")) {
572 long long temp = sqlite3_column_int64(stmt, col);
573 int *val_int = (int*)malloc(sizeof(int));
575 row_vals = eina_list_append(row_vals, val_int);
576 } else if (!strcmp(col_type, "TEXT") || !strcmp(col_type, "TEXT PRIMARY KEY NOT NULL")) {
577 char *val_text = strdup((const char *)sqlite3_column_text(stmt, col));
578 row_vals = eina_list_append(row_vals, val_text);
581 query_vals = eina_list_append(query_vals, row_vals);
586 Eina_Bool delete_record(char *tablename, const char *where_clause)
591 sqlite3 *db = create_database();
595 char *var_query = (char*)malloc(strlen("DELETE FROM ") + strlen(tablename) + 1);
601 strcpy(var_query, "DELETE FROM ");
602 strcat(var_query, tablename);
605 var_query = realloc(var_query, strlen(var_query)+strlen(" WHERE ") + 1);
606 strcat(var_query, " WHERE ");
607 var_query = realloc(var_query, strlen(var_query)+strlen(where_clause) + 1);
608 strcat(var_query, where_clause);
611 var_query = realloc(var_query, strlen(var_query) + 2);
612 strcat(var_query, ";");
616 ret = sqlite3_exec(db, var_query, NULL, NULL, &err_msg);
619 if (ret != SQLITE_OK) {
620 sqlite3_free(err_msg);
626 Eina_Bool drop_table(char *tablename)
631 sqlite3 *db = create_database();
635 char *var_query = (char*)malloc(strlen("DROP TABLE ") + strlen(tablename) + strlen(";") + 1);
641 strcpy(var_query, "DROP TABLE ");
642 strcat(var_query, tablename);
643 strcat(var_query, ";");
646 ret = sqlite3_exec(db, var_query, NULL, NULL, &err_msg);
649 if (ret != SQLITE_OK) {
650 sqlite3_free(err_msg);
656 int get_number_of_rows(char *table_name, char *where_clause)
659 if (!table_name || !where_clause)
662 sqlite3 *db = create_database();
666 char *row_cnt_qry = (char*)malloc(strlen("SELECT COUNT(*) FROM ") + strlen(table_name) + 1);
672 strcpy(row_cnt_qry, "SELECT COUNT(*) FROM ");
673 strcat(row_cnt_qry, table_name);
676 row_cnt_qry = realloc(row_cnt_qry, strlen(row_cnt_qry)+strlen(" WHERE ") + 1);
677 strcat(row_cnt_qry, " WHERE ");
678 row_cnt_qry = realloc(row_cnt_qry, strlen(row_cnt_qry)+strlen(where_clause) + 1);
679 strcat(row_cnt_qry, where_clause);
681 row_cnt_qry = realloc(row_cnt_qry, strlen(row_cnt_qry) + 2);
682 strcat(row_cnt_qry, ";");
685 if (sqlite3_prepare_v2(db, row_cnt_qry, -1, &stmt, NULL) == SQLITE_OK) {
686 if (sqlite3_step(stmt) == SQLITE_ERROR)
689 no_of_rows = sqlite3_column_int(stmt, 0);
690 sqlite3_finalize(stmt);