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)
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 ptr += sprintf(ptr, " FROM %s %s;", table_name, where_clause ? where_clause : "");
580 LOGD("Query: %s", query);
582 ret = sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
584 if (ret != SQLITE_OK) {
590 while(sqlite3_step(stmt) == SQLITE_ROW) {
593 EINA_LIST_FOREACH(column_types, l, type) {
602 if (!strncmp(type, "INTEGER", strlen("INTEGER"))) {
606 temp = sqlite3_column_int64(stmt, col);
607 val = malloc(sizeof(int));
611 * Handling exceptional cases.
616 record = eina_list_append(record, val);
617 } else if (!strncmp(type, "TEXT", strlen("TEXT"))) {
621 text = (const char *)sqlite3_column_text(stmt, col);
622 if (!text || text[0] == '\0') {
623 //val = strdup("_null_");
631 * Handling exceptional cases
634 record = eina_list_append(record, val);
639 result = eina_list_append(result, record);
642 sqlite3_finalize(stmt);
659 LOGD("Already initialized");
663 ret = sqlite3_open(s_info.database_name, &s_info.db);
664 if(ret != SQLITE_OK) {
679 sqlite3_close(s_info.db);
686 Eina_List *tg_db_get_user_info(tgl_peer_id_t *user_id)
692 const char *val_text;
693 sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
694 ret = sqlite3_prepare_v2(db, "SELECT " \
695 "print_name, structure_version, " \
696 "photo_path, photo_id, " \
697 "first_name, last_name, " \
698 "phone, access_hash, " \
699 "real_first_name, real_last_name, " \
700 "username, online, last_seen " \
701 "FROM user_info_table WHERE user_id = ?", -1, &stmt, NULL);
702 if (ret != SQLITE_OK) {
706 ret = sqlite3_bind_int(stmt, 1, user_id->id);
707 if (ret != SQLITE_OK) {
708 sqlite3_finalize(stmt);
713 while (sqlite3_step(stmt) == SQLITE_ROW) {
714 info = calloc(1, sizeof(*info));
720 LOGE("calloc: %d", errno);
724 val_text = (const char *)sqlite3_column_text(stmt, 0);
725 if (val_text && val_text[0] != '\0') {
726 info->print_name = strdup(val_text);
727 if (!info->print_name) {
728 LOGE("strdup: %d", errno);
732 info->structure_version = sqlite3_column_int(stmt, 1);
733 val_text = (const char *)sqlite3_column_text(stmt, 2);
734 if (val_text && val_text[0] != '\0') {
735 info->photo_path = strdup(val_text);
736 if (!info->photo_path) {
737 LOGE("strdup: %d", errno);
741 info->photo_id = sqlite3_column_int(stmt, 3);
743 val_text = (const char *)sqlite3_column_text(stmt, 4);
744 if (val_text && val_text[0] != '\0') {
745 info->first_name = strdup(val_text);
746 if (!info->first_name) {
747 LOGE("strdup: %d", errno);
751 val_text = (const char *)sqlite3_column_text(stmt, 5);
752 if (val_text && val_text[0] != '\0') {
753 info->last_name = strdup(val_text);
754 if (!info->last_name) {
755 LOGE("strdup: %d", errno);
759 val_text = (const char *)sqlite3_column_text(stmt, 6);
760 if (val_text && val_text[0] != '\0') {
761 info->phone = strdup(val_text);
763 LOGE("strdup: %d", errno);
767 info->access_hash = sqlite3_column_int(stmt, 7);
769 val_text = (const char *)sqlite3_column_text(stmt, 8);
770 if (val_text && val_text[0] != '\0') {
771 info->real_first_name = strdup(val_text);
772 if (!info->real_first_name) {
773 LOGE("strdup: %d", errno);
777 val_text = (const char *)sqlite3_column_text(stmt, 9);
778 if (val_text && val_text[0] != '\0') {
779 info->real_last_name = strdup(val_text);
780 if (!info->real_last_name) {
781 LOGE("strdup: %d", errno);
785 val_text = (const char *)sqlite3_column_text(stmt, 10);
786 if (val_text && val_text[0] != '\0') {
787 info->username = strdup(val_text);
788 if (!info->username) {
789 LOGE("strdup: %d", errno);
793 info->online = sqlite3_column_int(stmt, 11);
794 info->last_seen = sqlite3_column_int(stmt, 12);
796 memcpy(&info->user_id, user_id, sizeof(*user_id));
798 result = eina_list_append(result, info);
801 sqlite3_finalize(stmt);
805 Eina_List *tg_db_get_chat_info(const char *table_name)
807 Eina_List *result = NULL;
808 tg_chat_info_s *info;
812 sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
813 ret = sqlite3_prepare_v2(db, "SELECT chat_id, " \
814 "flags, print_title, struct_version, " \
815 "photo_id, photo_path, " \
817 "users_num, user_list_size, user_list_version, " \
818 "inviter_id, chat_users, date, version, admin_id FROM ?", -1, &stmt, NULL);
820 if (ret != SQLITE_OK) {
821 LOGE("Failed to create a stmt");
825 ret = sqlite3_bind_text(stmt, 1, table_name, -1, SQLITE_TRANSIENT);
826 if (ret != SQLITE_OK) {
827 LOGE("Failed to bind a text");
831 while (sqlite3_step(stmt) == SQLITE_ROW) {
832 info = calloc(1, sizeof(*info));
834 LOGE("calloc: %d", errno);
837 info->chat_id = sqlite3_column_int(stmt, 0);
838 info->flags = sqlite3_column_int(stmt, 1);
839 tmp = (const char *)sqlite3_column_text(stmt, 2);
840 if (tmp && tmp[0] != '\0') {
841 info->print_title = strdup(tmp);
842 if (!info->print_title) {
843 LOGE("strdup: %d", errno);
846 info->struct_version = sqlite3_column_int(stmt, 3);
847 info->photo_id = sqlite3_column_int64(stmt, 4);
848 tmp = (const char *)sqlite3_column_text(stmt, 5);
849 if (tmp && tmp[0] != '\0') {
850 info->photo_path = strdup(tmp);
851 if (!info->photo_path) {
852 LOGE("strdup: %d", errno);
855 tmp = (const char *)sqlite3_column_text(stmt, 6);
856 if (tmp && tmp[0] != '\0') {
857 info->title = strdup(tmp);
859 LOGE("strdup: %d", errno);
862 info->users_num = sqlite3_column_int(stmt, 7);
863 info->user_list_size = sqlite3_column_int(stmt, 8);
864 info->user_list_version = sqlite3_column_int(stmt, 9);
865 info->inviter_id = sqlite3_column_int(stmt, 10);
867 tmp = (const char *)sqlite3_column_text(stmt, 11);
868 if (tmp && tmp[0] != '\0') {
876 for (i = 0; i < info->users_num && *ptr && i < (sizeof(info->chat_users) / sizeof(int)); i++) {
879 while (*tmp_ptr != ',' && *tmp_ptr != '\0') {
884 info->chat_users[i] = atoi(ptr);
888 if (i != info->users_num) {
890 * There is some problem.
891 * The count of loaded user is not correct.
894 LOGD("Update user_num: %d -> %d", info->users_num, i);
902 info->date = sqlite3_column_int(stmt, 12);
903 info->version = sqlite3_column_int(stmt, 13);
904 info->admin_id = sqlite3_column_int(stmt, 14);
905 result = eina_list_append(result, info);
908 sqlite3_finalize(stmt);
913 tg_peer_info_s *tg_db_get_peer_info(const char *table, int peer_id)
915 tg_peer_info_s *info;
919 sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
920 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);
921 if (ret != SQLITE_OK) {
925 ret = sqlite3_bind_text(stmt, 1, table, -1, SQLITE_TRANSIENT);
926 if (ret != SQLITE_OK) {
927 sqlite3_finalize(stmt);
931 ret = sqlite3_bind_int(stmt, 2, peer_id);
932 if (ret != SQLITE_OK) {
933 sqlite3_finalize(stmt);
937 if (sqlite3_step(stmt) != SQLITE_ROW) {
938 sqlite3_finalize(stmt);
942 info = calloc(1, sizeof(*info));
944 sqlite3_finalize(stmt);
948 info->peer_id = peer_id;
949 info->peer_type = sqlite3_column_int(stmt, 0);
950 info->flags = sqlite3_column_int(stmt, 1);
951 info->last_msg_id = sqlite3_column_int64(stmt, 2);
952 info->last_msg_date = sqlite3_column_int(stmt, 3);
953 tmp = (const char *)sqlite3_column_text(stmt, 4);
954 if (tmp && tmp[0] != '\0') {
955 info->print_name = strdup(tmp);
956 if (!info->print_name) {
957 LOGE("strdup: %d", errno);
960 info->struct_version = sqlite3_column_int(stmt, 5);
961 info->no_of_unread_msgs = sqlite3_column_int(stmt, 6);
962 info->last_seen_time = sqlite3_column_int(stmt, 7);
964 tmp = (const char *)sqlite3_column_text(stmt, 8);
965 if (tmp && tmp[0] != '\0') {
966 info->photo_path = strdup(tmp);
967 if (!info->photo_path) {
968 LOGE("strdup: %d\n", errno);
972 info->photo_id = sqlite3_column_int64(stmt, 9);
974 sqlite3_finalize(stmt);
979 Eina_List *tg_db_get_messages(const char *table_name)
986 sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
987 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);
988 if (ret != SQLITE_OK) {
992 ret = sqlite3_bind_text(stmt, 1, table_name, -1, SQLITE_TRANSIENT);
993 if (ret != SQLITE_OK) {
994 sqlite3_finalize(stmt);
999 while (sqlite3_step(stmt) == SQLITE_OK) {
1000 info = calloc(1, sizeof(*info));
1002 LOGE("calloc: %d", errno);
1006 info->msg_id = sqlite3_column_int(stmt, 0);
1007 info->flags = sqlite3_column_int(stmt, 1);
1008 info->fwd_from_id = sqlite3_column_int(stmt, 2);
1009 info->fwd_date = sqlite3_column_int(stmt, 3);
1010 info->from_id = sqlite3_column_int(stmt, 4);
1011 info->to_id = sqlite3_column_int(stmt, 5);
1012 info->out = sqlite3_column_int(stmt, 6);
1013 info->unread = sqlite3_column_int(stmt, 7);
1014 info->date = sqlite3_column_int(stmt, 8);
1015 info->service = sqlite3_column_int(stmt, 9);
1016 tmp = (const char *)sqlite3_column_text(stmt, 10);
1017 if (tmp && tmp[0] != '\0') {
1018 info->message = strdup(tmp);
1019 if (!info->message) {
1020 LOGE("strdup: %d", errno);
1023 info->msg_state = sqlite3_column_int(stmt, 11);
1024 info->message_len = sqlite3_column_int(stmt, 12);
1025 info->media_type = sqlite3_column_int(stmt, 13);
1026 tmp = (const char *)sqlite3_column_text(stmt, 14);
1027 if (tmp && tmp[0] != '\0') {
1028 info->media_id = strdup(tmp);
1029 if (!info->media_id) {
1030 LOGE("strdup: %d", errno);
1033 info->unique_id = sqlite3_column_int(stmt, 15);
1034 result = eina_list_append(result, info);
1037 sqlite3_finalize(stmt);
1042 Eina_Bool delete_all_records(char *tablename)
1047 char *var_query = (char*)malloc(strlen("DELETE FROM ") + strlen(tablename) + strlen(";") + 1);
1048 strcpy(var_query, "DELETE FROM ");
1049 strcat(var_query, tablename);
1050 strcat(var_query, ";");
1053 sqlite3* db = create_database(DEFAULT_TG_DATABASE_PATH);
1054 ret = sqlite3_exec(db,var_query, NULL, NULL, &err_msg);
1056 if( ret != SQLITE_OK ){
1057 sqlite3_free(err_msg);