Refactor service db code 91/139491/5
authorHwankyu Jhun <h.jhun@samsung.com>
Wed, 19 Jul 2017 06:12:43 +0000 (15:12 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Thu, 20 Jul 2017 00:22:07 +0000 (09:22 +0900)
- Remove using snprintf for preparing sqlite3 query
- Add a function to close the app info db

Change-Id: I3d09ec59cf5ea28f34aa8f57dc4d88b2f1c5051a
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
src/service_db.c

index 4052119..48e263f 100755 (executable)
 #include <glib.h>
 #include <unistd.h>
 #include <ctype.h>
+#include <sqlite3.h>
 #include <tzplatform_config.h>
 #include <pkgmgr-info.h>
 
 #include "aul_svc_db.h"
 #include "aul_util.h"
 
-#define APP_INFO_DB_PATH       tzplatform_mkpath(TZ_SYS_DB, ".pkgmgr_parser.db")
+#define APP_INFO_DB_PATH tzplatform_mkpath(TZ_SYS_DB, ".pkgmgr_parser.db")
 
 #define QUERY_MAX_LEN   8192
 #define URI_MAX_LEN 4096
        "pkg_name text, " \
        "PRIMARY KEY(pkg_name)) "
 
+#define __BIND_TEXT(db, stmt, i, text)                                         \
+do {                                                                           \
+       if (sqlite3_bind_text(stmt, i, text, -1, SQLITE_STATIC) != SQLITE_OK) { \
+               _E("bind error(index %d): %s", i, sqlite3_errmsg(db));          \
+               sqlite3_finalize(stmt);                                         \
+               return -1;                                                      \
+       }                                                                       \
+} while (0)
+
+#define __BIND_INT(db, stmt, i, int)                                           \
+do {                                                                           \
+       if (sqlite3_bind_int(stmt, i, int) != SQLITE_OK) {                      \
+               _E("bind error(index %d): %s", i, sqlite3_errmsg(db));          \
+               sqlite3_finalize(stmt);                                         \
+               return -1;                                                      \
+       }                                                                       \
+} while (0)
+
 struct alias_info_s {
        char *alias_appid;
        char *appid;
@@ -94,10 +113,12 @@ static int __init(uid_t uid, bool readonly)
        }
 
        rc = sqlite3_open_v2(db_path, &svc_db,
-                       readonly ? SQLITE_OPEN_READONLY : SQLITE_OPEN_READWRITE, NULL);
+                       readonly ? SQLITE_OPEN_READONLY : SQLITE_OPEN_READWRITE,
+                       NULL);
        free(db_path);
        if (rc) {
-               _E("Can't open database: %d, %s, extended: %d", rc, sqlite3_errmsg(svc_db),
+               _E("Can't open database: %d, %s, extended: %d",
+                               rc, sqlite3_errmsg(svc_db),
                                sqlite3_extended_errcode(svc_db));
                if (svc_db) {
                        sqlite3_close(svc_db);
@@ -195,8 +216,9 @@ static int __init_app_info_db(uid_t uid)
        rc = sqlite3_open_v2(db_path, &app_info_db, SQLITE_OPEN_READONLY, NULL);
        free(db_path);
        if (rc) {
-               _E("Can't open database: %d, %s, extended: %d", rc, sqlite3_errmsg(app_info_db),
-                  sqlite3_extended_errcode(app_info_db));
+               _E("Can't open database: %d, %s, extended: %d",
+                               rc, sqlite3_errmsg(app_info_db),
+                               sqlite3_extended_errcode(app_info_db));
                goto err;
        }
 
@@ -208,24 +230,26 @@ static int __init_app_info_db(uid_t uid)
        }
 
        sqlite3_create_collation(app_info_db, SVC_COLLATION, SQLITE_UTF8,
-                                       NULL, __collate_appsvc);
+                       NULL, __collate_appsvc);
 
-       rc = sqlite3_open_v2(APP_INFO_DB_PATH, &global_app_info_db, SQLITE_OPEN_READONLY, NULL);
+       rc = sqlite3_open_v2(APP_INFO_DB_PATH, &global_app_info_db,
+                       SQLITE_OPEN_READONLY, NULL);
        if (rc) {
-               _E("Can't open database: %d, %s, extended: %d", rc, sqlite3_errmsg(global_app_info_db),
-                  sqlite3_extended_errcode(global_app_info_db));
+               _E("Can't open database: %d, %s, extended: %d",
+                               rc, sqlite3_errmsg(global_app_info_db),
+                               sqlite3_extended_errcode(global_app_info_db));
                goto err;
        }
 
        rc = sqlite3_exec(global_app_info_db, "PRAGMA journal_mode = PERSIST",
-                                       NULL, NULL, NULL);
+                       NULL, NULL, NULL);
        if (SQLITE_OK != rc) {
                _D("Fail to change journal mode\n");
                goto err;
        }
 
        sqlite3_create_collation(global_app_info_db, SVC_COLLATION, SQLITE_UTF8,
-                                       NULL, __collate_appsvc);
+                       NULL, __collate_appsvc);
 
        return 0;
 err:
@@ -242,6 +266,18 @@ err:
        return -1;
 }
 
+static void __fini_app_info_db(void)
+{
+       if (app_info_db) {
+               sqlite3_close(app_info_db);
+               app_info_db = NULL;
+       }
+
+       if (global_app_info_db) {
+               sqlite3_close(global_app_info_db);
+               global_app_info_db = NULL;
+       }
+}
 
 static int __fini(void)
 {
@@ -269,15 +305,42 @@ int _svc_db_check_perm(uid_t uid, bool readonly)
        return ret;
 }
 
+static int __insert_info(sqlite3 *db, const char *op, const char *mime_type,
+               const char *uri, const char *appid)
+{
+       const char query[] =
+               "INSERT INTO appsvc(operation, mime_type, uri, pkg_name) "
+               "VALUES(?, ?, ?, ?)";
+       sqlite3_stmt *stmt;
+       int idx = 1;
+       int r;
+
+       r = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+       if (r != SQLITE_OK) {
+               _E("Prepare failed: %s", sqlite3_errmsg(db));
+               return -1;
+       }
+
+       __BIND_TEXT(db, stmt, idx++, op);
+       __BIND_TEXT(db, stmt, idx++, mime_type ? mime_type : "NULL");
+       __BIND_TEXT(db, stmt, idx++, uri ? uri : "NULL");
+       __BIND_TEXT(db, stmt, idx++, appid);
+
+       r = sqlite3_step(stmt);
+       if (r != SQLITE_DONE) {
+               _E("Step failed: %s", sqlite3_errmsg(db));
+               sqlite3_finalize(stmt);
+               return -1;
+       }
+       sqlite3_finalize(stmt);
+
+       return 0;
+}
+
 int _svc_db_add_app(const char *op, const char *mime_type, const char *uri,
-                       const char *pkg_name, uid_t uid)
+               const char *pkg_name, uid_t uid)
 {
-       char m[BUF_MAX_LEN];
-       char u[URI_MAX_LEN];
-       const char insert_query[] =
-           "insert into appsvc( operation, mime_type, uri, pkg_name) values(?,?,?,?)";
-       sqlite3_stmt* p_statement;
-       int result;
+       int r;
 
        if (__init(uid, false) < 0)
                return -1;
@@ -285,51 +348,41 @@ int _svc_db_add_app(const char *op, const char *mime_type, const char *uri,
        if (op == NULL)
                return -1;
 
-       if (mime_type == NULL)
-               strncpy(m, "NULL", BUF_MAX_LEN - 1);
-       else
-               strncpy(m, mime_type, BUF_MAX_LEN - 1);
+       r = __insert_info(svc_db, op, mime_type, uri, pkg_name);
+       __fini();
 
-       if (uri == NULL)
-               strncpy(u, "NULL", URI_MAX_LEN - 1);
-       else
-               strncpy(u, uri, URI_MAX_LEN - 1);
+       return r;
+}
 
+static int __delete_info(sqlite3 *db, const char *appid)
+{
+       const char query[] = "DELETE FROM appsvc WHERE pkg_name = ?;";
+       sqlite3_stmt *stmt;
+       int idx = 1;
+       int r;
 
-       result = sqlite3_prepare_v2(svc_db, insert_query, strlen(insert_query),
-                                       &p_statement, NULL);
-       if (result != SQLITE_OK) {
-               _E("Sqlite3 error [%d] : <%s> preparing <%s> querry\n", result,
-                  sqlite3_errmsg(svc_db), insert_query);
+       r = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+       if (r != SQLITE_OK) {
+               _E("Prepare failed: %s", sqlite3_errmsg(db));
                return -1;
        }
 
-       sqlite3_bind_text(p_statement, 1, op, -1, SQLITE_TRANSIENT);
-       sqlite3_bind_text(p_statement, 2, m, -1, SQLITE_TRANSIENT);
-       sqlite3_bind_text(p_statement, 3, u, -1, SQLITE_TRANSIENT);
-       sqlite3_bind_text(p_statement, 4, pkg_name, -1, SQLITE_TRANSIENT);
-
-       result = sqlite3_step(p_statement);
-       if (result != SQLITE_DONE) {
-               _E("Sqlite3 error [%d] : <%s> executing statement\n", result,
-                  sqlite3_errmsg(svc_db));
-       }
+       __BIND_TEXT(db, stmt, idx++, appid);
 
-       result = sqlite3_finalize(p_statement);
-       if (result != SQLITE_OK) {
-               _E("Sqlite3 error [%d] : <%s> finalizing statement\n", result,
-                  sqlite3_errmsg(svc_db));
+       r = sqlite3_step(stmt);
+       if (r != SQLITE_DONE) {
+               _E("Step failed: %s", sqlite3_errmsg(db));
+               sqlite3_finalize(stmt);
+               return -1;
        }
+       sqlite3_finalize(stmt);
 
-       __fini();
        return 0;
 }
 
 int _svc_db_delete_with_pkgname(const char *pkg_name, uid_t uid)
 {
-       const char delete_query[] = "delete from appsvc where pkg_name = ?;";
-       sqlite3_stmt* p_statement;
-       int result;
+       int r;
 
        if (pkg_name == NULL) {
                _E("Invalid argument: data to delete is NULL\n");
@@ -339,59 +392,61 @@ int _svc_db_delete_with_pkgname(const char *pkg_name, uid_t uid)
        if (__init(uid, false) < 0)
                return -1;
 
-       result = sqlite3_prepare_v2(svc_db, delete_query, strlen(delete_query),
-                                       &p_statement, NULL);
-       if (result != SQLITE_OK) {
-               _E("Sqlite3 error [%d] : <%s> preparing <%s> querry\n", result,
-                  sqlite3_errmsg(svc_db), delete_query);
-               return -1;
-       }
+       r = __delete_info(svc_db, pkg_name);
+       __fini();
 
-       sqlite3_bind_text(p_statement, 1, pkg_name, -1, SQLITE_TRANSIENT);
+       return r;
+}
 
-       result = sqlite3_step(p_statement);
-       if (result != SQLITE_DONE) {
-               _E("Sqlite3 error [%d] : <%s> executing statement\n", result,
-                  sqlite3_errmsg(svc_db));
-       }
+int _svc_db_delete_all(uid_t uid)
+{
+       const char query[] = "DELETE FROM appsvc;";
+       int r;
 
-       result = sqlite3_finalize(p_statement);
-       if (result != SQLITE_OK) {
-               _E("Sqlite3 error [%d] : <%s> finalizing statement\n", result,
-                  sqlite3_errmsg(svc_db));
-       }
+       if (__init(uid, false) < 0)
+               return -1;
 
+       r = sqlite3_exec(svc_db, query, NULL, NULL, NULL);
+       if (r != SQLITE_OK) {
+               _E("Exec failed: %s", sqlite3_errmsg(svc_db));
+               __fini();
+               return -1;
+       }
        __fini();
 
        return 0;
 }
 
-int _svc_db_delete_all(uid_t uid)
+static int __get_count(sqlite3 *db, const char *appid)
 {
-       char query[QUERY_MAX_LEN];
-       char* error_message = NULL;
+       const char query[] = "SELECT COUNT(*) FROM appsvc WHERE pkg_name = ?;";
+       sqlite3_stmt *stmt;
+       int idx = 1;
+       int count;
+       int r;
 
-       if (__init(uid, false) < 0)
+       r = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+       if (r != SQLITE_OK) {
+               _E("Prepare failed: %s", sqlite3_errmsg(db));
                return -1;
+       }
 
-       snprintf(query, QUERY_MAX_LEN, "delete from appsvc;");
+       __BIND_TEXT(db, stmt, idx++, appid);
 
-       if (SQLITE_OK != sqlite3_exec(svc_db, query, NULL, NULL, &error_message)) {
-               _E("Don't execute query = %s, error message = %s\n", query, error_message);
-               return -1;
-       }
+       r = sqlite3_step(stmt);
+       if (r == SQLITE_ROW)
+               count = sqlite3_column_int(stmt, 0);
+       else
+               count = 0;
 
-       __fini();
+       sqlite3_finalize(stmt);
 
-       return 0;
+       return count;
 }
 
 int _svc_db_is_defapp(const char *pkg_name, uid_t uid)
 {
-       char query[QUERY_MAX_LEN];
-       sqlite3_stmt *stmt;
-       int cnt = 0;
-       int ret = -1;
+       int r;
 
        if (pkg_name == NULL) {
                _E("Invalid argument: data to delete is NULL\n");
@@ -401,242 +456,221 @@ int _svc_db_is_defapp(const char *pkg_name, uid_t uid)
        if (__init(uid, true) < 0)
                return 0;
 
-       snprintf(query, QUERY_MAX_LEN,
-                       "select count(*) from appsvc where pkg_name = '%s';", pkg_name);
+       r = __get_count(svc_db, pkg_name);
+       __fini();
 
-       ret = sqlite3_prepare(svc_db, query, sizeof(query), &stmt, NULL);
-       if (ret != SQLITE_OK) {
-               _E("prepare error, ret = %d, extended = %d\n", ret,
-                  sqlite3_extended_errcode(svc_db));
+       if (r < 1)
+               return 0;
+
+       return 1;
+}
+
+static int __get_appid(sqlite3 *db, const char *op, const char *mime_type,
+               const char *uri, char **appid)
+{
+       const char query[] =
+               "SELECT pkg_name FROM appsvc WHERE operation = ? "
+               "AND mime_type = ? AND uri = ?;";
+       sqlite3_stmt *stmt;
+       char *temp;
+       int idx = 1;
+       int r;
+
+       r = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+       if (r != SQLITE_OK) {
+               _E("Prepare failed: %s", sqlite3_errmsg(db));
                return -1;
        }
 
-       ret = sqlite3_step(stmt);
-       if (ret == SQLITE_ROW)
-               cnt = sqlite3_column_int(stmt, 0);
+       __BIND_TEXT(db, stmt, idx++, op);
+       __BIND_TEXT(db, stmt, idx++, mime_type ? mime_type : "NULL");
+       __BIND_TEXT(db, stmt, idx++, uri ? uri : "NULL");
 
-       sqlite3_finalize(stmt);
+       r = sqlite3_step(stmt);
+       if (r != SQLITE_ROW) {
+               _E("Step failed: %s", sqlite3_errmsg(db));
+               sqlite3_finalize(stmt);
+               return -1;
+       }
 
-       __fini();
+       temp = (char *)sqlite3_column_text(stmt, 0);
+       if (temp) {
+               *appid = strdup(temp);
+               if (*appid == NULL) {
+                       _E("Out of memory");
+                       sqlite3_finalize(stmt);
+                       return -1;
+               }
+       }
 
-       if (cnt < 1) return 0;
+       sqlite3_finalize(stmt);
 
-       return 1;
+       return 0;
 }
 
-char_svc_db_get_app(const char *op, const char *mime_type, const char *uri,
+char *_svc_db_get_app(const char *op, const char *mime_type, const char *uri,
                uid_t uid)
 {
-       char m[BUF_MAX_LEN];
-       char u[URI_MAX_LEN];
-       char query[QUERY_MAX_LEN];
-       sqlite3_stmt* stmt;
-       int ret;
-       char* pkgname;
-       char* ret_val = NULL;
+       char *appid = NULL;
+       int r;
 
        if (op == NULL)
                return NULL;
 
-       if (mime_type == NULL)
-               strncpy(m, "NULL", BUF_MAX_LEN - 1);
-       else
-               strncpy(m, mime_type, BUF_MAX_LEN - 1);
-
-       if (uri == NULL)
-               strncpy(u, "NULL", URI_MAX_LEN - 1);
-       else
-               strncpy(u, uri, URI_MAX_LEN - 1);
-
        if (__init(uid, true) < 0)
                return NULL;
 
-
-       snprintf(query, QUERY_MAX_LEN,
-                       "select pkg_name from appsvc where operation='%s' and mime_type='%s' and uri='%s'",
-                       op, m, u);
-
-       SECURE_LOGD("query : %s\n", query);
-
-       ret = sqlite3_prepare(svc_db, query, strlen(query), &stmt, NULL);
-       if (ret != SQLITE_OK) {
-               _E("prepare error, ret = %d, extended = %d\n",
-                               ret, sqlite3_extended_errcode(svc_db));
-               goto db_fini;
-       }
-
-       ret = sqlite3_step(stmt);
-       if (ret != SQLITE_ROW) {
-               _D("no result");
-               goto stmt_finialize;
-       }
-
-       pkgname = (char*) sqlite3_column_text(stmt, 0);
-       if (pkgname) {
-               ret_val = malloc(BUF_MAX_LEN);
-               if (ret_val == NULL) {
-                       _E("out of memory");
-                       goto stmt_finialize;
-               }
-
-               strncpy(ret_val, (const char *)sqlite3_column_text(stmt, 0), BUF_MAX_LEN - 1);
+       r = __get_appid(svc_db, op, mime_type, uri, &appid);
+       if (r != 0) {
+               __fini();
+               return NULL;
        }
-
-       SECURE_LOGD("pkgname : %s\n", pkgname);
-
-stmt_finialize:
-       ret = sqlite3_finalize(stmt);
-       if (ret != SQLITE_OK)
-               _D("finalize error(%d)", ret);
-
-db_fini:
        __fini();
+       SECURE_LOGD("appid: %s", appid);
 
-       return ret_val;
+       return appid;
 }
 
-static int __appid_compare(gconstpointer data1, gconstpointer data2)
+static int __compare_appid(gconstpointer a, gconstpointer b)
 {
-       char *a = (char *)data1;
-       char *b = (char *)data2;
        return strcmp(a, b);
 }
 
-int _svc_db_adjust_list_with_submode(int mainapp_mode, char *win_id, GSList **pkg_list, uid_t uid)
+static int __adjust_list_with_submode(sqlite3 *db, int mainapp_mode,
+               const char *win_id, GSList **list)
 {
-       sqlite3_stmt* stmt;
-       int ret;
-       char query[QUERY_MAX_LEN];
-       char *subappid = NULL;
-       char *submode_mainid = NULL;
-       char *excluded_appid = NULL;
-       GSList *subapp = NULL;
-       GSList *mainapp = NULL;
-
-       if (__init_app_info_db(uid) < 0)
-               return 0;
-
-       snprintf(query, QUERY_MAX_LEN, "select ac.app_id, ai.app_submode_mainid from package_app_app_control as ac, package_app_info ai where ac.app_id = ai.app_id and ai.app_submode_mainid!=''");
-       ret = sqlite3_prepare(app_info_db, query, sizeof(query), &stmt, NULL);
-       if (ret != SQLITE_OK) {
-               _E("prepare error, ret = %d, extended = %d\n", ret,
-                       sqlite3_extended_errcode(app_info_db));
+       const char query[] =
+               "SELECT ac.app_id, ai.app_submode_mainid "
+               "FROM package_app_app_control as ac, package_app_info ai "
+               "WHERE ac.app_id = ai.app_id AND ai.app_submode_mainid != '';";
+       sqlite3_stmt *stmt;
+       char *sub_appid;
+       char *submode_mainid;
+       char *excluded_appid;
+       GSList *found_subapp;
+       GSList *found_mainapp;
+       int r;
+
+       r = sqlite3_prepare_v2(app_info_db, query, strlen(query), &stmt, NULL);
+       if (r != SQLITE_OK) {
+               _E("Prepare failed: %s", sqlite3_errmsg(app_info_db));
                return -1;
        }
 
        while (sqlite3_step(stmt) == SQLITE_ROW) {
-               subappid = (char *)sqlite3_column_text(stmt, 0);
-               submode_mainid = (char *)sqlite3_column_text(stmt, 1);
-               subapp = g_slist_find_custom(*pkg_list, subappid, __appid_compare);
-
-               if (subapp == NULL)
+               sub_appid = (char *)sqlite3_column_text(stmt, 0);
+               if (sub_appid == NULL)
                        continue;
 
-               /* find if the main app is in the pkg_list */
-               mainapp = g_slist_find_custom(*pkg_list, submode_mainid, __appid_compare);
-               if (mainapp == NULL)
+               found_subapp = g_slist_find_custom(*list, sub_appid,
+                               __compare_appid);
+               if (found_subapp == NULL)
                        continue;
 
-               if (win_id && !mainapp_mode)
-                       /* subapp mode - remove mainapp from list */
-                       excluded_appid = (char *)mainapp->data;
-               else
-                       /* mainapp mode - remove subapp from list */
-                       excluded_appid = (char *)subapp->data;
-
-               if (excluded_appid) {
-                       _E("remove %s from app list with submode", excluded_appid);
-                       *pkg_list = g_slist_remove(*pkg_list, excluded_appid);
-                       free(excluded_appid);
-                       excluded_appid = NULL;
-               }
-       }
-
-       sqlite3_finalize(stmt);
-       ret = sqlite3_prepare(global_app_info_db, query, sizeof(query), &stmt, NULL);
-       if (ret != SQLITE_OK) {
-               _E("prepare error, ret = %d, extended = %d\n", ret,
-                       sqlite3_extended_errcode(app_info_db));
-               return -1;
-       }
-
-       while (sqlite3_step(stmt) == SQLITE_ROW) {
-               subappid = (char *)sqlite3_column_text(stmt, 0);
                submode_mainid = (char *)sqlite3_column_text(stmt, 1);
-               subapp = g_slist_find_custom(*pkg_list, subappid, __appid_compare);
-
-               if (subapp == NULL)
+               if (submode_mainid == NULL)
                        continue;
 
-               /* find if the main app is in the pkg_list */
-               mainapp = g_slist_find_custom(*pkg_list, submode_mainid, __appid_compare);
-               if (mainapp == NULL)
+               found_mainapp = g_slist_find_custom(*list, submode_mainid,
+                               __compare_appid);
+               if (found_mainapp == NULL)
                        continue;
 
                if (win_id && !mainapp_mode)
-                       /* subapp mode - remove mainapp from list */
-                       excluded_appid = (char *)mainapp->data;
+                       excluded_appid = (char *)found_mainapp->data;
                else
-                       /* mainapp mode - remove subapp from list */
-                       excluded_appid = (char *)subapp->data;
+                       excluded_appid = (char *)found_subapp->data;
 
                if (excluded_appid) {
-                       _E("remove %s from app list with submode", excluded_appid);
-                       *pkg_list = g_slist_remove(*pkg_list, excluded_appid);
+                       _E("Remove %s from app list with submode",
+                                       excluded_appid);
+                       *list = g_slist_remove(*list, excluded_appid);
                        free(excluded_appid);
-                       excluded_appid = NULL;
                }
        }
-
        sqlite3_finalize(stmt);
+
        return 0;
 }
 
-int _svc_db_get_list_with_all_defapps(GSList **pkg_list, uid_t uid)
+int _svc_db_adjust_list_with_submode(int mainapp_mode, char *win_id,
+               GSList **pkg_list, uid_t uid)
 {
-       char query[QUERY_MAX_LEN];
-       sqlite3_stmt* stmt;
-       int ret;
-       GSList *iter = NULL;
-       char *str = NULL;
-       char *pkgname = NULL;
-       int found;
+       int r;
 
-       if (__init(uid, true) < 0)
+       if (__init_app_info_db(uid) < 0)
+               return 0;
+
+       r = __adjust_list_with_submode(app_info_db, mainapp_mode, win_id,
+                       pkg_list);
+       if (r < 0) {
+               __fini_app_info_db();
                return -1;
+       }
 
-       snprintf(query, QUERY_MAX_LEN, "select pkg_name from appsvc");
+       r = __adjust_list_with_submode(global_app_info_db, mainapp_mode, win_id,
+                       pkg_list);
+       if (r < 0) {
+               __fini_app_info_db();
+               return -1;
+       }
+       __fini_app_info_db();
 
-       ret = sqlite3_prepare(svc_db, query, sizeof(query), &stmt, NULL);
-       if (ret != SQLITE_OK) {
-               _E("prepare error, ret = %d, extended = %d\n",
-                               ret, sqlite3_extended_errcode(svc_db));
+       return 0;
+}
+
+static int __get_list_with_query(sqlite3 *db, const char *query, GSList **list)
+{
+       sqlite3_stmt *stmt;
+       GSList *found;
+       char *str;
+       char *appid;
+       int r;
+
+       r = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+       if (r != SQLITE_OK) {
+               _E("Prepare failed: %s", sqlite3_errmsg(svc_db));
                return -1;
        }
 
        while (sqlite3_step(stmt) == SQLITE_ROW) {
                str = (char *)sqlite3_column_text(stmt, 0);
-               found = 0;
-               for (iter = *pkg_list; iter != NULL; iter = g_slist_next(iter)) {
-                       pkgname = (char *)iter->data;
-                       if (strncmp(str, pkgname, MAX_PACKAGE_STR_SIZE - 1) == 0) {
-                               found = 1;
+               if (str == NULL)
+                       continue;
+
+               found = g_slist_find_custom(*list, str, __compare_appid);
+               if (found == NULL) {
+                       appid = strdup(str);
+                       if (appid == NULL) {
+                               _E("Out of memory");
                                break;
                        }
-               }
-               if (found == 0) {
-                       pkgname = strdup(str);
-                       *pkg_list = g_slist_append(*pkg_list, (void *)pkgname);
-                       _D("[%s] is def app", pkgname);
+
+                       *list = g_slist_append(*list, appid);
+                       _D("%s is added", appid);
                }
        }
-
-       ret = sqlite3_finalize(stmt);
+       sqlite3_finalize(stmt);
 
        return 0;
 }
 
-char *_svc_db_query_builder_add(char *old_query, char *op, char *uri, char *mime, bool collate)
+int _svc_db_get_list_with_all_defapps(GSList **pkg_list, uid_t uid)
+{
+       const char query[] = "SELECT pkg_name FROM appsvc;";
+       int r;
+
+       if (__init(uid, true) < 0)
+               return -1;
+
+       r = __get_list_with_query(svc_db, query, pkg_list);
+       __fini();
+
+       return r;
+}
+
+char *_svc_db_query_builder_add(char *old_query, char *op, char *uri,
+               char *mime, bool collate)
 {
        char *query;
        char *q;
@@ -644,20 +678,20 @@ char *_svc_db_query_builder_add(char *old_query, char *op, char *uri, char *mime
        if (collate) {
                if (old_query) {
                        query = sqlite3_mprintf("%s, '%q|%q|%q'",
-                               old_query, op, uri, mime);
+                                       old_query, op, uri, mime);
                        free(old_query);
                } else {
                        query = sqlite3_mprintf("'%q|%q|%q'",
-                               op, uri, mime);
+                                       op, uri, mime);
                }
        } else {
                if (old_query) {
                        query = sqlite3_mprintf("%s OR ac.app_control like '%%%q|%q|%q%%' ",
-                               old_query, op, uri, mime);
+                                       old_query, op, uri, mime);
                        free(old_query);
                } else {
                        query = sqlite3_mprintf("ac.app_control like '%%%q|%q|%q%%' ",
-                       op, uri, mime);
+                                       op, uri, mime);
                }
        }
 
@@ -670,7 +704,7 @@ char *_svc_db_query_builder_or(char *q1, char *q2)
 {
        char query[QUERY_MAX_LEN];
 
-       snprintf(query, QUERY_MAX_LEN, "(%s) or (%s)", q1, q2);
+       snprintf(query, sizeof(query), "(%s) or (%s)", q1, q2);
        free(q1);
        free(q2);
 
@@ -681,7 +715,7 @@ char *_svc_db_query_builder_in(const char *field, char *args)
 {
        char query[QUERY_MAX_LEN];
 
-       snprintf(query, QUERY_MAX_LEN, "%s in(%s)", field, args);
+       snprintf(query, sizeof(query), "%s in(%s)", field, args);
        free(args);
 
        return strdup(query);
@@ -694,9 +728,12 @@ char *_svc_db_query_builder_build(char *old_query)
        if (old_query == NULL)
                return NULL;
 
-       snprintf(query, QUERY_MAX_LEN,
-               "select ac.app_id from package_app_app_control as ac, package_app_info ai where ac.app_id = ai.app_id and ai.component_type='uiapp' and (%s)",
-               old_query);
+       snprintf(query, sizeof(query),
+                       "SELECT ac.app_id FROM package_app_app_control "
+                       "as ac, package_app_info ai "
+                       "WHERE ac.app_id = ai.app_id "
+                       "AND ai.component_type='uiapp' AND (%s)",
+                       old_query);
 
        free(old_query);
 
@@ -705,68 +742,25 @@ char *_svc_db_query_builder_build(char *old_query)
 
 int _svc_db_exec_query(const char *query, GSList **pkg_list, uid_t uid)
 {
-       sqlite3_stmt* stmt;
-       int ret;
-       GSList *iter = NULL;
-       char *str = NULL;
-       char *pkgname = NULL;
-       int found;
+       int r;
 
        if (__init_app_info_db(uid) < 0)
                return 0;
 
        SECURE_LOGD("query : %s\n", query);
 
-       ret = sqlite3_prepare(app_info_db, query, strlen(query), &stmt, NULL);
-       if (ret != SQLITE_OK) {
-               _E("prepare error, ret = %d, extended = %d\n",
-                               ret, sqlite3_extended_errcode(app_info_db));
+       r = __get_list_with_query(app_info_db, query, pkg_list);
+       if (r < 0) {
+               __fini_app_info_db();
                return -1;
        }
 
-       while (sqlite3_step(stmt) == SQLITE_ROW) {
-               str = (char *)sqlite3_column_text(stmt, 0);
-               found = 0;
-               for (iter = *pkg_list; iter != NULL; iter = g_slist_next(iter)) {
-                       pkgname = (char *)iter->data;
-                       if (strncmp(str, pkgname, MAX_PACKAGE_STR_SIZE - 1) == 0) {
-                               found = 1;
-                               break;
-                       }
-               }
-               if (found == 0) {
-                       pkgname = strdup(str);
-                       *pkg_list = g_slist_append(*pkg_list, (void *)pkgname);
-                       _D("%s is added", pkgname);
-               }
-       }
-
-       sqlite3_finalize(stmt);
-       ret = sqlite3_prepare(global_app_info_db, query, strlen(query), &stmt, NULL);
-       if (ret != SQLITE_OK) {
-               _E("prepare error, ret = %d, extended = %d\n",
-                               ret, sqlite3_extended_errcode(global_app_info_db));
+       r = __get_list_with_query(global_app_info_db, query, pkg_list);
+       if (r < 0) {
+               __fini_app_info_db();
                return -1;
        }
-
-       while (sqlite3_step(stmt) == SQLITE_ROW) {
-               str = (char *)sqlite3_column_text(stmt, 0);
-               found = 0;
-               for (iter = *pkg_list; iter != NULL; iter = g_slist_next(iter)) {
-                       pkgname = (char *)iter->data;
-                       if (strncmp(str, pkgname, MAX_PACKAGE_STR_SIZE - 1) == 0) {
-                               found = 1;
-                               break;
-                       }
-               }
-               if (found == 0) {
-                       pkgname = strdup(str);
-                       *pkg_list = g_slist_append(*pkg_list, (void *)pkgname);
-                       _D("%s is added", pkgname);
-               }
-       }
-
-       sqlite3_finalize(stmt);
+       __fini_app_info_db();
 
        return 0;
 }