2 * @file tg_db_manager.c
7 #include "tg_db_manager.h"
11 #include "tg_common.h"
17 const char *database_name;
20 .database_name = DEFAULT_TG_DATABASE_PATH,
24 sqlite3* create_database(char* database_name)
31 ret = sqlite3_open(database_name, &db);
32 //ret = sqlite3_open_v2(database_name, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
39 Eina_Bool close_database(sqlite3* db)
48 Eina_Bool create_table(const char* table_name, Eina_List* column_names, Eina_List* column_types)
50 if(!table_name || ! column_names || !column_types) {
53 sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
56 int col_count = eina_list_count(column_names);
58 int str_len = strlen("CREATE TABLE IF NOT EXISTS ") + strlen(table_name) + strlen("(") + 1;
59 char* var_query = (char*)malloc(str_len);
60 strcpy(var_query,"CREATE TABLE IF NOT EXISTS ");
61 strcat(var_query, table_name);
62 strcat(var_query, "(");
64 for(int col = 0; col < col_count ; col++) {
65 char* col_name = eina_list_nth(column_names, col);
66 var_query = realloc(var_query, strlen(var_query)+strlen(col_name) + 1);
67 strcat(var_query, col_name);
68 var_query = realloc(var_query, strlen(var_query)+strlen(" ") + 1);
69 strcat(var_query, " ");
70 char* col_type = eina_list_nth(column_types, col);
71 var_query = realloc(var_query, strlen(var_query)+strlen(col_type) + 1);
72 strcat(var_query, col_type);
73 if(col < col_count - 1){
74 var_query = realloc(var_query, strlen(var_query) + 2);
75 strcat(var_query, ",");
77 var_query = realloc(var_query, strlen(var_query) + 3);
78 strcat(var_query, ");");
82 ret = sqlite3_exec(db,var_query, NULL, NULL, &err_msg);
85 if( ret != SQLITE_OK ){
86 sqlite3_free(err_msg);
92 Eina_Bool insert_table(const char* table_name, Eina_List* column_names, Eina_List* column_types, Eina_List* column_values)
94 if( !table_name || ! column_names || !column_types || !column_values) {
97 sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
100 int col_count = eina_list_count(column_names);
102 int str_len = strlen("INSERT INTO ") + strlen(table_name) + strlen("(") + 1;
103 char* var_query = (char*)malloc(str_len);
104 strcpy(var_query,"INSERT INTO ");
105 strcat(var_query, table_name);
106 strcat(var_query, "(");
108 for(int col = 0; col < col_count ; col++) {
110 char* col_name = eina_list_nth(column_names, col);
111 var_query = realloc(var_query, strlen(var_query)+strlen(col_name) + 1);
112 strcat(var_query, col_name);
114 if(col < col_count - 1){
115 var_query = realloc(var_query, strlen(var_query) + 2);
116 strcat(var_query, ",");
118 var_query = realloc(var_query, strlen(var_query) + strlen(") VALUES (") + 1);
119 strcat(var_query, ") VALUES (");
123 int col_val_count = eina_list_count(column_values);
125 for(int col = 0; col < col_val_count ; col++) {
127 char* col_type = eina_list_nth(column_types, col);
128 char* col_value = NULL;
129 if(!strcmp(col_type, "INTEGER") || !strcmp(col_type, "INTEGER PRIMARY KEY NOT NULL")) {
130 int* tmp_value = eina_list_nth(column_values, col);
133 long long val = *tmp_value;
134 col_value = (char*)malloc(50);
135 //sprintf(col_value, "%lld", *tmp_value);
136 sprintf(col_value, "%lld", val);
139 int act_val = (*tmp_value);
140 col_value = (char*)malloc(50);
141 sprintf(col_value, "%d", act_val);
143 var_query = realloc(var_query, strlen(var_query)+strlen(col_value) + 1);
144 strcat(var_query, col_value);
146 } else if(!strcmp(col_type, "TEXT") || !strcmp(col_type, "TEXT PRIMARY KEY NOT NULL")) {
147 char* tmp_value = eina_list_nth(column_values, col);
148 col_value = (char*)malloc(strlen(tmp_value) + 1);
149 strcpy(col_value,tmp_value);
151 var_query = realloc(var_query, strlen(var_query)+strlen("'") + 1);
152 strcat(var_query, "'");
154 var_query = realloc(var_query, strlen(var_query)+strlen(col_value) + 1);
155 strcat(var_query, col_value);
157 var_query = realloc(var_query, strlen(var_query)+strlen("'") + 1);
158 strcat(var_query, "'");
161 if(col < col_count - 1){
162 var_query = realloc(var_query, strlen(var_query) + 3);
163 strcat(var_query, ", ");
165 var_query = realloc(var_query, strlen(var_query) + 3);
166 strcat(var_query, ");");
171 ret = sqlite3_exec(db,var_query, NULL, NULL, &err_msg);
173 if( ret != SQLITE_OK ){
174 sqlite3_free(err_msg);
182 Eina_Bool update_table(const char* table_name, Eina_List* column_names, Eina_List* column_types, Eina_List* column_values, const char* where_clause)
184 if(!table_name || ! column_names || !column_types || !column_values) {
187 sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
190 int col_count = eina_list_count(column_names);
192 int str_len = strlen("UPDATE ") + strlen(table_name) + strlen(" SET ") + 1;
193 char* var_query = (char*)malloc(str_len);
194 strcpy(var_query,"UPDATE ");
195 strcat(var_query, table_name);
196 strcat(var_query, " SET ");
199 int col_val_count = eina_list_count(column_values);
201 for(int col = 0; col < col_val_count ; col++) {
202 char* col_name = eina_list_nth(column_names, col);
203 char* col_type = eina_list_nth(column_types, col);
205 char* col_value = NULL;
206 if(!strcmp(col_type, "INTEGER") || !strcmp(col_type, "INTEGER PRIMARY KEY NOT NULL")) {
207 int* tmp_value = eina_list_nth(column_values, col);
209 int act_val = (*tmp_value);
210 col_value = (char*)malloc(50);
211 sprintf(col_value, "%d", act_val);
213 var_query = realloc(var_query, strlen(var_query) + strlen(col_name) + strlen(" = ") + strlen(col_value) + 1);
214 strcat(var_query, col_name);
215 strcat(var_query, " = ");
216 strcat(var_query, col_value);
218 } else if(!strcmp(col_type, "TEXT") || !strcmp(col_type, "TEXT PRIMARY KEY NOT NULL")) {
220 char* tmp_value = eina_list_nth(column_values, col);
221 col_value = (char*)malloc(strlen(tmp_value) + 1);
222 strcpy(col_value,tmp_value);
224 var_query = realloc(var_query, strlen(var_query)+ strlen(col_name) + strlen(" = ")+strlen("'") + 1);
225 strcat(var_query, col_name);
226 strcat(var_query, " = ");
227 strcat(var_query, "'");
229 var_query = realloc(var_query, strlen(var_query)+strlen(col_value) + 1);
230 strcat(var_query, col_value);
232 var_query = realloc(var_query, strlen(var_query)+strlen("'") + 1);
233 strcat(var_query, "'");
236 if(col < col_count - 1){
237 var_query = realloc(var_query, strlen(var_query) + 3);
238 strcat(var_query, ", ");
240 var_query = realloc(var_query, strlen(var_query) + 2);
241 strcat(var_query, " ");
246 var_query = realloc(var_query, strlen(var_query) + strlen(" WHERE ") + strlen(where_clause) + 2);
247 strcat(var_query, " WHERE ");
248 strcat(var_query, where_clause);
249 strcat(var_query, ";");
251 ret = sqlite3_exec(db, var_query, NULL, NULL, &err_msg);
255 if( ret != SQLITE_OK ){
256 sqlite3_free(err_msg);
263 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)
268 sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
269 /*****No rows identification*****/
271 char* row_cnt_qry = (char*)malloc(strlen("SELECT COUNT(*) FROM ") + strlen(table_name) + strlen(";") +1);
272 strcpy(row_cnt_qry, "SELECT COUNT(*) FROM ");
273 strcat(row_cnt_qry, table_name);
274 strcat(row_cnt_qry, ";");
277 //ret = sqlite3_exec(s_info.db,var_query, callback,(void*)s_info.db, &err_msg);
280 if (sqlite3_prepare_v2(db, row_cnt_qry, -1, &stmt, NULL) == SQLITE_OK) {
281 if (sqlite3_step(stmt) == SQLITE_ERROR) {
284 no_of_rows = sqlite3_column_int(stmt, 0);
286 sqlite3_finalize(stmt);
290 if(no_of_rows <= 0) {
294 /********************************/
295 db = create_database(DEFAULT_TG_DATABASE_PATH);
298 //int col_count = eina_list_count(column_names);
300 int str_len = strlen("SELECT ") + 1;
301 char* var_query = (char*)malloc(str_len);
302 strcpy(var_query,"SELECT ");
304 var_query = realloc(var_query, strlen(var_query) + 3);
305 strcat(var_query, "* ");
308 int col_count = eina_list_count(column_names);
309 char* col_name = NULL;
310 for(int col = 0; col < col_count ; col++) {
311 col_name = eina_list_nth(column_names, col);
312 var_query = realloc(var_query, strlen(var_query)+strlen(col_name) + 1);
313 strcat(var_query, col_name);
315 var_query = realloc(var_query, strlen(var_query)+strlen(" ") + 1);
317 if(col < col_count - 1){
318 var_query = realloc(var_query, strlen(var_query) + 3);
319 strcat(var_query, ", ");
321 var_query = realloc(var_query, strlen(var_query) + 2);
322 strcat(var_query, " ");
328 var_query = realloc(var_query, strlen(var_query) + strlen("FROM ") + 2);
329 strcat(var_query, "FROM ");
330 var_query = realloc(var_query, strlen(var_query) + strlen(table_name) + 1);
331 strcat(var_query, table_name);
334 var_query = realloc(var_query, strlen(var_query)+strlen(" WHERE ") + 1);
335 strcat(var_query, " WHERE ");
336 var_query = realloc(var_query, strlen(var_query)+strlen(where_clause) + 1);
337 strcat(var_query, where_clause);
340 var_query = realloc(var_query, strlen(var_query) + 2);
341 strcat(var_query, ";");
344 ret = sqlite3_exec(db,var_query, callback,(void*)data_to_callback, &err_msg);
346 if( ret != SQLITE_OK ){
347 sqlite3_free(err_msg);
355 int get_number_of_rows(char* table_name, char* where_clause)
361 sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
362 char* row_cnt_qry = (char*)malloc(strlen("SELECT COUNT(*) FROM ") + strlen(table_name) + 1);
363 strcpy(row_cnt_qry, "SELECT COUNT(*) FROM ");
364 strcat(row_cnt_qry, table_name);
367 row_cnt_qry = realloc(row_cnt_qry, strlen(row_cnt_qry)+strlen(" WHERE ") + 1);
368 strcat(row_cnt_qry, " WHERE ");
369 row_cnt_qry = realloc(row_cnt_qry, strlen(row_cnt_qry)+strlen(where_clause) + 1);
370 strcat(row_cnt_qry, where_clause);
372 row_cnt_qry = realloc(row_cnt_qry, strlen(row_cnt_qry) + 2);
373 strcat(row_cnt_qry, ";");
376 if (sqlite3_prepare_v2(db, row_cnt_qry, -1, &stmt, NULL) == SQLITE_OK) {
377 if (sqlite3_step(stmt) == SQLITE_ERROR) {
380 no_of_rows = sqlite3_column_int(stmt, 0);
382 sqlite3_finalize(stmt);
389 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)
391 Eina_List* query_vals = NULL;
396 sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
397 /*****No rows identification*****/
399 char* row_cnt_qry = (char*)malloc(strlen("SELECT COUNT(*) FROM ") + strlen(table_name) + strlen(";") +1);
400 strcpy(row_cnt_qry, "SELECT COUNT(*) FROM ");
401 strcat(row_cnt_qry, table_name);
402 strcat(row_cnt_qry, ";");
405 //ret = sqlite3_exec(s_info.db,var_query, callback,(void*)s_info.db, &err_msg);
408 if (sqlite3_prepare_v2(db, row_cnt_qry, -1, &stmt, NULL) == SQLITE_OK) {
409 if (sqlite3_step(stmt) == SQLITE_ERROR) {
412 no_of_rows = sqlite3_column_int(stmt, 0);
414 sqlite3_finalize(stmt);
418 if(no_of_rows <= 0) {
422 /********************************/
423 db = create_database(DEFAULT_TG_DATABASE_PATH);
426 //int col_count = eina_list_count(column_names);
428 int str_len = strlen("SELECT ") + 1;
429 char* var_query = (char*)malloc(str_len);
430 strcpy(var_query,"SELECT ");
432 var_query = realloc(var_query, strlen(var_query) + 3);
433 strcat(var_query, "* ");
436 int col_count = eina_list_count(column_names);
437 char* col_name = NULL;
438 for(int col = 0; col < col_count ; col++) {
439 col_name = eina_list_nth(column_names, col);
440 var_query = realloc(var_query, strlen(var_query)+strlen(col_name) + 1);
441 strcat(var_query, col_name);
443 var_query = realloc(var_query, strlen(var_query)+strlen(" ") + 1);
445 if(col < col_count - 1){
446 var_query = realloc(var_query, strlen(var_query) + 3);
447 strcat(var_query, ", ");
449 var_query = realloc(var_query, strlen(var_query) + 2);
450 strcat(var_query, " ");
456 var_query = realloc(var_query, strlen(var_query) + strlen("FROM ") + 2);
457 strcat(var_query, "FROM ");
458 var_query = realloc(var_query, strlen(var_query) + strlen(table_name) + 1);
459 strcat(var_query, table_name);
462 var_query = realloc(var_query, strlen(var_query)+strlen(" WHERE ") + 1);
463 strcat(var_query, " WHERE ");
464 var_query = realloc(var_query, strlen(var_query)+strlen(where_clause) + 1);
465 strcat(var_query, where_clause);
469 var_query = realloc(var_query, strlen(var_query)+strlen(" ORDER BY ") + 1);
470 strcat(var_query, " ORDER BY ");
471 var_query = realloc(var_query, strlen(var_query)+strlen(order_column) + 1);
472 strcat(var_query, order_column);
474 var_query = realloc(var_query, strlen(var_query)+strlen(" COLLATE NOCASE ASC ") + 1);
475 strcat(var_query, " COLLATE NOCASE ASC ");
477 var_query = realloc(var_query, strlen(var_query)+strlen(" COLLATE NOCASE DESC ") + 1);
478 strcat(var_query, " COLLATE NOCASE DESC ");
484 var_query = realloc(var_query, strlen(var_query) + 2);
485 strcat(var_query, ";");
488 ret = sqlite3_prepare_v2(db, var_query, -1, &stmt, 0);
489 if( ret != SQLITE_OK ){
490 sqlite3_free(err_msg);
494 while(sqlite3_step(stmt) == SQLITE_ROW) {
495 int col_val_count = eina_list_count(column_names);
496 Eina_List* row_vals = NULL;
497 for(int col = 0; col < col_val_count ; col++) {
498 char* col_type = eina_list_nth(column_types, col);
499 if(!strcmp(col_type, "INTEGER") || !strcmp(col_type, "INTEGER PRIMARY KEY NOT NULL")) {
500 int temp = sqlite3_column_int64(stmt, col);
501 int* val_int = (int*)malloc(sizeof(int));
503 row_vals = eina_list_append(row_vals, val_int);
504 } else if(!strcmp(col_type, "TEXT") || !strcmp(col_type, "TEXT PRIMARY KEY NOT NULL")) {
505 char *temp_val = (char*)sqlite3_column_text(stmt, col);
506 char *val_text = NULL;
508 val_text = strdup(temp_val);
510 val_text = strdup("");
512 row_vals = eina_list_append(row_vals, val_text);
515 query_vals = eina_list_append(query_vals, row_vals);
523 Eina_List* get_values_from_table_sync(const char* table_name, Eina_List* column_names, Eina_List* column_types, const char* wc, int limit, int offset)
529 Eina_List *result = NULL;
536 sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
537 char* where_clause = NULL;
540 where_clause = (char*)malloc(strlen("WHERE ") + strlen(wc) + 1);
541 strcpy(where_clause, "WHERE ");
542 strcat(where_clause, wc);
546 if (!table_name || !column_names) {
550 query_len = strlen("SELECT ");
551 EINA_LIST_FOREACH(column_names, l, name) {
552 query_len += strlen(name) + 2; /* ", " */
555 query_len += strlen(" FROM ");
556 query_len += strlen(table_name) + 1;
557 query_len += (where_clause ? strlen(where_clause) : 0);
560 query = malloc(query_len);
565 strcpy(query, "SELECT ");
566 ptr = query +strlen("SELECT ");
569 EINA_LIST_FOREACH(column_names, l, name) {
570 ptr += sprintf(ptr, "%s, ", name);
572 ptr -= 2; /* Delete last two characters, ", " */
578 if (limit == -1 || offset == -1) {
579 ptr += sprintf(ptr, " FROM %s %s;", table_name, where_clause ? where_clause : "");
581 ptr += sprintf(ptr, " FROM %s %s LIMIT %d OFFSET %d;", table_name, where_clause ? where_clause : "", limit, offset);
585 LOGD("Query: %s", query);
587 ret = sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
589 if (ret != SQLITE_OK) {
595 while(sqlite3_step(stmt) == SQLITE_ROW) {
598 EINA_LIST_FOREACH(column_types, l, type) {
607 if (!strncmp(type, "INTEGER", strlen("INTEGER"))) {
611 temp = sqlite3_column_int64(stmt, col);
612 val = malloc(sizeof(int));
616 * Handling exceptional cases.
621 record = eina_list_append(record, val);
622 } else if (!strncmp(type, "TEXT", strlen("TEXT"))) {
626 text = (const char *)sqlite3_column_text(stmt, col);
627 if (!text || text[0] == '\0') {
628 //val = strdup("_null_");
636 * Handling exceptional cases
639 record = eina_list_append(record, val);
644 result = eina_list_append(result, record);
647 sqlite3_finalize(stmt);
664 LOGD("Already initialized");
668 ret = sqlite3_open(s_info.database_name, &s_info.db);
669 if(ret != SQLITE_OK) {
684 sqlite3_close(s_info.db);
691 Eina_List *tg_db_get_user_info(tgl_peer_id_t *user_id)
697 const char *val_text;
698 sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
699 ret = sqlite3_prepare_v2(db, "SELECT " \
700 "print_name, structure_version, " \
701 "photo_path, photo_id, " \
702 "first_name, last_name, " \
703 "phone, access_hash, " \
704 "real_first_name, real_last_name, " \
705 "username, online, last_seen " \
706 "FROM user_info_table WHERE user_id = ?", -1, &stmt, NULL);
707 if (ret != SQLITE_OK) {
711 ret = sqlite3_bind_int(stmt, 1, user_id->id);
712 if (ret != SQLITE_OK) {
713 sqlite3_finalize(stmt);
718 while (sqlite3_step(stmt) == SQLITE_ROW) {
719 info = calloc(1, sizeof(*info));
725 LOGE("calloc: %d", errno);
729 val_text = (const char *)sqlite3_column_text(stmt, 0);
730 if (val_text && val_text[0] != '\0') {
731 info->print_name = strdup(val_text);
732 if (!info->print_name) {
733 LOGE("strdup: %d", errno);
737 info->structure_version = sqlite3_column_int(stmt, 1);
738 val_text = (const char *)sqlite3_column_text(stmt, 2);
739 if (val_text && val_text[0] != '\0') {
740 info->photo_path = strdup(val_text);
741 if (!info->photo_path) {
742 LOGE("strdup: %d", errno);
746 info->photo_id = sqlite3_column_int(stmt, 3);
748 val_text = (const char *)sqlite3_column_text(stmt, 4);
749 if (val_text && val_text[0] != '\0') {
750 info->first_name = strdup(val_text);
751 if (!info->first_name) {
752 LOGE("strdup: %d", errno);
756 val_text = (const char *)sqlite3_column_text(stmt, 5);
757 if (val_text && val_text[0] != '\0') {
758 info->last_name = strdup(val_text);
759 if (!info->last_name) {
760 LOGE("strdup: %d", errno);
764 val_text = (const char *)sqlite3_column_text(stmt, 6);
765 if (val_text && val_text[0] != '\0') {
766 info->phone = strdup(val_text);
768 LOGE("strdup: %d", errno);
772 info->access_hash = sqlite3_column_int(stmt, 7);
774 val_text = (const char *)sqlite3_column_text(stmt, 8);
775 if (val_text && val_text[0] != '\0') {
776 info->real_first_name = strdup(val_text);
777 if (!info->real_first_name) {
778 LOGE("strdup: %d", errno);
782 val_text = (const char *)sqlite3_column_text(stmt, 9);
783 if (val_text && val_text[0] != '\0') {
784 info->real_last_name = strdup(val_text);
785 if (!info->real_last_name) {
786 LOGE("strdup: %d", errno);
790 val_text = (const char *)sqlite3_column_text(stmt, 10);
791 if (val_text && val_text[0] != '\0') {
792 info->username = strdup(val_text);
793 if (!info->username) {
794 LOGE("strdup: %d", errno);
798 info->online = sqlite3_column_int(stmt, 11);
799 info->last_seen = sqlite3_column_int(stmt, 12);
801 memcpy(&info->user_id, user_id, sizeof(*user_id));
803 result = eina_list_append(result, info);
806 sqlite3_finalize(stmt);
810 Eina_List *tg_db_get_chat_info(const char *table_name)
812 Eina_List *result = NULL;
813 tg_chat_info_s *info;
817 sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
818 ret = sqlite3_prepare_v2(db, "SELECT chat_id, " \
819 "flags, print_title, struct_version, " \
820 "photo_id, photo_path, " \
822 "users_num, user_list_size, user_list_version, " \
823 "inviter_id, chat_users, date, version, admin_id FROM ?", -1, &stmt, NULL);
825 if (ret != SQLITE_OK) {
826 LOGE("Failed to create a stmt");
830 ret = sqlite3_bind_text(stmt, 1, table_name, -1, SQLITE_TRANSIENT);
831 if (ret != SQLITE_OK) {
832 LOGE("Failed to bind a text");
836 while (sqlite3_step(stmt) == SQLITE_ROW) {
837 info = calloc(1, sizeof(*info));
839 LOGE("calloc: %d", errno);
842 info->chat_id = sqlite3_column_int(stmt, 0);
843 info->flags = sqlite3_column_int(stmt, 1);
844 tmp = (const char *)sqlite3_column_text(stmt, 2);
845 if (tmp && tmp[0] != '\0') {
846 info->print_title = strdup(tmp);
847 if (!info->print_title) {
848 LOGE("strdup: %d", errno);
851 info->struct_version = sqlite3_column_int(stmt, 3);
852 info->photo_id = sqlite3_column_int64(stmt, 4);
853 tmp = (const char *)sqlite3_column_text(stmt, 5);
854 if (tmp && tmp[0] != '\0') {
855 info->photo_path = strdup(tmp);
856 if (!info->photo_path) {
857 LOGE("strdup: %d", errno);
860 tmp = (const char *)sqlite3_column_text(stmt, 6);
861 if (tmp && tmp[0] != '\0') {
862 info->title = strdup(tmp);
864 LOGE("strdup: %d", errno);
867 info->users_num = sqlite3_column_int(stmt, 7);
868 info->user_list_size = sqlite3_column_int(stmt, 8);
869 info->user_list_version = sqlite3_column_int(stmt, 9);
870 info->inviter_id = sqlite3_column_int(stmt, 10);
872 tmp = (const char *)sqlite3_column_text(stmt, 11);
873 if (tmp && tmp[0] != '\0') {
881 for (i = 0; i < info->users_num && *ptr && i < (sizeof(info->chat_users) / sizeof(int)); i++) {
884 while (*tmp_ptr != ',' && *tmp_ptr != '\0') {
889 info->chat_users[i] = atoi(ptr);
893 if (i != info->users_num) {
895 * There is some problem.
896 * The count of loaded user is not correct.
899 LOGD("Update user_num: %d -> %d", info->users_num, i);
907 info->date = sqlite3_column_int(stmt, 12);
908 info->version = sqlite3_column_int(stmt, 13);
909 info->admin_id = sqlite3_column_int(stmt, 14);
910 result = eina_list_append(result, info);
913 sqlite3_finalize(stmt);
918 tg_peer_info_s *tg_db_get_peer_info(const char *table, int peer_id)
920 tg_peer_info_s *info;
924 sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
925 ret = sqlite3_prepare_v2(db, "SELECT peer_type, flags, last_msg_id, last_msg_date, print_name, struct_version, no_of_unread_msgs, last_seen_time, photo_path, photo_id FROM ? WHERE peer_id = ?", -1, &stmt, NULL);
926 if (ret != SQLITE_OK) {
930 ret = sqlite3_bind_text(stmt, 1, table, -1, SQLITE_TRANSIENT);
931 if (ret != SQLITE_OK) {
932 sqlite3_finalize(stmt);
936 ret = sqlite3_bind_int(stmt, 2, peer_id);
937 if (ret != SQLITE_OK) {
938 sqlite3_finalize(stmt);
942 if (sqlite3_step(stmt) != SQLITE_ROW) {
943 sqlite3_finalize(stmt);
947 info = calloc(1, sizeof(*info));
949 sqlite3_finalize(stmt);
953 info->peer_id = peer_id;
954 info->peer_type = sqlite3_column_int(stmt, 0);
955 info->flags = sqlite3_column_int(stmt, 1);
956 info->last_msg_id = sqlite3_column_int64(stmt, 2);
957 info->last_msg_date = sqlite3_column_int(stmt, 3);
958 tmp = (const char *)sqlite3_column_text(stmt, 4);
959 if (tmp && tmp[0] != '\0') {
960 info->print_name = strdup(tmp);
961 if (!info->print_name) {
962 LOGE("strdup: %d", errno);
965 info->struct_version = sqlite3_column_int(stmt, 5);
966 info->no_of_unread_msgs = sqlite3_column_int(stmt, 6);
967 info->last_seen_time = sqlite3_column_int(stmt, 7);
969 tmp = (const char *)sqlite3_column_text(stmt, 8);
970 if (tmp && tmp[0] != '\0') {
971 info->photo_path = strdup(tmp);
972 if (!info->photo_path) {
973 LOGE("strdup: %d\n", errno);
977 info->photo_id = sqlite3_column_int64(stmt, 9);
979 sqlite3_finalize(stmt);
984 Eina_List *tg_db_get_messages(const char *table_name)
991 sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
992 ret = sqlite3_prepare_v2(db, "SELECT msg_id, flags, fwd_from_id, fwd_date, from_id, to_id, out, unread, date, service, message, msg_state, message_len, media_type, media_id, unique_id FROM ?", -1, &stmt, NULL);
993 if (ret != SQLITE_OK) {
997 ret = sqlite3_bind_text(stmt, 1, table_name, -1, SQLITE_TRANSIENT);
998 if (ret != SQLITE_OK) {
999 sqlite3_finalize(stmt);
1004 while (sqlite3_step(stmt) == SQLITE_OK) {
1005 info = calloc(1, sizeof(*info));
1007 LOGE("calloc: %d", errno);
1011 info->msg_id = sqlite3_column_int(stmt, 0);
1012 info->flags = sqlite3_column_int(stmt, 1);
1013 info->fwd_from_id = sqlite3_column_int(stmt, 2);
1014 info->fwd_date = sqlite3_column_int(stmt, 3);
1015 info->from_id = sqlite3_column_int(stmt, 4);
1016 info->to_id = sqlite3_column_int(stmt, 5);
1017 info->out = sqlite3_column_int(stmt, 6);
1018 info->unread = sqlite3_column_int(stmt, 7);
1019 info->date = sqlite3_column_int(stmt, 8);
1020 info->service = sqlite3_column_int(stmt, 9);
1021 tmp = (const char *)sqlite3_column_text(stmt, 10);
1022 if (tmp && tmp[0] != '\0') {
1023 info->message = strdup(tmp);
1024 if (!info->message) {
1025 LOGE("strdup: %d", errno);
1028 info->msg_state = sqlite3_column_int(stmt, 11);
1029 info->message_len = sqlite3_column_int(stmt, 12);
1030 info->media_type = sqlite3_column_int(stmt, 13);
1031 tmp = (const char *)sqlite3_column_text(stmt, 14);
1032 if (tmp && tmp[0] != '\0') {
1033 info->media_id = strdup(tmp);
1034 if (!info->media_id) {
1035 LOGE("strdup: %d", errno);
1038 info->unique_id = sqlite3_column_int(stmt, 15);
1039 result = eina_list_append(result, info);
1042 sqlite3_finalize(stmt);
1047 Eina_Bool delete_all_records(char *tablename)
1052 char *var_query = (char*)malloc(strlen("DELETE FROM ") + strlen(tablename) + strlen(";") + 1);
1053 strcpy(var_query, "DELETE FROM ");
1054 strcat(var_query, tablename);
1055 strcat(var_query, ";");
1058 sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
1059 ret = sqlite3_exec(db,var_query, NULL, NULL, &err_msg);
1061 if( ret != SQLITE_OK ){
1062 sqlite3_free(err_msg);