Refactor pkgmgr-info 34/255834/15
authorjh9216.park <jh9216.park@samsung.com>
Wed, 24 Mar 2021 07:24:38 +0000 (03:24 -0400)
committerJunghoon Park <jh9216.park@samsung.com>
Thu, 25 Mar 2021 07:37:39 +0000 (07:37 +0000)
- Make queries at server side to protect from SQL injection attack

Change-Id: I146269d1bfd31d81c168e33565c85481a9d6700a
Signed-off-by: jh9216.park <jh9216.park@samsung.com>
parser/include/pkgmgr_query_index.h [new file with mode: 0644]
parser/src/pkgmgr_parser_db.c
src/common/database/query_handler.cc
src/common/database/query_handler.hh
src/common/parcel/query_parcelable.cc
src/common/parcel/query_parcelable.hh
src/common/request_handler/query_request_handler.cc
src/manager/pkginfo_manager.cc
src/manager/pkginfo_manager.h
test/unit_tests/test_parcel.cc

diff --git a/parser/include/pkgmgr_query_index.h b/parser/include/pkgmgr_query_index.h
new file mode 100644 (file)
index 0000000..d59603c
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __PKGMGR_QUERY_INDEX_H__
+#define __PKGMGR_QUERY_INDEX_H__
+
+typedef enum {
+       QUERY_INDEX_APPINFO_GET_LOCALED_LABEL = 0,
+       QUERY_INDEX_APPINFO_GET_DATACONTROL_INFO,
+       QUERY_INDEX_APPINFO_GET_DATACONTROL_APPID,
+       QUERY_INDEX_APPINFO_GET_DATACONTROL_TRUSTED_INFO,
+       QUERY_INDEX_APPINFO_GET_DATACONTROL_PRIVILEGES,
+       QUERY_INDEX_APPINFO_GET_APPCONTROL_PRIVILEGES,
+       QUERY_INDEX_PLUGININFO_GET_APPIDS,
+       QUERY_INDEX_GET_PKG_UPDATEINFO_1,
+       QUERY_INDEX_GET_PKG_UPDATEINFO_2,
+       QUERY_INDEX_PKGINFO_SET_USR_INSTALLED_STORAGE_1,
+       QUERY_INDEX_PKGINFO_SET_USR_INSTALLED_STORAGE_2,
+       QUERY_INDEX_CERTINFO_COMPARE_PKG_CERTINFO,
+       QUERY_INDEX_CERTINFO_COMPARE_APP_CERTINFO,
+       QUERY_INDEX_PKGINFO_DELETE_CERTINFO,
+
+       QUERY_INDEX_INSERT_PACKAGE_PLUGIN_EXECUTION_INFO,
+       QUERY_INDEX_DELETE_PACKAGE_PLUGIN_EXECUTION_INFO,
+       QUERY_INDEX_UPDATE_GLOBAL_APP_DISABLE,
+       QUERY_INDEX_UPDATE_APP_DISABLE_INFO,
+       QUERY_INDEX_UPDATE_PKG_DISABLE_INFO,
+       QUERY_INDEX_UPDATE_GLOBAL_APP_SPLASH_SCREEN_DISPLAY_INFO,
+       QUERY_INDEX_UPDATE_APP_SPLASH_SCREEN_DISPLAY_INFO,
+       QUERY_INDEX_UPDATE_APP_LABEL_INFO,
+       QUERY_INDEX_UPDATE_APP_ICON_INFO,
+       QUERY_INDEX_UPDATE_TEP_INFO,
+       QUERY_INDEX_REGISTER_PKG_UPDATE_INFO,
+       QUERY_INDEX_UNREGISTER_PKG_UPDATE_INFO,
+       QUERY_INDEX_UNREGISTER_ALL_PKG_UPDATE_INFO,
+       QUERY_INDEX_MAX
+} QUERY_INDEX;
+
+#endif  /* __PKGMGR_QUERY_INDEX_H__ */
index 4d684d5..e63248c 100644 (file)
@@ -41,6 +41,7 @@
 #include "pkgmgr_parser_debug.h"
 #include "pkgmgr_parser_internal.h"
 #include "manager/pkginfo_manager.h"
+#include "pkgmgr_query_index.h"
 
 #ifndef OWNER_ROOT
 #define OWNER_ROOT 0
@@ -71,6 +72,8 @@
 #define XXHDPI_MIN 481
 #define XXHDPI_MAX 600
 
+#define MAX_UID_LENGTH 64
+
 /* app background category value */
 #define APP_BG_CATEGORY_USER_DISABLE_FALSE_VAL 0x00000
 #define APP_BG_CATEGORY_USER_DISABLE_TRUE_VAL  0x00001
@@ -558,72 +561,68 @@ static int __insert_package_plugin_execution_info(
 {
        GList *tmp;
        plugin_x *plugin;
-       char **queries = NULL;
        int idx = 0;
-       int i = 0;
+       const char ***args;
+       int i;
+       int ret = PM_PARSER_R_ERROR;
 
        if (!mfx->plugin)
                return PM_PARSER_R_OK;
 
-       queries = calloc(g_list_length(mfx->plugin), sizeof (char *));
-       if (queries == NULL) {
+       int len = g_list_length(mfx->plugin);
+
+       args = calloc(len, sizeof(char **));
+       if (args == NULL) {
                _LOGE("Out of memory");
                return PM_PARSER_R_ERROR;
        }
 
+       for (i = 0; i < len; i++) {
+               args[i] = calloc(4, sizeof(char *));
+               if (args[i] == NULL) {
+                       _LOGE("Out of memory");
+                       goto clear;
+               }
+       }
+
        for (tmp = mfx->plugin; tmp; tmp = tmp->next) {
                plugin = (plugin_x *)tmp->data;
                if (plugin == NULL)
                        continue;
 
-               queries[idx] = sqlite3_mprintf("INSERT INTO package_plugin_info "
-                               "(pkgid, appid, plugin_type, plugin_name) "
-                               "VALUES (%Q, %Q, %Q, %Q)",
-                               plugin->pkgid, plugin->appid,
-                               plugin->plugin_type, plugin->plugin_name);
-               if (queries[idx] == NULL) {
-                       _LOGE("Out of memory");
-                       for (i = 0; i < idx; ++i)
-                               sqlite3_free(queries[i]);
-                       free(queries);
-                       return PM_PARSER_R_ERROR;
-               }
-
+               args[idx][0] = plugin->pkgid;
+               args[idx][1] = plugin->appid;
+               args[idx][2] = plugin->plugin_type;
+               args[idx][3] = plugin->plugin_name;
                idx++;
        }
 
-       if (_parser_execute_write_queries((const char **)queries, idx, uid) < 0) {
+       if (_parser_execute_write_queries(QUERY_INDEX_INSERT_PACKAGE_PLUGIN_EXECUTION_INFO,
+                       args, 4, idx, uid) < 0) {
                _LOGE("Fail to write to db");
-               for (i = 0; i < idx; ++i)
-                       sqlite3_free(queries[i]);
-               free(queries);
+               goto clear;
                return PM_PARSER_R_ERROR;
        }
 
-       for (i = 0; i < idx; ++i)
-               sqlite3_free(queries[i]);
-       free(queries);
+       ret = PM_PARSER_R_OK;
+clear:
+       for (i = 0; i < len; i++)
+               free(args[i]);
 
-       return PM_PARSER_R_OK;
+       free(args);
+
+       return ret;
 }
 
 static int __delete_package_plugin_execution_info(const char *pkgid, uid_t uid)
 {
-       char *query = NULL;
-
-       query = sqlite3_mprintf(
-                       "DELETE FROM package_plugin_info WHERE pkgid=%Q", pkgid);
-       if (query == NULL) {
-               _LOGE("Out of memory");
-               return PM_PARSER_R_ERROR;
-       }
+       const char *args[1] = { pkgid };
 
-       if (_parser_execute_write_query(query, uid) < 0) {
+       if (_parser_execute_write_query(QUERY_INDEX_DELETE_PACKAGE_PLUGIN_EXECUTION_INFO,
+                       args, 1, uid) < 0) {
                _LOGE("Fail to write to db");
-               sqlite3_free(query);
                return PM_PARSER_R_ERROR;
        }
-       sqlite3_free(query);
 
        return PM_PARSER_R_OK;
 }
@@ -677,26 +676,23 @@ API int pkgmgr_parser_update_manifest_info_in_db(manifest_x *mfx)
 API int pkgmgr_parser_update_global_app_disable_for_uid_info_in_db(
                const char *appid, uid_t uid, int is_disable)
 {
-       // TODO: construct query at here and send it to server
-       char *query = NULL;
+       char uid_str[MAX_UID_LENGTH] = { 0, };
+       const char *args[4];
+       int r;
 
-       query = sqlite3_mprintf("INSERT OR REPLACE INTO package_app_info_for_uid ("
-                       "  app_id, uid, is_disabled, is_splash_screen_enabled) "
-                       "VALUES (%Q, %u, %Q,"
-                       "  (SELECT app_splash_screen_display FROM package_app_info"
-                       "   WHERE app_id=%Q))", appid, uid,
-                       (is_disable ? "true" : "false"), appid);
-       if (query == NULL) {
-               _LOGE("Out of memory");
+       r = snprintf(uid_str, sizeof(uid_str), "%d", uid);
+       if (r < 0 || r >= sizeof(uid_str))
                return PM_PARSER_R_ERROR;
-       }
+       args[0] = appid;
+       args[1] = uid_str;
+       args[2] = is_disable ? "true" : "false";
+       args[3] = appid;
 
-       if (_parser_execute_write_query(query, uid) < 0) {
+       if (_parser_execute_write_query(QUERY_INDEX_UPDATE_GLOBAL_APP_DISABLE,
+                       args, 4, uid) < 0) {
                _LOGE("Fail to write to db");
-               sqlite3_free(query);
                return PM_PARSER_R_ERROR;
        }
-       sqlite3_free(query);
 
        return PM_PARSER_R_OK;
 }
@@ -704,21 +700,15 @@ API int pkgmgr_parser_update_global_app_disable_for_uid_info_in_db(
 API int pkgmgr_parser_update_app_disable_info_in_usr_db(const char *appid,
                uid_t uid, int is_disable)
 {
-       char *query = NULL;
-
-       query = sqlite3_mprintf("UPDATE package_app_info SET app_disable=%Q "
-               "WHERE app_id=%Q", (is_disable ? "true" : "false"), appid);
-       if (query == NULL) {
-               _LOGE("Out of memory");
-               return PM_PARSER_R_ERROR;
-       }
+       const char *args[2];
+       args[0] = is_disable ? "true" : "false";
+       args[1] = appid;
 
-       if (_parser_execute_write_query(query, uid) < 0) {
+       if (_parser_execute_write_query(QUERY_INDEX_UPDATE_APP_DISABLE_INFO,
+                       args, 2, uid) < 0) {
                _LOGE("Fail to write to db");
-               sqlite3_free(query);
                return PM_PARSER_R_ERROR;
        }
-       sqlite3_free(query);
 
        return PM_PARSER_R_OK;
 }
@@ -733,21 +723,15 @@ API int pkgmgr_parser_update_app_disable_info_in_db(const char *appid,
 API int pkgmgr_parser_update_pkg_disable_info_in_usr_db(const char *pkgid,
                uid_t uid, int is_disable)
 {
-       char *query = NULL;
+       const char *args[2];
+       args[0] = is_disable ? "true" : "false";
+       args[1] = pkgid;
 
-       query = sqlite3_mprintf("UPDATE package_info SET package_disable=%Q "
-                       "WHERE package=%Q", (is_disable ? "true" : "false"), pkgid);
-       if (query == NULL) {
-               _LOGE("Out of memory");
-               return PM_PARSER_R_ERROR;
-       }
-
-       if (_parser_execute_write_query(query, uid) < 0) {
+       if (_parser_execute_write_query(QUERY_INDEX_UPDATE_PKG_DISABLE_INFO,
+                       args, 2, uid) < 0) {
                _LOGE("Fail to write to db");
-               sqlite3_free(query);
                return PM_PARSER_R_ERROR;
        }
-       sqlite3_free(query);
 
        return PM_PARSER_R_OK;
 }
@@ -762,22 +746,23 @@ API int pkgmgr_parser_update_pkg_disable_info_in_db(const char *pkgid,
 API int pkgmgr_parser_update_global_app_splash_screen_display_info_in_usr_db(
                const char *appid, uid_t uid, int flag)
 {
-       char *query = NULL;
+       const char *args[3];
+       char uid_str[MAX_UID_LENGTH] = { 0, };
+       int r;
 
-       query = sqlite3_mprintf("INSERT OR REPLACE INTO package_app_info_for_uid("
-               "  app_id, uid, is_splash_screen_enabled) "
-               "VALUES (%Q, %u, %Q)", appid, uid, (flag == 1 ? "true" : "false"));
-       if (query == NULL) {
-               _LOGE("Out of memory");
+       r = snprintf(uid_str, sizeof(uid_str), "%d", uid);
+       if (r < 0 || r >= sizeof(uid_str))
                return PM_PARSER_R_ERROR;
-       }
+       args[0] = appid;
+       args[1] = uid_str;
+       args[2] = (flag == 1 ? "true" : "false");
 
-       if (_parser_execute_write_query(query, uid) < 0) {
+       if (_parser_execute_write_query(
+                       QUERY_INDEX_UPDATE_GLOBAL_APP_SPLASH_SCREEN_DISPLAY_INFO,
+                       args, 3, uid) < 0) {
                _LOGE("Fail to write to db");
-               sqlite3_free(query);
                return PM_PARSER_R_ERROR;
        }
-       sqlite3_free(query);
 
        return PM_PARSER_R_OK;
 }
@@ -785,21 +770,17 @@ API int pkgmgr_parser_update_global_app_splash_screen_display_info_in_usr_db(
 API int pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(
                const char *appid, uid_t uid, int flag)
 {
-       char *query = NULL;
+       const char *args[2];
 
-       query = sqlite3_mprintf("UPDATE package_app_info SET app_splash_screen_display=%Q "
-               "WHERE app_id=%Q", (flag == 1 ? "true" : "false"), appid);
-       if (query == NULL) {
-               _LOGE("Out of memory");
-               return PM_PARSER_R_ERROR;
-       }
+       args[0] = (flag == 1 ? "true" : "false");
+       args[1] = appid;
 
-       if (_parser_execute_write_query(query, uid) < 0) {
+       if (_parser_execute_write_query(
+                       QUERY_INDEX_UPDATE_APP_SPLASH_SCREEN_DISPLAY_INFO,
+                       args, 2, uid) < 0) {
                _LOGE("Fail to write to db");
-               sqlite3_free(query);
                return PM_PARSER_R_ERROR;
        }
-       sqlite3_free(query);
 
        return PM_PARSER_R_OK;
 }
@@ -814,21 +795,13 @@ API int pkgmgr_parser_update_app_splash_screen_display_info_in_db(
 API int pkgmgr_parser_update_app_label_info_in_usr_db(const char *appid,
                uid_t uid, const char *label)
 {
-       char *query = NULL;
-
-       query = sqlite3_mprintf("UPDATE package_app_localized_info SET app_label=%Q "
-               "WHERE app_id=%Q AND app_label IS NOT NULL", label, appid);
-       if (query == NULL) {
-               _LOGE("Out of memory");
-               return PM_PARSER_R_ERROR;
-       }
+       const char *args[2] = { label, appid };
 
-       if (_parser_execute_write_query(query, uid) < 0) {
+       if (_parser_execute_write_query(QUERY_INDEX_UPDATE_APP_LABEL_INFO,
+                       args, 2, uid) < 0) {
                _LOGE("Fail to write to db");
-               sqlite3_free(query);
                return PM_PARSER_R_ERROR;
        }
-       sqlite3_free(query);
 
        return PM_PARSER_R_OK;
 }
@@ -843,21 +816,13 @@ API int pkgmgr_parser_update_app_label_info_in_db(const char *appid,
 API int pkgmgr_parser_update_app_icon_info_in_usr_db(const char *appid,
                uid_t uid, const char *icon_path)
 {
-       char *query = NULL;
+       const char *args[2] = { icon_path, appid };
 
-       query = sqlite3_mprintf("UPDATE package_app_localized_info SET app_icon=%Q "
-               "WHERE app_id=%Q AND app_icon IS NOT NULL", icon_path, appid);
-       if (query == NULL) {
-               _LOGE("Out of memory");
-               return PM_PARSER_R_ERROR;
-       }
-
-       if (_parser_execute_write_query(query, uid) < 0) {
+       if (_parser_execute_write_query(QUERY_INDEX_UPDATE_APP_ICON_INFO,
+                       args, 2, uid) < 0) {
                _LOGE("Fail to write to db");
-               sqlite3_free(query);
                return PM_PARSER_R_ERROR;
        }
-       sqlite3_free(query);
 
        return PM_PARSER_R_OK;
 }
@@ -872,21 +837,13 @@ API int pkgmgr_parser_update_app_icon_info_in_db(const char *appid,
 API int pkgmgr_parser_update_tep_info_in_usr_db(const char *pkgid,
                const char *tep_path, uid_t uid)
 {
-       char *query = NULL;
+       const char *args[2] = { tep_path, pkgid };
 
-       query = sqlite3_mprintf("UPDATE package_info SET package_tep_name=%Q "
-               "WHERE package=%Q", tep_path, pkgid);
-       if (query == NULL) {
-               _LOGE("Out of memory");
-               return PM_PARSER_R_ERROR;
-       }
-
-       if (_parser_execute_write_query(query, uid) < 0) {
+       if (_parser_execute_write_query(QUERY_INDEX_UPDATE_TEP_INFO,
+                       args, 2, uid) < 0) {
                _LOGE("Fail to write to db");
-               sqlite3_free(query);
                return PM_PARSER_R_ERROR;
        }
-       sqlite3_free(query);
 
        return PM_PARSER_R_OK;
 }
@@ -915,22 +872,13 @@ static int __convert_update_type(pkgmgrinfo_updateinfo_update_type type,
 static int __register_pkg_update_info(updateinfo_x *info,
                const char *update_type, uid_t uid)
 {
-       char *query = NULL;
-
-       query = sqlite3_mprintf("UPDATE package_update_info "
-               "SET update_version=%Q, update_type=%Q "
-               "WHERE package=%Q", info->version, update_type, info->pkgid);
-       if (query == NULL) {
-               _LOGE("Out of memory");
-               return PM_PARSER_R_ERROR;
-       }
+       const char *args[3] = { info->version, update_type, info->pkgid };
 
-       if (_parser_execute_write_query(query, uid) < 0) {
+       if (_parser_execute_write_query(QUERY_INDEX_REGISTER_PKG_UPDATE_INFO,
+                       args, 3, uid) < 0) {
                _LOGE("Fail to write to db");
-               sqlite3_free(query);
                return PM_PARSER_R_ERROR;
        }
-       sqlite3_free(query);
 
        return PM_PARSER_R_OK;
 }
@@ -1005,21 +953,13 @@ API int pkgmgr_parser_register_pkg_update_info_in_db(
 
 static int __unregister_pkg_update_info(const char *pkgid, uid_t uid)
 {
-       char *query = NULL;
+       const char *args[1] = { pkgid };
 
-       query = sqlite3_mprintf("UPDATE package_update_info "
-               "SET update_type='none' WHERE package=%Q", pkgid);
-       if (query == NULL) {
-               _LOGE("Out of memory");
-               return PM_PARSER_R_ERROR;
-       }
-
-       if (_parser_execute_write_query(query, uid) < 0) {
+       if (_parser_execute_write_query(QUERY_INDEX_UNREGISTER_PKG_UPDATE_INFO,
+                       args, 1, uid) < 0) {
                _LOGE("Fail to write to db");
-               sqlite3_free(query);
                return PM_PARSER_R_ERROR;
        }
-       sqlite3_free(query);
 
        return PM_PARSER_R_OK;
 }
@@ -1060,21 +1000,11 @@ API int pkgmgr_parser_unregister_pkg_update_info_in_db(const char *pkgid)
 
 API int pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(uid_t uid)
 {
-       char *query = NULL;
-
-       query = sqlite3_mprintf("UPDATE package_update_info "
-                       "SET update_type='none'");
-       if (query == NULL) {
-               _LOGE("Out of memory");
-               return PM_PARSER_R_ERROR;
-       }
-
-       if (_parser_execute_write_query(query, uid) < 0) {
+       if (_parser_execute_write_query(QUERY_INDEX_UNREGISTER_ALL_PKG_UPDATE_INFO,
+               NULL, 0, uid) < 0) {
                _LOGE("Fail to write to db");
-               sqlite3_free(query);
                return PM_PARSER_R_ERROR;
        }
-       sqlite3_free(query);
 
        return PM_PARSER_R_OK;
 }
index f8745e3..f5f32a2 100644 (file)
 
 #include "pkgmgrinfo_debug.h"
 #include "pkgmgrinfo_internal.h"
+#include "pkgmgr_query_index.h"
+
+namespace {
+
+constexpr const char query_appinfo_get_localed_label[] =
+    "SELECT COALESCE((SELECT app_label FROM package_app_localized_info "
+    "WHERE app_id=%Q AND app_locale=%Q),"
+    "(SELECT app_label FROM package_app_localized_info WHERE "
+    "app_id=%Q AND app_locale='No Locale'))";
+
+constexpr const char query_appinfo_get_datacontrol_info[] =
+    "SELECT app_id, access FROM "
+    "package_app_data_control WHERE "
+    "providerid=%Q AND type=%Q";
+
+constexpr const char query_appinfo_get_datacontrol_appid[] =
+    "SELECT app_id FROM package_app_data_control "
+    "WHERE providerid=%Q";
+
+constexpr const char query_appinfo_get_datacontrol_trusted_info[] =
+    "SELECT app_id, trusted FROM package_app_data_control "
+    "WHERE providerid=%Q AND type=%Q";
+
+constexpr const char query_appinfo_get_datacontrol_privileges[] =
+    "SELECT privilege FROM package_app_data_control_privilege "
+    "WHERE providerid=%Q AND type=%Q";
+
+constexpr const char query_appinfo_get_appcontrol_privileges[] =
+    "SELECT app_control, privilege FROM package_app_app_control_privilege "
+    "WHERE app_id=%Q";
+
+constexpr const char query_plugininfo_get_appids[] =
+    "SELECT appid FROM "
+    "package_plugin_info WHERE pkgid=%Q AND "
+    "plugin_type=%Q AND plugin_name=%Q";
+
+constexpr const char query_get_pkg_updateinfo_1[] =
+    "SELECT package, update_version, update_type "
+    "FROM package_update_info";
+constexpr const char query_get_pkg_updateinfo_2[] =
+    "SELECT package, update_version, update_type "
+    "FROM package_update_info WHERE package=%Q";
+
+constexpr const char query_pkginfo_set_usr_installed_storage_1[] =
+    "UPDATE package_info SET installed_storage=%Q, external_path=%Q "
+    "WHERE package=%Q";
+constexpr const char query_pkginfo_set_usr_installed_storage_2[] =
+    "UPDATE package_app_info SET app_installed_storage=%Q, "
+    "app_external_path=%Q WHERE package=%Q";
+
+constexpr const char query_certinfo_compare_pkg_certinfo[] =
+    "SELECT package, "
+    "COALESCE(author_signer_cert, -1) FROM package_cert_info WHERE "
+    "package IN (%Q, %Q)";
+
+constexpr const char query_certinfo_compare_app_certinfo[] =
+    "SELECT app_id, package FROM "
+    "package_app_info WHERE app_id IN (%Q, %Q)";
+
+constexpr const char query_pkginfo_delete_certinfo[] =
+    "UPDATE package_cert_info SET "
+    "package_count = package_count - 1 WHERE package=%Q";
+
+// For pkgmgr_parser
+constexpr const char query_insert_package_plugin_execution_info[] =
+    "INSERT INTO package_plugin_info "
+    "(pkgid, appid, plugin_type, plugin_name) "
+    "VALUES (%Q, %Q, %Q, %Q)";
+
+constexpr const char query_delete_package_plugin_execution_info[] =
+    "DELETE FROM package_plugin_info WHERE pkgid=%Q";
+
+constexpr const char query_update_global_app_disable[] =
+    "INSERT OR REPLACE INTO package_app_info_for_uid ("
+    "  app_id, uid, is_disabled, is_splash_screen_enabled) "
+    "VALUES (%Q, %Q, %Q,"
+    "  (SELECT app_splash_screen_display FROM package_app_info"
+    "   WHERE app_id=%Q))";
+
+constexpr const char query_update_app_disable_info[] =
+    "UPDATE package_app_info SET app_disable=%Q "
+    "WHERE app_id=%Q";
+
+constexpr const char query_update_pkg_disable_info[] =
+    "UPDATE package_info SET package_disable=%Q "
+    "WHERE package=%Q";
+
+constexpr const char query_update_global_app_splash_screen_display_info[] =
+    "INSERT OR REPLACE INTO package_app_info_for_uid("
+    "  app_id, uid, is_splash_screen_enabled) "
+    "VALUES (%Q, %Q, %Q)";
+
+constexpr const char query_update_app_splash_screen_display_info[] =
+    "UPDATE package_app_info SET app_splash_screen_display=%Q "
+    "WHERE app_id=%Q";
+
+constexpr const char query_update_app_label_info[] =
+    "UPDATE package_app_localized_info SET app_label=%Q "
+    "WHERE app_id=%Q AND app_label IS NOT NULL";
+
+constexpr const char query_update_app_icon_info[] =
+    "UPDATE package_app_localized_info SET app_icon=%Q "
+    "WHERE app_id=%Q AND app_icon IS NOT NULL";
+
+constexpr const char query_update_tep_info[] =
+    "UPDATE package_info SET package_tep_name=%Q "
+    "WHERE package=%Q";
+
+constexpr const char query_register_pkg_update_info[] =
+    "UPDATE package_update_info "
+    "SET update_version=%Q, update_type=%Q "
+    "WHERE package=%Q";
+
+constexpr const char query_unregister_pkg_update_info[] =
+    "UPDATE package_update_info "
+    "SET update_type='none' WHERE package=%Q";
+
+constexpr const char query_unregister_all_pkg_update_info[] =
+    "UPDATE package_update_info "
+    "SET update_type='none'";
+
+class QueryMaker {
+ public:
+  std::vector<const char*> query_raw_ = {
+    query_appinfo_get_localed_label,
+    query_appinfo_get_datacontrol_info,
+    query_appinfo_get_datacontrol_appid,
+    query_appinfo_get_datacontrol_trusted_info,
+    query_appinfo_get_datacontrol_privileges,
+    query_appinfo_get_appcontrol_privileges,
+    query_plugininfo_get_appids,
+    query_get_pkg_updateinfo_1,
+    query_get_pkg_updateinfo_2,
+    query_pkginfo_set_usr_installed_storage_1,
+    query_pkginfo_set_usr_installed_storage_2,
+    query_certinfo_compare_pkg_certinfo,
+    query_certinfo_compare_app_certinfo,
+    query_pkginfo_delete_certinfo,
+
+    query_insert_package_plugin_execution_info,
+    query_delete_package_plugin_execution_info,
+    query_update_global_app_disable,
+    query_update_app_disable_info,
+    query_update_pkg_disable_info,
+    query_update_global_app_splash_screen_display_info,
+    query_update_app_splash_screen_display_info,
+    query_update_app_label_info,
+    query_update_app_icon_info,
+    query_update_tep_info,
+    query_register_pkg_update_info,
+    query_unregister_pkg_update_info,
+    query_unregister_all_pkg_update_info,
+  };
+
+  std::vector<unsigned int> arg_cnt_ = {
+    3, // query_appinfo_get_localed_label
+    2, // query_appinfo_get_datacontrol_info
+    1, // query_appinfo_get_datacontrol_appid
+    2, // query_appinfo_get_datacontrol_trusted_info
+    2, // query_appinfo_get_datacontrol_privileges
+    1, // query_appinfo_get_appcontrol_privileges
+    3, // query_plugininfo_get_appids
+    0, // query_get_pkg_updateinfo_1
+    1, // query_get_pkg_updateinfo_2
+    3, // query_pkginfo_set_usr_installed_storage_1
+    3, // query_pkginfo_set_usr_installed_storage_2
+    2, // query_certinfo_compare_pkg_certinfo
+    2, // query_certinfo_compare_app_certinfo
+    1, // query_pkginfo_delete_certinfo
+
+    4, // query_insert_package_plugin_execution_info,
+    1, // query_delete_package_plugin_execution_info,
+    4, // query_update_global_app_disable,
+    2, // query_update_app_disable_info,
+    2, // query_update_pkg_disable_info,
+    3, // query_update_global_app_splash_screen_display_info,
+    2, // query_update_app_splash_screen_display_info,
+    2, // query_update_app_label_info,
+    2, // query_update_app_icon_info,
+    2, // query_update_tep_info,
+    3, // query_register_pkg_update_info,
+    1, // query_unregister_pkg_update_info,
+    0, // query_unregister_all_pkg_update_info,
+  };
+
+  std::string Make(int index, const std::vector<std::string>& args) {
+    if (index < 0 || index >= QUERY_INDEX_MAX)
+      return "";
+    const char* raw = query_raw_[index];
+    char* query = nullptr;
+
+    if (arg_cnt_[index] != args.size())
+      return "";
+
+    switch(arg_cnt_[index]) {
+      case 0:
+        query = sqlite3_mprintf(raw);
+        break;
+
+      case 1:
+        query = sqlite3_mprintf(raw, args[0].c_str());
+        break;
+
+      case 2:
+        query = sqlite3_mprintf(raw, args[0].c_str(), args[1].c_str());
+        break;
+
+      case 3:
+        query = sqlite3_mprintf(raw, args[0].c_str(), args[1].c_str(),
+            args[2].c_str());
+        break;
+
+      case 4:
+        query = sqlite3_mprintf(raw, args[0].c_str(), args[1].c_str(),
+            args[2].c_str(), args[3].c_str());
+        break;
+
+      case 5:
+        query = sqlite3_mprintf(raw, args[0].c_str(), args[1].c_str(),
+            args[2].c_str(), args[3].c_str(), args[4].c_str());
+        break;
+
+      case 6:
+        query = sqlite3_mprintf(raw, args[0].c_str(), args[1].c_str(),
+            args[2].c_str(), args[3].c_str(), args[4].c_str(),
+            args[5].c_str());
+        break;
+
+      case 7:
+        query = sqlite3_mprintf(raw, args[0].c_str(), args[1].c_str(),
+            args[2].c_str(), args[3].c_str(), args[4].c_str(),
+            args[5].c_str(), args[6].c_str());
+        break;
+    }
+
+    if (query == nullptr)
+      return "";
+
+    std::string ret = query;
+    sqlite3_free(query);
+
+    return ret;
+  }
+};
+
+QueryMaker __query_maker;
+
+}  // namespace
 
 namespace pkgmgr_common {
 namespace database {
@@ -30,8 +278,8 @@ QueryHandler::QueryHandler(uid_t uid, int pid)
 
 QueryHandler::~QueryHandler() {}
 
-void QueryHandler::SetQuery(std::vector<std::string> query) {
-  query_ = std::move(query);
+void QueryHandler::SetQueryArgs(std::vector<std::pair<int, std::vector<std::string>>> query_args) {
+  query_args_ = std::move(query_args);
 }
 
 std::string QueryHandler::GetString() { return std::string(); }
@@ -42,12 +290,28 @@ std::vector<std::vector<std::string>> QueryHandler::GetResult() {
   return std::move(result_);
 }
 
+int QueryHandler::MakeQuery() {
+  query_.clear();
+  for (auto& i : query_args_) {
+    std::string q = __query_maker.Make(i.first, i.second);
+    if (q.empty())
+      return -1;
+    query_.push_back(std::move(q));
+  }
+
+  return 0;
+}
+
 int QueryHandler::Execute() {
   std::shared_lock<std::shared_timed_mutex> s(lock_);
   if (!Connect()) {
     _LOGE("Failed to connect database");
     return PMINFO_R_ERROR;
   }
+
+  if (MakeQuery() != 0)
+    return PMINFO_R_ERROR;
+
   if (query_.size() == 0) {
     _LOGE("Empty query");
     return PMINFO_R_ERROR;
index c9f0db7..6b0febc 100644 (file)
@@ -37,7 +37,7 @@ class EXPORT_API QueryHandler : public AbstractDBHandler{
  public:
   QueryHandler(uid_t uid, int pid);
   ~QueryHandler();
-  void SetQuery(std::vector<std::string> query);
+  void SetQueryArgs(std::vector<std::pair<int, std::vector<std::string>>> query_args);
   bool BindString(std::string value);
   bool BindInt(int value);
   std::string GetString();
@@ -47,8 +47,12 @@ class EXPORT_API QueryHandler : public AbstractDBHandler{
   std::vector<std::vector<std::string>> GetResult();
 
  private:
+  int MakeQuery();
+
+ private:
   uid_t uid_;
   std::vector<std::string> query_;
+  std::vector<std::pair<int, std::vector<std::string>>> query_args_;
   std::vector<std::vector<std::string>> result_;
 };
 
index 961a9c1..700affd 100644 (file)
@@ -31,24 +31,30 @@ QueryParcelable::QueryParcelable()
     op_type_(AbstractDBHandler::OperationType::OPERATION_TYPE_NONE) {}
 
 
-QueryParcelable::QueryParcelable(uid_t uid, std::string query,
+QueryParcelable::QueryParcelable(uid_t uid,
+    std::pair<int, std::vector<std::string>> query_args,
     AbstractDBHandler::DBType db_type,
     AbstractDBHandler::OperationType op_type)
     : AbstractParcelable(0, ParcelableType::Query),
-    queries_(std::vector<std::string>{query}),
+    query_args_(std::vector<std::pair<int, std::vector<std::string>>>{query_args}),
     db_type_(db_type), op_type_(op_type) {}
 
-QueryParcelable::QueryParcelable(uid_t uid, std::vector<std::string> queries,
+QueryParcelable::QueryParcelable(uid_t uid,
+    std::vector<std::pair<int, std::vector<std::string>>> query_args,
     AbstractDBHandler::DBType db_type,
     AbstractDBHandler::OperationType op_type)
     : AbstractParcelable(uid, ParcelableType::Query),
-    queries_(queries), db_type_(db_type), op_type_(op_type) {}
+    query_args_(std::move(query_args)), db_type_(db_type), op_type_(op_type) {}
 
 void QueryParcelable::WriteToParcel(tizen_base::Parcel* parcel) const {
   AbstractParcelable::WriteToParcel(parcel);
-  WriteInt(parcel, queries_.size());
-  for (const auto& query : queries_)
-    parcel->WriteString(query);
+  WriteInt(parcel, query_args_.size());
+  for (const auto& query_info : query_args_) {
+    WriteInt(parcel, query_info.first);
+    WriteInt(parcel, query_info.second.size());
+    for (const auto& args : query_info.second)
+      parcel->WriteString(args);
+  }
   WriteInt(parcel, db_type_);
   WriteInt(parcel, op_type_);
 }
@@ -61,7 +67,16 @@ void QueryParcelable::ReadFromParcel(tizen_base::Parcel* parcel) {
   AbstractParcelable::ReadFromParcel(parcel);
   ReadInt(parcel, &query_size);
   for (int i = 0; i < query_size; ++i) {
-    queries_.emplace_back(parcel->ReadString());
+    std::vector<std::string> args;
+    int index = -1;
+    int arg_cnt = 0;
+    ReadInt(parcel, &index);
+    ReadInt(parcel, &arg_cnt);
+
+    for (int j = 0; j < arg_cnt; ++j) {
+      args.push_back(parcel->ReadString());
+    }
+    query_args_.push_back(std::pair<int, std::vector<std::string>>(index, std::move(args)));
   }
   ReadInt(parcel, &db_type);
   db_type_ = static_cast<AbstractDBHandler::DBType>(db_type);
@@ -69,8 +84,8 @@ void QueryParcelable::ReadFromParcel(tizen_base::Parcel* parcel) {
   op_type_ = static_cast<AbstractDBHandler::OperationType>(op_type);
 }
 
-const std::vector<std::string>& QueryParcelable::GetQueries() {
-  return queries_;
+const std::vector<std::pair<int, std::vector<std::string>>>& QueryParcelable::GetQueryArgs() {
+  return query_args_;
 }
 
 AbstractDBHandler::DBType QueryParcelable::GetDBType() {
index 2efe307..bb328bb 100644 (file)
@@ -20,9 +20,11 @@ namespace parcel {
 class EXPORT_API QueryParcelable : public AbstractParcelable {
  public:
   QueryParcelable();
-  QueryParcelable(uid_t uid, std::string query, AbstractDBHandler::DBType db_type, AbstractDBHandler::OperationType op_type);
-  QueryParcelable(uid_t uid, std::vector<std::string> query, AbstractDBHandler::DBType db_type, AbstractDBHandler::OperationType op_type);
-  const std::vector<std::string>& GetQueries();
+  QueryParcelable(uid_t uid, std::pair<int, std::vector<std::string>> query_args,
+      AbstractDBHandler::DBType db_type, AbstractDBHandler::OperationType op_type);
+  QueryParcelable(uid_t uid, std::vector<std::pair<int, std::vector<std::string>>> query_args,
+      AbstractDBHandler::DBType db_type, AbstractDBHandler::OperationType op_type);
+  const std::vector<std::pair<int, std::vector<std::string>>>& GetQueryArgs();
   AbstractDBHandler::DBType GetDBType();
   AbstractDBHandler::OperationType GetOpType();
 
@@ -30,7 +32,7 @@ class EXPORT_API QueryParcelable : public AbstractParcelable {
   void ReadFromParcel(tizen_base::Parcel* parcel) override;
 
  private:
-  std::vector<std::string> queries_;
+  std::vector<std::pair<int, std::vector<std::string>>> query_args_;
   AbstractDBHandler::DBType db_type_;
   AbstractDBHandler::OperationType op_type_;
 };
index 59049f1..ea1a73c 100644 (file)
@@ -41,7 +41,7 @@ bool QueryRequestHandler::HandleRequest(unsigned char* data, int size,
 
   pcd::QueryHandler db(parcel->GetUid(), GetPID());
   db.SetLocale(locale);
-  db.SetQuery(parcel->GetQueries());
+  db.SetQueryArgs(parcel->GetQueryArgs());
   db.SetDBType(parcel->GetDBType());
   db.SetOpType(parcel->GetOpType());
   int ret = db.Execute();
index 76ea616..2710306 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "pkgmgr_parser.h"
 #include "pkgmgrinfo_private.h"
+#include "pkgmgr_query_index.h"
 
 #include "client/pkginfo_client.hh"
 #include "common/database/abstract_db_handler.hh"
@@ -180,23 +181,11 @@ extern "C" EXPORT_API int _appinfo_get_applications(uid_t uid,
 
 extern "C" EXPORT_API char* _appinfo_get_localed_label(
     const char* appid, const char* locale, uid_t uid) {
-  char* query = nullptr;
-  query = sqlite3_mprintf(
-      "SELECT COALESCE((SELECT app_label FROM package_app_localized_info "
-      "WHERE app_id=%Q AND app_locale=%Q),"
-      "(SELECT app_label FROM package_app_localized_info WHERE "
-      "app_id=%Q AND app_locale='No Locale'))",
-      appid, locale, appid);
-  if (query == nullptr) {
-    LOG(ERROR) << "Out of memory";
-    return nullptr;
-  }
-
   std::shared_ptr<pcp::AbstractParcelable> parcelable(
-      new pcp::QueryParcelable(uid, std::string(query),
+      new pcp::QueryParcelable(uid,
+          { QUERY_INDEX_APPINFO_GET_LOCALED_LABEL, { appid, locale, appid } },
           pcd::AbstractDBHandler::DBType::DB_TYPE_FILE_PKGDB,
           pcd::AbstractDBHandler::OperationType::OPERATION_TYPE_READ));
-  sqlite3_free(query);
 
   pkgmgr_client::PkgInfoClient client(parcelable, uid,
       pkgmgr_common::ReqType::QUERY);
@@ -243,21 +232,11 @@ extern "C" EXPORT_API char* _appinfo_get_localed_label(
 extern "C" EXPORT_API int _appinfo_get_datacontrol_info(
     const char* providerid, const char* type, uid_t uid,
     char** appid, char** access) {
-  char* query = nullptr;
-  query = sqlite3_mprintf("SELECT app_id, access FROM "
-    "package_app_data_control WHERE "
-    "providerid=%Q AND type=%Q",
-    providerid, type);
-  if (query == nullptr) {
-    LOG(ERROR) << "Out of memory";
-    return PMINFO_R_ERROR;
-  }
-
   std::shared_ptr<pcp::AbstractParcelable> parcelable(
-      new pcp::QueryParcelable(uid, std::string(query),
+      new pcp::QueryParcelable(uid,
+          { QUERY_INDEX_APPINFO_GET_DATACONTROL_INFO, { providerid, type } },
           pcd::AbstractDBHandler::DBType::DB_TYPE_FILE_PKGDB,
           pcd::AbstractDBHandler::OperationType::OPERATION_TYPE_READ));
-  sqlite3_free(query);
 
   pkgmgr_client::PkgInfoClient client(parcelable, uid,
       pkgmgr_common::ReqType::QUERY);
@@ -305,20 +284,11 @@ extern "C" EXPORT_API int _appinfo_get_datacontrol_info(
 
 extern "C" EXPORT_API int _appinfo_get_datacontrol_appid(
     const char* providerid, uid_t uid, char** appid) {
-  char* query = nullptr;
-
-  query = sqlite3_mprintf("SELECT app_id FROM package_app_data_control "
-                          "WHERE providerid=%Q",
-                          providerid);
-  if (query == nullptr) {
-    LOGE("Out of memory");
-    return PMINFO_R_ERROR;
-  }
   std::shared_ptr<pcp::AbstractParcelable> parcelable(
-      new pcp::QueryParcelable(uid, std::string(query),
+      new pcp::QueryParcelable(uid,
+          { QUERY_INDEX_APPINFO_GET_DATACONTROL_APPID, { providerid } },
           pcd::AbstractDBHandler::DBType::DB_TYPE_FILE_PKGDB,
           pcd::AbstractDBHandler::OperationType::OPERATION_TYPE_READ));
-  sqlite3_free(query);
 
   pkgmgr_client::PkgInfoClient client(parcelable, uid,
       pkgmgr_common::ReqType::QUERY);
@@ -366,21 +336,11 @@ extern "C" EXPORT_API int _appinfo_get_datacontrol_appid(
 extern "C" EXPORT_API int _appinfo_get_datacontrol_trusted_info(
     const char* providerid, const char* type, uid_t uid,
     char** appid, char** trusted) {
-  char* query = nullptr;
-  query = sqlite3_mprintf(
-      "SELECT app_id, trusted FROM package_app_data_control "
-      "WHERE providerid=%Q AND type=%Q",
-      providerid, type);
-  if (query == nullptr) {
-    LOGE("Out of memory");
-    return PMINFO_R_ERROR;
-  }
-
   std::shared_ptr<pcp::AbstractParcelable> parcelable(
-      new pcp::QueryParcelable(uid, std::string(query),
+      new pcp::QueryParcelable(uid,
+          { QUERY_INDEX_APPINFO_GET_DATACONTROL_TRUSTED_INFO, { providerid, type } },
           pcd::AbstractDBHandler::DBType::DB_TYPE_FILE_PKGDB,
           pcd::AbstractDBHandler::OperationType::OPERATION_TYPE_READ));
-  sqlite3_free(query);
 
   pkgmgr_client::PkgInfoClient client(parcelable, uid,
       pkgmgr_common::ReqType::QUERY);
@@ -429,21 +389,11 @@ extern "C" EXPORT_API int _appinfo_get_datacontrol_trusted_info(
 
 extern "C" EXPORT_API int _appinfo_get_datacontrol_privileges(
     const char* providerid, const char* type, uid_t uid, GList** privileges) {
-  char* query = nullptr;
-  query = sqlite3_mprintf(
-      "SELECT privilege FROM package_app_data_control_privilege "
-      "WHERE providerid=%Q AND type=%Q",
-      providerid, type);
-  if (query == nullptr) {
-    LOGE("Out of memory");
-    return PMINFO_R_ERROR;
-  }
-
   std::shared_ptr<pcp::AbstractParcelable> parcelable(
-      new pcp::QueryParcelable(uid, std::string(query),
+      new pcp::QueryParcelable(uid,
+          { QUERY_INDEX_APPINFO_GET_DATACONTROL_PRIVILEGES, { providerid, type } },
           pcd::AbstractDBHandler::DBType::DB_TYPE_FILE_PKGDB,
           pcd::AbstractDBHandler::OperationType::OPERATION_TYPE_READ));
-  sqlite3_free(query);
 
   pkgmgr_client::PkgInfoClient client(parcelable, uid,
       pkgmgr_common::ReqType::QUERY);
@@ -492,20 +442,11 @@ extern "C" EXPORT_API int _appinfo_get_datacontrol_privileges(
 
 extern "C" EXPORT_API int _appinfo_get_appcontrol_privileges(
     const char* appid, const char* operation, uid_t uid, GList** privileges) {
-  char* query = nullptr;
-  query = sqlite3_mprintf(
-      "SELECT app_control, privilege FROM package_app_app_control_privilege "
-      "WHERE app_id=%Q", appid);
-  if (query == nullptr) {
-    LOG(ERROR) << "Out of memory";
-    return PMINFO_R_ERROR;
-  }
-
   std::shared_ptr<pcp::AbstractParcelable> parcelable(
-      new pcp::QueryParcelable(uid, std::string(query),
+      new pcp::QueryParcelable(uid,
+          { QUERY_INDEX_APPINFO_GET_APPCONTROL_PRIVILEGES, { appid } },
           pcd::AbstractDBHandler::DBType::DB_TYPE_FILE_PKGDB,
           pcd::AbstractDBHandler::OperationType::OPERATION_TYPE_READ));
-  sqlite3_free(query);
 
   pkgmgr_client::PkgInfoClient client(parcelable, uid,
       pkgmgr_common::ReqType::QUERY);
@@ -567,22 +508,11 @@ extern "C" EXPORT_API int _plugininfo_get_appids(
     return PMINFO_R_EINVAL;
   }
 
-  char* query = nullptr;
-  query = sqlite3_mprintf(
-      "SELECT appid FROM "
-      "package_plugin_info WHERE pkgid=%Q AND "
-      "plugin_type=%Q AND plugin_name=%Q",
-      pkgid, plugin_type, plugin_name);
-  if (query == nullptr) {
-    LOG(ERROR) << "Out of memory";
-    return PMINFO_R_ERROR;
-  }
-
   std::shared_ptr<pcp::AbstractParcelable> parcelable(
-      new pcp::QueryParcelable(_getuid(), std::string(query),
+      new pcp::QueryParcelable(_getuid(),
+          { QUERY_INDEX_PLUGININFO_GET_APPIDS, { pkgid, plugin_type, plugin_name } },
           pcd::AbstractDBHandler::DBType::DB_TYPE_FILE_PKGDB,
           pcd::AbstractDBHandler::OperationType::OPERATION_TYPE_READ));
-  sqlite3_free(query);
 
   pkgmgr_client::PkgInfoClient client(parcelable, _getuid(),
       pkgmgr_common::ReqType::QUERY);
@@ -659,28 +589,22 @@ static void __free_update_info(gpointer data) {
 
 extern "C" EXPORT_API int _get_pkg_updateinfo(const char* pkgid,
     GSList** update_info_list, uid_t uid) {
-  char* query = nullptr;
   int ret;
 
-  if (pkgid == nullptr)
-    query = sqlite3_mprintf(
-        "SELECT package, update_version, update_type "
-        "FROM package_update_info");
-  else
-    query = sqlite3_mprintf(
-        "SELECT package, update_version, update_type "
-        "FROM package_update_info WHERE package=%Q",
-        pkgid);
-  if (query == nullptr) {
-    LOG(ERROR) << "Out of memory";
-    return PMINFO_R_ERROR;
+  std::pair<int, std::vector<std::string>> info;
+
+  if (pkgid == nullptr) {
+    info = std::pair<int, std::vector<std::string>>(
+              QUERY_INDEX_GET_PKG_UPDATEINFO_1, {});
+  } else {
+    info = std::pair<int, std::vector<std::string>>(
+              QUERY_INDEX_GET_PKG_UPDATEINFO_2, { pkgid });
   }
 
   std::shared_ptr<pcp::AbstractParcelable> parcelable(
-      new pcp::QueryParcelable(uid, std::string(query),
+      new pcp::QueryParcelable(uid, std::move(info),
           pcd::AbstractDBHandler::DBType::DB_TYPE_FILE_PKGDB,
           pcd::AbstractDBHandler::OperationType::OPERATION_TYPE_READ));
-  sqlite3_free(query);
 
   pkgmgr_client::PkgInfoClient client(parcelable, uid,
       pkgmgr_common::ReqType::QUERY);
@@ -746,9 +670,7 @@ extern "C" EXPORT_API int _get_pkg_updateinfo(const char* pkgid,
 
 extern "C" EXPORT_API int _pkginfo_set_usr_installed_storage(const char* pkgid,
     INSTALL_LOCATION location, const char* external_pkg_path, uid_t uid) {
-  char* query = nullptr;
   const char* location_str;
-  std::vector<std::string> queries;
 
   if (location == INSTALL_INTERNAL)
     location_str = "installed_internal";
@@ -756,24 +678,22 @@ extern "C" EXPORT_API int _pkginfo_set_usr_installed_storage(const char* pkgid,
     location_str = "installed_external";
   else
     location_str = "installed_extended";
-  /* pkgcakge_info table */
-  query = sqlite3_mprintf(
-      "UPDATE package_info SET installed_storage=%Q, external_path=%Q "
-      "WHERE package=%Q",
-      location_str, external_pkg_path, pkgid);
-  queries.emplace_back(query);
-  sqlite3_free(query);
-
-  /* package_app_info table */
-  query = sqlite3_mprintf(
-      "UPDATE package_app_info SET app_installed_storage=%Q, "
-      "app_external_path=%Q WHERE package=%Q",
-      location_str, external_pkg_path, pkgid);
-  queries.emplace_back(query);
-  sqlite3_free(query);
 
   std::shared_ptr<pcp::AbstractParcelable> parcelable(
-      new pcp::QueryParcelable(uid, queries,
+      new pcp::QueryParcelable(uid, { {
+              QUERY_INDEX_PKGINFO_SET_USR_INSTALLED_STORAGE_1, {
+                location_str,
+                external_pkg_path,
+                pkgid
+              }
+            }, {
+              QUERY_INDEX_PKGINFO_SET_USR_INSTALLED_STORAGE_2, {
+                location_str,
+                external_pkg_path,
+                pkgid
+              }
+            },
+          },
           pcd::AbstractDBHandler::DBType::DB_TYPE_FILE_PKGDB,
           pcd::AbstractDBHandler::OperationType::OPERATION_TYPE_WRITE));
 
@@ -803,20 +723,9 @@ extern "C" EXPORT_API int _pkginfo_set_usr_installed_storage(const char* pkgid,
 
 extern "C" EXPORT_API int _certinfo_compare_pkg_certinfo(const char* l_pkgid,
     const char* r_pkgid, pkgmgrinfo_cert_compare_result_type_e* result) {
-  char* query = sqlite3_mprintf("SELECT package, "
-      "COALESCE(author_signer_cert, -1) FROM package_cert_info WHERE "
-      "package IN (%Q, %Q)",
-      l_pkgid, r_pkgid);
-  if (query == nullptr) {
-    LOG(ERROR) << "Out of memory";
-    return PMINFO_R_ERROR;
-  }
-  std::vector<std::string> queries;
-  queries.emplace_back(query);
-  sqlite3_free(query);
-
   std::shared_ptr<pcp::AbstractParcelable> parcelable(
-      new pcp::QueryParcelable(0, queries,
+      new pcp::QueryParcelable(0,
+          { QUERY_INDEX_CERTINFO_COMPARE_PKG_CERTINFO, { l_pkgid, r_pkgid } },
           pcd::AbstractDBHandler::DBType::DB_TYPE_FILE_CERTDB,
           pcd::AbstractDBHandler::OperationType::OPERATION_TYPE_READ));
   pkgmgr_client::PkgInfoClient client(parcelable, 0,
@@ -872,19 +781,9 @@ extern "C" EXPORT_API int _certinfo_compare_pkg_certinfo(const char* l_pkgid,
 extern "C" EXPORT_API int _certinfo_compare_app_certinfo(uid_t uid,
     const char* l_appid, const char* r_appid,
     pkgmgrinfo_cert_compare_result_type_e* result) {
-  char* query = sqlite3_mprintf("SELECT app_id, package FROM "
-                                "package_app_info WHERE app_id IN (%Q, %Q)",
-                                l_appid, r_appid);
-  if (query == nullptr) {
-    LOG(ERROR) << "Out of memory";
-    return PMINFO_R_ERROR;
-  }
-  std::vector<std::string> queries;
-  queries.emplace_back(query);
-  sqlite3_free(query);
-
   std::shared_ptr<pcp::AbstractParcelable> parcelable(
-      new pcp::QueryParcelable(uid, queries,
+      new pcp::QueryParcelable(uid,
+          { QUERY_INDEX_CERTINFO_COMPARE_APP_CERTINFO, { l_appid, r_appid } },
           pcd::AbstractDBHandler::DBType::DB_TYPE_FILE_PKGDB,
           pcd::AbstractDBHandler::OperationType::OPERATION_TYPE_READ));
   pkgmgr_client::PkgInfoClient client(parcelable, uid,
@@ -933,9 +832,18 @@ extern "C" EXPORT_API int _certinfo_compare_app_certinfo(uid_t uid,
 }
 
 extern "C" EXPORT_API int _parser_execute_write_query(
-    const char* query, uid_t uid) {
+    int query_index, const char** query_args, unsigned int arg_cnt, uid_t uid) {
+  std::vector<std::string> args;
+
+  for (unsigned int i = 0; i < arg_cnt; i++) {
+    if (query_args[i])
+      args.push_back(query_args[i]);
+    else
+      args.push_back("");
+  }
+
   std::shared_ptr<pcp::AbstractParcelable> parcelable(
-      new pcp::QueryParcelable(uid, query,
+      new pcp::QueryParcelable(uid, { query_index, std::move(args) },
           pcd::AbstractDBHandler::DBType::DB_TYPE_FILE_PKGDB,
           pcd::AbstractDBHandler::OperationType::OPERATION_TYPE_WRITE));
 
@@ -959,18 +867,27 @@ extern "C" EXPORT_API int _parser_execute_write_query(
     LOG(ERROR) << "Invalid parcelable type";
     return -1;
   }
-
   return 0;
 }
 
 extern "C" EXPORT_API int _parser_execute_write_queries(
-    const char** queries, int len, uid_t uid) {
-  std::vector<std::string> query_vt;
-  for (int i = 0; i < len; ++i)
-    query_vt.emplace_back(queries[i]);
+    int query_index, const char*** query_args, unsigned int arg_cnt,
+    unsigned int query_cnt, uid_t uid) {
+  std::vector<std::pair<int, std::vector<std::string>>> queries;
+
+  for (unsigned int i = 0; i < query_cnt; i++) {
+    std::vector<std::string> args;
+    for (unsigned int j = 0; j < arg_cnt; j++) {
+      if (query_args[i][j])
+        args.push_back(query_args[i][j]);
+      else
+        args.push_back("");
+    }
+    queries.push_back({ query_index, std::move(args) });
+  }
 
   std::shared_ptr<pcp::AbstractParcelable> parcelable(
-      new pcp::QueryParcelable(uid, query_vt,
+      new pcp::QueryParcelable(uid, std::move(queries),
           pcd::AbstractDBHandler::DBType::DB_TYPE_FILE_PKGDB,
           pcd::AbstractDBHandler::OperationType::OPERATION_TYPE_WRITE));
 
@@ -1169,19 +1086,9 @@ extern "C" EXPORT_API int _pkginfo_get_certinfo(const char* pkgid,
 }
 
 extern "C" EXPORT_API int _pkginfo_delete_certinfo(const char* pkgid) {
-  char* query = sqlite3_mprintf("UPDATE package_cert_info SET "
-      "package_count = package_count - 1 WHERE package=%Q", pkgid);
-  if (query == nullptr) {
-    LOG(ERROR) << "Out of memory";
-    return PMINFO_R_ERROR;
-  }
-
-  std::vector<std::string> queries;
-  queries.emplace_back(query);
-  sqlite3_free(query);
-
   std::shared_ptr<pcp::AbstractParcelable> parcelable(
-      new pcp::QueryParcelable(0, queries,
+      new pcp::QueryParcelable(0,
+          { QUERY_INDEX_PKGINFO_DELETE_CERTINFO, { pkgid } },
           pcd::AbstractDBHandler::DBType::DB_TYPE_FILE_CERTDB,
           pcd::AbstractDBHandler::OperationType::OPERATION_TYPE_WRITE));
 
index 25536b5..41497ab 100644 (file)
@@ -73,9 +73,11 @@ int _certinfo_compare_pkg_certinfo(const char *l_pkgid, const char *r_pkgid,
 int _certinfo_compare_app_certinfo(uid_t uid, const char *l_appid,
                const char *r_appid, pkgmgrinfo_cert_compare_result_type_e *result);
 
-int _parser_execute_write_query(const char *query, uid_t uid);
+int _parser_execute_write_query(int query_index, const char** query_args,
+               unsigned int arg_cnt, uid_t uid);
 
-int _parser_execute_write_queries(const char **queries, int len, uid_t uid);
+int _parser_execute_write_queries(int query_index, const char*** query_args,
+               unsigned int arg_cnt, unsigned int query_cnt, uid_t uid);
 
 int _parser_insert_manifest_info(manifest_x *mfx, uid_t uid);
 
index 12cbbe6..6ef72dd 100644 (file)
@@ -177,17 +177,24 @@ TEST_F(ParcelTest, ResultParcelable) {
 
 TEST_F(ParcelTest, QueryParcelable) {
   tizen_base::Parcel parcel;
-  std::vector<std::string> query;
-  query.emplace_back("select * from package_info");
+  std::vector<std::pair<int, std::vector<std::string>>> query_args = {
+    { 0, { "arg1", "arg2" } },
+    { 1, { "arg1" } }
+  };
 
-  pp::QueryParcelable origin_parcelable(0, query,
+  pp::QueryParcelable origin_parcelable(0, query_args,
       pcb::AbstractDBHandler::DBType::DB_TYPE_FILE_PKGDB,
       pcb::AbstractDBHandler::OperationType::OPERATION_TYPE_READ);
   pp::QueryParcelable new_parcelable;
   parcel.WriteParcelable(origin_parcelable);
   parcel.ReadParcelable(&new_parcelable);
 
-  EXPECT_EQ(origin_parcelable.GetQueries(), new_parcelable.GetQueries());
+  EXPECT_EQ(origin_parcelable.GetQueryArgs().size(), new_parcelable.GetQueryArgs().size());
+  EXPECT_EQ(origin_parcelable.GetQueryArgs()[0].first, new_parcelable.GetQueryArgs()[0].first);
+  EXPECT_EQ(origin_parcelable.GetQueryArgs()[1].first, new_parcelable.GetQueryArgs()[1].first);
+  EXPECT_EQ(origin_parcelable.GetQueryArgs()[0].second[0], new_parcelable.GetQueryArgs()[0].second[0]);
+  EXPECT_EQ(origin_parcelable.GetQueryArgs()[0].second[1], new_parcelable.GetQueryArgs()[0].second[1]);
+  EXPECT_EQ(origin_parcelable.GetQueryArgs()[1].second[0], new_parcelable.GetQueryArgs()[1].second[0]);
   EXPECT_EQ(origin_parcelable.GetDBType(), new_parcelable.GetDBType());
   EXPECT_EQ(origin_parcelable.GetOpType(), new_parcelable.GetOpType());
 }