Fix static analysis issue
[platform/core/appfw/pkgmgr-info.git] / src / server / appinfo_internal.cc
index ad790a4..d6f2359 100644 (file)
 
 namespace {
 
-void __parse_appcontrol(GList** appcontrol,
-    char* appcontrol_str, char* visibility, char* id) {
+char* GetCString(int idx, const tizen_base::Database::Result::Record& rec) {
+  std::optional<std::string> str = rec.GetString(idx);
+  if (!str)
+    return nullptr;
+
+  return strdup(str->c_str());
+}
+
+void ParseAppControl(GList** appcontrol,
+    const char* appcontrol_str, const char* visibility, const char* id) {
   char* dup;
   char* token;
   char* ptr = nullptr;
@@ -75,217 +83,142 @@ void __parse_appcontrol(GList** appcontrol,
   free(dup);
 }
 
-int _appinfo_get_splashscreens(sqlite3* db,
+int GetSplashScreens(const tizen_base::Database& db,
     const char* appid, GList** splashscreens) {
-  static const char query_raw[] =
+  auto q = std::move(tizen_base::Database::Sql(
       "SELECT src, type, orientation, indicatordisplay, "
       "operation, color_depth "
-      "FROM package_app_splash_screen WHERE app_id=%Q";
-  int ret;
-  char* query;
-  sqlite3_stmt* stmt;
-  int idx;
-  splashscreen_x* info;
-
-  query = sqlite3_mprintf(query_raw, appid);
-  if (query == nullptr) {
-    LOGE("out of memory");
-    return PMINFO_R_ERROR;
-  }
+      "FROM package_app_splash_screen WHERE app_id=?")
+      .Bind(appid));
 
-  ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, nullptr);
-  sqlite3_free(query);
-  if (ret != SQLITE_OK) {
-    LOGE("prepare failed: %s", sqlite3_errmsg(db));
+  auto r = db.Exec(q);
+  if (!r) {
+    _LOGE("db.Exec() failed: %s", static_cast<const char*>(r));
     return PMINFO_R_ERROR;
   }
 
-  while (sqlite3_step(stmt) == SQLITE_ROW) {
-    info = static_cast<splashscreen_x*>(calloc(1, sizeof(splashscreen_x)));
+  for (const auto& rec : r) {
+    splashscreen_x* info = static_cast<splashscreen_x*>(
+        calloc(1, sizeof(splashscreen_x)));
     if (info == nullptr) {
       LOGE("out of memory");
-      sqlite3_finalize(stmt);
       return PMINFO_R_ERROR;
     }
-    idx = 0;
-    _save_column_str(stmt, idx++, &info->src);
-    _save_column_str(stmt, idx++, &info->type);
-    _save_column_str(stmt, idx++, &info->orientation);
-    _save_column_str(stmt, idx++, &info->indicatordisplay);
-    _save_column_str(stmt, idx++, &info->operation);
-    _save_column_str(stmt, idx++, &info->color_depth);
+
+    int idx = 0;
+    info->src = GetCString(idx++, rec);
+    info->type = GetCString(idx++, rec);
+    info->orientation = GetCString(idx++, rec);
+    info->indicatordisplay = GetCString(idx++, rec);
+    info->operation = GetCString(idx++, rec);
+    info->color_depth = GetCString(idx++, rec);
     *splashscreens = g_list_prepend(*splashscreens, info);
   }
 
-  sqlite3_finalize(stmt);
-
   return PMINFO_R_OK;
 }
 
-int _appinfo_get_metadata(sqlite3* db,
+int GetMetadata(const tizen_base::Database& db,
     const char* appid, GList** metadata) {
-  static const char query_raw[] =
+  auto q = std::move(tizen_base::Database::Sql(
       "SELECT md_key, md_value "
-      "FROM package_app_app_metadata WHERE app_id=%Q";
-  int ret;
-  char* query;
-  sqlite3_stmt* stmt;
-  int idx;
-  metadata_x* info;
-
-  query = sqlite3_mprintf(query_raw, appid);
-  if (query == nullptr) {
-    LOGE("out of memory");
-    return PMINFO_R_ERROR;
-  }
+      "FROM package_app_app_metadata WHERE app_id=?")
+      .Bind(appid));
 
-  ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, nullptr);
-  sqlite3_free(query);
-  if (ret != SQLITE_OK) {
-    LOGE("prepare failed: %s", sqlite3_errmsg(db));
+  auto r = db.Exec(q);
+  if (!r) {
+    _LOGE("db.Exec() failed: %s", static_cast<const char*>(r));
     return PMINFO_R_ERROR;
   }
 
-  while (sqlite3_step(stmt) == SQLITE_ROW) {
-    info = static_cast<metadata_x*>(calloc(1, sizeof(metadata_x)));
+  for (const auto& rec : r) {
+    metadata_x* info = static_cast<metadata_x*>(
+        calloc(1, sizeof(metadata_x)));
     if (info == nullptr) {
       LOGE("out of memory");
-      sqlite3_finalize(stmt);
       return PMINFO_R_ERROR;
     }
-    idx = 0;
-    _save_column_str(stmt, idx++, &info->key);
-    _save_column_str(stmt, idx++, &info->value);
+
+    int idx = 0;
+    info->key = GetCString(idx++, rec);
+    info->value = GetCString(idx++, rec);
     *metadata = g_list_prepend(*metadata, info);
   }
 
-  sqlite3_finalize(stmt);
-
   return PMINFO_R_OK;
 }
 
-int _appinfo_get_app_control(sqlite3* db,
+int GetAppControl(const tizen_base::Database& db,
     const char* appid, GList** appcontrol) {
-  static const char query_raw[] =
+  auto q = std::move(tizen_base::Database::Sql(
       "SELECT app_control, visibility, app_control_id "
-      "FROM package_app_app_control WHERE app_id=%Q";
-  int ret;
-  int idx;
-  char *query;
-  sqlite3_stmt *stmt;
-  char *str;
-  char *visibility;
-  char *id;
-
-  query = sqlite3_mprintf(query_raw, appid);
-  if (query == nullptr) {
-    LOGE("out of memory");
-    return PMINFO_R_ERROR;
-  }
+      "FROM package_app_app_control WHERE app_id=?")
+      .Bind(appid));
 
-  ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, nullptr);
-  sqlite3_free(query);
-  if (ret != SQLITE_OK) {
-    LOGE("prepare failed: %s", sqlite3_errmsg(db));
+  auto r = db.Exec(q);
+  if (!r) {
+    _LOGE("db.Exec() failed: %s", static_cast<const char*>(r));
     return PMINFO_R_ERROR;
   }
 
-  while (sqlite3_step(stmt) == SQLITE_ROW) {
-    str = nullptr;
-    visibility = nullptr;
-    id = nullptr;
-    idx = 0;
-    _save_column_str(stmt, idx++, &str);
-    _save_column_str(stmt, idx++, &visibility);
-    _save_column_str(stmt, idx++, &id);
-    /* TODO: revise */
-    __parse_appcontrol(appcontrol, str, visibility, id);
-    free(str);
-    free(visibility);
-    free(id);
+  for (const auto& rec : r) {
+    ParseAppControl(appcontrol, rec.GetString(0)->c_str(),
+        rec.GetString(1)->c_str(), rec.GetString(2)->c_str());
   }
 
-  sqlite3_finalize(stmt);
-
   return PMINFO_R_OK;
 }
 
-int _appinfo_get_category(sqlite3* db,
+int GetCategory(const tizen_base::Database& db,
     const char* appid, GList** category) {
-  static const char query_raw[] =
+  auto q = std::move(tizen_base::Database::Sql(
       "SELECT category "
-      "FROM package_app_app_category WHERE app_id=%Q";
-  int ret;
-  char* query;
-  sqlite3_stmt* stmt;
-  char* val;
-
-  query = sqlite3_mprintf(query_raw, appid);
-  if (query == nullptr) {
-    LOGE("out of memory");
-    return PMINFO_R_ERROR;
-  }
-
-  ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, nullptr);
-  sqlite3_free(query);
-  if (ret != SQLITE_OK) {
-    LOGE("prepare failed: %s", sqlite3_errmsg(db));
+      "FROM package_app_app_category WHERE app_id=?")
+      .Bind(appid));
+  auto r = db.Exec(q);
+  if (!r) {
+    _LOGE("db.Exec() failed: %s", static_cast<const char*>(r));
     return PMINFO_R_ERROR;
   }
 
-  while (sqlite3_step(stmt) == SQLITE_ROW) {
-    val = nullptr;
-    _save_column_str(stmt, 0, &val);
+  for (const auto& rec : r) {
+    char* val = GetCString(0, rec);
     if (val)
       *category = g_list_prepend(*category, (gpointer)val);
   }
 
-  sqlite3_finalize(stmt);
-
   return PMINFO_R_OK;
 }
 
-int _appinfo_get_res_control(sqlite3* db, const char* appid,
+int GetResControl(const tizen_base::Database& db, const char* appid,
     GList** res_control) {
-  static const char query_raw[] =
-    "SELECT res_type, min_res_version, max_res_version, auto_close "
-    "FROM package_app_res_control WHERE app_id=%Q";
-  int ret;
-  char* query;
-  sqlite3_stmt* stmt;
-  int idx;
-  res_control_x* info;
-
-  query = sqlite3_mprintf(query_raw, appid);
-  if (query == nullptr) {
-    LOGE("out of memory");
+  auto q = std::move(tizen_base::Database::Sql(
+      "SELECT res_type, min_res_version, max_res_version, auto_close "
+      "FROM package_app_res_control WHERE app_id=?")
+      .Bind(appid));
+
+  auto r = db.Exec(q);
+  if (!r) {
+    _LOGE("db.Exec() failed: %s", static_cast<const char*>(r));
     return PMINFO_R_ERROR;
   }
 
-  ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, nullptr);
-  sqlite3_free(query);
-  if (ret != SQLITE_OK) {
-    LOGE("prepare failed: %s", sqlite3_errmsg(db));
-    return PMINFO_R_ERROR;
-  }
-
-  while (sqlite3_step(stmt) == SQLITE_ROW) {
-    info = static_cast<res_control_x*>(calloc(1, sizeof(res_control_x)));
+  for (const auto& rec : r) {
+    res_control_x* info = static_cast<res_control_x*>(
+        calloc(1, sizeof(res_control_x)));
     if (info == nullptr) {
       LOGE("out of memory");
-      sqlite3_finalize(stmt);
       return PMINFO_R_ERROR;
     }
-    idx = 0;
-    _save_column_str(stmt, idx++, &info->res_type);
-    _save_column_str(stmt, idx++, &info->min_res_version);
-    _save_column_str(stmt, idx++, &info->max_res_version);
-    _save_column_str(stmt, idx++, &info->auto_close);
+
+    int idx = 0;
+    info->res_type = GetCString(idx++, rec);
+    info->min_res_version = GetCString(idx++, rec);
+    info->max_res_version = GetCString(idx++, rec);
+    info->auto_close = GetCString(idx++, rec);
     *res_control = g_list_prepend(*res_control, info);
   }
 
-  sqlite3_finalize(stmt);
-
   return PMINFO_R_OK;
 }
 
@@ -338,26 +271,6 @@ GList* __get_background_category(const char* value) {
   return category_list;
 }
 
-int __bind_params(sqlite3_stmt* stmt, GList* params) {
-  GList* tmp_list = nullptr;
-  int idx = 0;
-  int ret;
-
-  if (stmt == nullptr || params == nullptr)
-    return PMINFO_R_EINVAL;
-
-  tmp_list = params;
-  while (tmp_list) {
-    ret = sqlite3_bind_text(stmt, ++idx,
-        (char*)tmp_list->data, -1, SQLITE_STATIC);
-    if (ret != SQLITE_OK)
-      return PMINFO_R_ERROR;
-    tmp_list = tmp_list->next;
-  }
-
-  return PMINFO_R_OK;
-}
-
 constexpr const char join_localized_info[] =
     " LEFT OUTER JOIN package_app_localized_info"
     " ON ai.app_id=package_app_localized_info.app_id"
@@ -375,19 +288,15 @@ constexpr const char join_privilege[] =
     " LEFT OUTER JOIN package_privilege_info"
     " ON ai.package=package_privilege_info.package ";
 
-int _get_filtered_query(pkgmgrinfo_filter_x* filter, const char* locale,
-    uid_t uid, char** query, GList** bind_params) {
+int GetFilteredQuery(pkgmgrinfo_filter_x* filter, const char* locale,
+    uid_t uid, std::string& query, std::list<std::string>& bind_params) {
   int joined = 0;
-  int size;
   char* condition = nullptr;
-  char buf[MAX_QUERY_LEN] = {'\0'};
-  char tmp_query[MAX_QUERY_LEN] = {'\0'};
-  GSList* list;
 
   if (!filter)
     return PMINFO_R_OK;
 
-  if (g_slist_length(filter->list) == 0) {
+  if (filter->cache_flag) {
     joined = E_PMINFO_APPINFO_JOIN_LOCALIZED_INFO |
       E_PMINFO_APPINFO_JOIN_CATEGORY |
       E_PMINFO_APPINFO_JOIN_APP_CONTROL |
@@ -395,60 +304,56 @@ int _get_filtered_query(pkgmgrinfo_filter_x* filter, const char* locale,
       E_PMINFO_APPINFO_JOIN_PRIVILEGE;
   }
 
-  strncat(buf, " WHERE 1=1", sizeof(buf) - strlen(buf) - 1);
-
-  for (list = filter->list; list; list = list->next) {
+  std::string buf = " WHERE 1=1";
+  GList* tmp_params = nullptr;
+  for (GSList* list = filter->list; list; list = list->next) {
     joined |= __get_filter_condition(list->data,
-        uid, &condition, bind_params);
+        uid, &condition, &tmp_params);
     if (condition == nullptr)
       continue;
 
-    strncat(buf, " AND ", sizeof(buf) - strlen(buf) - 1);
-
-    strncat(buf, condition, sizeof(buf) - strlen(buf) - 1);
+    buf += " AND ";
+    buf += condition;
     free(condition);
     condition = nullptr;
   }
 
   if (filter->list_metadata)
-    strncat(buf, " AND (", sizeof(buf) - strlen(buf) - 1);
-  for (list = filter->list_metadata; list; list = list->next) {
+    buf += " AND (";
+  for (GSList* list = filter->list_metadata; list; list = list->next) {
     joined |= __get_metadata_filter_condition(list->data,
-        &condition, bind_params);
+        &condition, &tmp_params);
     if (condition == nullptr)
       continue;
-    strncat(buf, condition, sizeof(buf) - strlen(buf) - 1);
+    buf += condition;
     free(condition);
     condition = nullptr;
-
-    strncat(buf, " OR ", sizeof(buf) - strlen(buf) - 1);
+    buf += " OR ";
   }
+
   if (filter->list_metadata)
-    strncat(buf, "1=0)", sizeof(buf) - strlen(buf) - 1);
+    buf += "1=0)";
 
+  std::string tmp_query;
   if (joined & E_PMINFO_APPINFO_JOIN_LOCALIZED_INFO) {
-    strncat(tmp_query, join_localized_info,
-        sizeof(tmp_query) - strlen(tmp_query) - 1);
-    *bind_params = g_list_append(*bind_params, strdup(locale));
+    tmp_query += join_localized_info;
+    bind_params.push_back(locale);
   }
+
   if (joined & E_PMINFO_APPINFO_JOIN_CATEGORY)
-    strncat(tmp_query, join_category,
-        sizeof(tmp_query) - strlen(tmp_query) - 1);
+    tmp_query += join_category;
   if (joined & E_PMINFO_APPINFO_JOIN_APP_CONTROL)
-    strncat(tmp_query, join_app_control,
-        sizeof(tmp_query) - strlen(tmp_query) - 1);
+    tmp_query += join_app_control;
   if (joined & E_PMINFO_APPINFO_JOIN_METADATA)
-    strncat(tmp_query, join_metadata,
-        sizeof(tmp_query) - strlen(tmp_query) - 1);
+    tmp_query += join_metadata;
   if (joined & E_PMINFO_APPINFO_JOIN_PRIVILEGE)
-    strncat(tmp_query, join_privilege,
-        sizeof(tmp_query) - strlen(tmp_query) - 1);
+    tmp_query += join_privilege;
 
-  size = strlen(tmp_query) + strlen(buf) + 1;
-  *query = static_cast<char*>(calloc(1, size));
-  if (*query == nullptr)
-    return PMINFO_R_ERROR;
-  snprintf(*query, size, "%s%s", tmp_query, buf);
+  for (GList* l = tmp_params; l != nullptr; l = l->next)
+    bind_params.push_back(reinterpret_cast<char*>(l->data));
+
+  query = tmp_query + buf;
+  g_list_free_full(tmp_params, free);
 
   return PMINFO_R_OK;
 }
@@ -461,6 +366,9 @@ bool __check_app_storage_status(pkgmgrinfo_filter_x* tmp_filter) {
   if (tmp_filter == nullptr)
     return true;
 
+  if (tmp_filter->cache_flag)
+    return false;
+
   property = _pminfo_appinfo_convert_to_prop_bool(
       PMINFO_APPINFO_PROP_APP_CHECK_STORAGE);
   for (tmp_list = tmp_filter->list; tmp_list != nullptr;
@@ -477,12 +385,89 @@ bool __check_app_storage_status(pkgmgrinfo_filter_x* tmp_filter) {
   return true;
 }
 
-int _appinfo_get_applications(sqlite3* db, uid_t db_uid, uid_t uid,
+enum class PackageDisableFilterStatus {
+  None,
+  True,
+  False
+};
+
+PackageDisableFilterStatus GetPackageDisableFilterStatus(
+    const pkgmgrinfo_filter_x* filter) {
+  GSList* tmp_list = nullptr;
+  pkgmgrinfo_node_x* tmp_node = nullptr;
+  int property = -1;
+
+  property = _pminfo_appinfo_convert_to_prop_bool(
+        PMINFO_APPINFO_PROP_PKG_DISABLE);
+  for (tmp_list = filter->list; tmp_list != nullptr;
+      tmp_list = g_slist_next(tmp_list)) {
+    tmp_node = reinterpret_cast<pkgmgrinfo_node_x*>(tmp_list->data);
+    if (property != tmp_node->prop)
+      continue;
+
+    return strcasecmp(tmp_node->value, "true") == 0 ?
+        PackageDisableFilterStatus::True : PackageDisableFilterStatus::False;
+  }
+
+  return PackageDisableFilterStatus::None;
+}
+
+bool CheckPkgDisableFilter(PackageDisableFilterStatus expected,
+    const char* package_disable, application_x* app_info) {
+  if (!package_disable)
+    return true;
+
+  PackageDisableFilterStatus result = strcasecmp(package_disable, "true") == 0 ?
+      PackageDisableFilterStatus::True : PackageDisableFilterStatus::False;
+
+  if (expected == result)
+    return true;
+
+  if (result == PackageDisableFilterStatus::True)
+    LOGW("The package [%s] to which the application [%s] belongs is disabled",
+        app_info->package, app_info->appid);
+
+  return false;
+}
+
+bool CheckAppDisableFilter(const pkgmgrinfo_filter_x* filter,
+    const application_x* app_info) {
+  GSList* tmp_list = nullptr;
+  pkgmgrinfo_node_x* tmp_node = nullptr;
+  int property = -1;
+
+  property = _pminfo_appinfo_convert_to_prop_bool(
+        PMINFO_APPINFO_PROP_APP_DISABLE);
+  for (tmp_list = filter->list; tmp_list != nullptr;
+      tmp_list = g_slist_next(tmp_list)) {
+    tmp_node = reinterpret_cast<pkgmgrinfo_node_x*>(tmp_list->data);
+    if (property != tmp_node->prop)
+      continue;
+
+    if (strcasecmp(tmp_node->value, app_info->is_disabled) == 0)
+      return true;
+
+    if (strcasecmp(app_info->is_disabled, "true") == 0)
+      LOGW("The application [%s] is disabled", app_info->appid);
+
+    return false;
+  }
+  return true;
+}
+
+int DoGetAppInfo(const tizen_base::Database& db, uid_t db_uid, uid_t uid,
     const char* locale, pkgmgrinfo_filter_x* filter, int flag,
     std::vector<std::shared_ptr<application_x>>& applications) {
   static const char query_raw[] =
       "SELECT DISTINCT ai.app_id, ai.app_installed_storage, "
       "ai.app_external_path";
+  static const char query_app_disable[] = ", "
+      "CASE "
+        "WHEN ai.app_disable='true' COLLATE NOCASE OR "
+          "ui.is_disabled='true' COLLATE NOCASE "
+        "THEN 'true' "
+        "ELSE 'false' "
+      "END AS app_disable";
   static const char query_basic[] =
       ", ai.app_component, ai.app_exec, "
       "ai.app_nodisplay, ai.app_type, ai.app_onboot, "
@@ -496,7 +481,7 @@ int _appinfo_get_applications(sqlite3* db, uid_t db_uid, uid_t uid,
       "ai.app_support_disable, ai.app_process_pool, "
       "ai.app_background_category, ai.app_package_type, "
       "ai.app_root_path, ai.app_api_version, ai.app_effective_appid, "
-      "ai.app_disable, ai.app_splash_screen_display, ai.app_tep_name, "
+      "ai.app_splash_screen_display, ai.app_tep_name, "
       "ai.app_zip_mount_file, ai.component_type, ai.package, "
       "ai.app_package_system, ai.app_removable, "
       "ai.app_package_installed_time, ai.app_support_mode, "
@@ -515,143 +500,133 @@ int _appinfo_get_applications(sqlite3* db, uid_t db_uid, uid_t uid,
       "AND app_locale=?), "
       "(SELECT app_icon FROM package_app_localized_info WHERE ai.app_id=app_id "
       "AND app_locale='No Locale'))";
+  static const char query_package_disable[] =
+      ", (SELECT package_disable FROM package_info WHERE ai.package=package)";
   static const char query_from_clause[] = " FROM package_app_info as ai";
   static const char query_uid_info_clause[] =
       " LEFT OUTER JOIN package_app_info_for_uid AS ui "
       "ON (ai.app_id=ui.app_id AND ui.uid=?)";
-  int ret = PMINFO_R_ERROR;
-  int idx;
   char* bg_category_str = nullptr;
-  char* constraint = nullptr;
   char* tmp_record = nullptr;
-  char query[MAX_QUERY_LEN] = {'\0'};
-  char buf[BUFSIZE] = {'\0'};
-  application_x* info = nullptr;
-  GList* bind_params = nullptr;
-  sqlite3_stmt* stmt = nullptr;
+  std::list<std::string> bind_params;
   bool is_check_storage = true;
   const uid_t global_user_uid = GLOBAL_USER;
+  std::string query = query_raw;
+  auto pkg_disable_filter_status = GetPackageDisableFilterStatus(filter);
 
-  snprintf(query, MAX_QUERY_LEN - 1, "%s", query_raw);
+  query += query_app_disable;
 
   if (flag & PMINFO_APPINFO_GET_BASICINFO) {
-    strncat(query, query_basic, sizeof(query) - strlen(query) - 1);
-    strncat(query, query_uid_info,
-        sizeof(query) - strlen(query) - 1);
+    query += query_basic;
+    query += query_uid_info;
   }
+
   if (flag & PMINFO_APPINFO_GET_LABEL) {
-    strncat(query, query_label, sizeof(query) - strlen(query) - 1);
-    bind_params = g_list_append(bind_params, strdup(locale));
+    query += query_label;
+    bind_params.push_back(locale);
   }
+
   if (flag & PMINFO_APPINFO_GET_ICON) {
-    strncat(query, query_icon, sizeof(query) - strlen(query) - 1);
-    bind_params = g_list_append(bind_params, strdup(locale));
+    query += query_icon;
+    bind_params.push_back(locale);
   }
 
-  snprintf(buf, MAX_QUERY_LEN - 1, "%d", uid);
-  bind_params = g_list_append(bind_params, strdup(buf));
+  if (pkg_disable_filter_status != PackageDisableFilterStatus::None)
+    query += query_package_disable;
 
+  bind_params.push_back(std::to_string(uid));
   is_check_storage = __check_app_storage_status(filter);
 
-  ret = _get_filtered_query(filter, locale,
-      uid, &constraint, &bind_params);
+  std::string constraint;
+  int ret = GetFilteredQuery(filter, locale, uid, constraint, bind_params);
   if (ret != PMINFO_R_OK) {
     LOGE("Failed to get WHERE clause");
-    goto __catch;
+    return PMINFO_R_ERROR;
   }
-  strncat(query, query_from_clause, sizeof(query) - strlen(query) - 1);
 
-  strncat(query, query_uid_info_clause,
-      sizeof(query) - strlen(query) - 1);
+  query += query_from_clause;
+  query += query_uid_info_clause;
 
-  if (constraint)
-    strncat(query, constraint, sizeof(query) - strlen(query) - 1);
+  if (!constraint.empty())
+    query += constraint;
 
-  ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, nullptr);
-  if (ret != SQLITE_OK) {
-    LOGE("prepare failed: %s", sqlite3_errmsg(db));
-    ret = PMINFO_R_ERROR;
-    goto __catch;
-  }
+  auto q = tizen_base::Database::Sql(query);
+  for (auto& i : bind_params)
+    q.Bind(std::move(i));
 
-  if (g_list_length(bind_params) != 0) {
-    ret = __bind_params(stmt, bind_params);
-    if (ret != SQLITE_OK) {
-      LOGE("Failed to bind parameters");
-      goto __catch;
-    }
+  auto r = db.Exec(q);
+  if (!r) {
+    _LOGE("db.Exec() failed: %s", static_cast<const char*>(r));
+    return PMINFO_R_ERROR;
   }
 
-  while (sqlite3_step(stmt) == SQLITE_ROW) {
-    info = static_cast<application_x*>(calloc(1, sizeof(application_x)));
+  for (const auto& rec : r) {
+    application_x* info = static_cast<application_x*>(
+        calloc(1, sizeof(application_x)));
     if (info == nullptr) {
       LOGE("out of memory");
-      ret = PMINFO_R_ERROR;
-      goto __catch;
+      return PMINFO_R_ERROR;
     }
+    std::shared_ptr<application_x> info_auto(info,
+        pkgmgrinfo_basic_free_application);
+
     info->locale = strdup(locale);
     if (info->locale == nullptr) {
       LOGE("Out of memory");
-      ret = PMINFO_R_ERROR;
-      goto __catch;
+      return PMINFO_R_ERROR;
     }
 
-    idx = 0;
-    _save_column_str(stmt, idx++, &info->appid);
-    _save_column_str(stmt, idx++, &info->installed_storage);
-    _save_column_str(stmt, idx++, &info->external_path);
-
+    int idx = 0;
+    info->appid = GetCString(idx++, rec);
+    info->installed_storage = GetCString(idx++, rec);
+    info->external_path = GetCString(idx++, rec);
+    info->is_disabled = GetCString(idx++, rec);
     if (flag & PMINFO_APPINFO_GET_BASICINFO) {
-      _save_column_str(stmt, idx++, &info->component);
-      _save_column_str(stmt, idx++, &info->exec);
-      _save_column_str(stmt, idx++, &info->nodisplay);
-      _save_column_str(stmt, idx++, &info->type);
-      _save_column_str(stmt, idx++, &info->onboot);
-      _save_column_str(stmt, idx++, &info->multiple);
-      _save_column_str(stmt, idx++, &info->autorestart);
-      _save_column_str(stmt, idx++, &info->taskmanage);
-      _save_column_str(stmt, idx++, &info->hwacceleration);
-      _save_column_str(stmt, idx++, &info->screenreader);
-      _save_column_str(stmt, idx++, &info->mainapp);
-      _save_column_str(stmt, idx++, &info->recentimage);
-      _save_column_str(stmt, idx++, &info->launchcondition);
-      _save_column_str(stmt, idx++, &info->indicatordisplay);
-      _save_column_str(stmt, idx++, &info->portraitimg);
-      _save_column_str(stmt, idx++, &info->landscapeimg);
-      _save_column_str(stmt, idx++,
-          &info->guestmode_visibility);
-      _save_column_str(stmt, idx++, &info->permission_type);
-      _save_column_str(stmt, idx++, &info->preload);
-      _save_column_str(stmt, idx++, &info->submode);
-      _save_column_str(stmt, idx++, &info->submode_mainid);
-      _save_column_str(stmt, idx++, &info->launch_mode);
-      _save_column_str(stmt, idx++, &info->ui_gadget);
-      _save_column_str(stmt, idx++, &info->support_disable);
-      _save_column_str(stmt, idx++, &info->process_pool);
-      _save_column_str(stmt, idx++, &bg_category_str);
-      _save_column_str(stmt, idx++, &info->package_type);
-      _save_column_str(stmt, idx++, &info->root_path);
-      _save_column_str(stmt, idx++, &info->api_version);
-      _save_column_str(stmt, idx++, &info->effective_appid);
-      _save_column_str(stmt, idx++, &info->is_disabled);
-      _save_column_str(stmt, idx++,
-          &info->splash_screen_display);
-      _save_column_str(stmt, idx++, &info->tep_name);
-      _save_column_str(stmt, idx++, &info->zip_mount_file);
-      _save_column_str(stmt, idx++, &info->component_type);
-      _save_column_str(stmt, idx++, &info->package);
-      _save_column_str(stmt, idx++, &info->package_system);
-      _save_column_str(stmt, idx++, &info->removable);
-      _save_column_str(stmt, idx++,
-          &info->package_installed_time);
-      _save_column_str(stmt, idx++, &info->support_mode);
-      _save_column_str(stmt, idx++, &info->support_ambient);
-      _save_column_str(stmt, idx++, &info->setup_appid);
-      _save_column_str(stmt, idx++, &info->light_user_switch_mode);
+      info->component = GetCString(idx++, rec);
+      info->exec = GetCString(idx++, rec);
+      info->nodisplay = GetCString(idx++, rec);
+      info->type = GetCString(idx++, rec);
+      info->onboot = GetCString(idx++, rec);
+      info->multiple = GetCString(idx++, rec);
+      info->autorestart = GetCString(idx++, rec);
+      info->taskmanage = GetCString(idx++, rec);
+      info->hwacceleration = GetCString(idx++, rec);
+      info->screenreader = GetCString(idx++, rec);
+      info->mainapp = GetCString(idx++, rec);
+      info->recentimage = GetCString(idx++, rec);
+      info->launchcondition = GetCString(idx++, rec);
+      info->indicatordisplay = GetCString(idx++, rec);
+      info->portraitimg = GetCString(idx++, rec);
+      info->landscapeimg = GetCString(idx++, rec);
+      info->guestmode_visibility = GetCString(idx++, rec);
+      info->permission_type = GetCString(idx++, rec);
+      info->preload = GetCString(idx++, rec);
+      info->submode = GetCString(idx++, rec);
+      info->submode_mainid = GetCString(idx++, rec);
+      info->launch_mode = GetCString(idx++, rec);
+      info->ui_gadget = GetCString(idx++, rec);
+      info->support_disable = GetCString(idx++, rec);
+      info->process_pool = GetCString(idx++, rec);
+      bg_category_str = GetCString(idx++, rec);
+      info->package_type = GetCString(idx++, rec);
+      info->root_path = GetCString(idx++, rec);
+      info->api_version = GetCString(idx++, rec);
+      info->effective_appid = GetCString(idx++, rec);
+      info->splash_screen_display = GetCString(idx++, rec);
+      info->tep_name = GetCString(idx++, rec);
+      info->zip_mount_file = GetCString(idx++, rec);
+      info->component_type = GetCString(idx++, rec);
+      info->package = GetCString(idx++, rec);
+      info->package_system = GetCString(idx++, rec);
+      info->removable = GetCString(idx++, rec);
+      info->package_installed_time = GetCString(idx++, rec);
+      info->support_mode = GetCString(idx++, rec);
+      info->support_ambient = GetCString(idx++, rec);
+      info->setup_appid = GetCString(idx++, rec);
+      info->light_user_switch_mode = GetCString(idx++, rec);
       info->background_category = __get_background_category(
             bg_category_str);
       free(bg_category_str);
-      bg_category_str = nullptr;
     }
 
     info->for_all_users =
@@ -661,10 +636,10 @@ int _appinfo_get_applications(sqlite3* db, uid_t db_uid, uid_t uid,
     if (db_uid != global_user_uid) {
       idx = idx + 2;
     } else {
-      tmp_record = nullptr;
-      _save_column_str(stmt, idx++, &tmp_record);
+      tmp_record = GetCString(idx++, rec);
       if (tmp_record != nullptr) {
-        if (strcasecmp(info->is_disabled, "false") == 0 &&
+        if (info->is_disabled &&
+            strcasecmp(info->is_disabled, "false") == 0 &&
             strcasecmp(tmp_record, "false") == 0) {
           free(info->is_disabled);
           info->is_disabled = tmp_record;
@@ -672,10 +647,10 @@ int _appinfo_get_applications(sqlite3* db, uid_t db_uid, uid_t uid,
           free(tmp_record);
         }
       }
-      tmp_record = nullptr;
-      _save_column_str(stmt, idx++, &tmp_record);
+      tmp_record = GetCString(idx++, rec);
       if (tmp_record != nullptr) {
-        if (strcasecmp(info->splash_screen_display, "false") == 0 &&
+        if (info->splash_screen_display &&
+            strcasecmp(info->splash_screen_display, "false") == 0 &&
             strcasecmp(tmp_record, "false") == 0) {
           free(info->splash_screen_display);
           info->splash_screen_display = tmp_record;
@@ -686,91 +661,82 @@ int _appinfo_get_applications(sqlite3* db, uid_t db_uid, uid_t uid,
     }
 
     if (flag & PMINFO_APPINFO_GET_LABEL) {
-      tmp_record = nullptr;
-      _save_column_str(stmt, idx++, &tmp_record);
+      tmp_record = GetCString(idx++, rec);
       if (_add_label_info_into_list(locale, tmp_record,
           &info->label)) {
-        ret = PMINFO_R_ERROR;
-        goto __catch;
+        if (tmp_record)
+          free(tmp_record);
+
+        return PMINFO_R_ERROR;
       }
     }
 
     if (flag & PMINFO_APPINFO_GET_ICON) {
-      tmp_record = nullptr;
-      _save_column_str(stmt, idx++, &tmp_record);
+      tmp_record = GetCString(idx++, rec);
       if (_add_icon_info_into_list(locale, tmp_record,
           &info->icon)) {
-        ret = PMINFO_R_ERROR;
-        goto __catch;
+        if (tmp_record)
+          free(tmp_record);
+
+        return PMINFO_R_ERROR;
       }
     }
 
-    if (flag & PMINFO_APPINFO_GET_CATEGORY) {
-      if (_appinfo_get_category(db, info->appid,
-          &info->category)) {
-        ret = PMINFO_R_ERROR;
-        goto __catch;
+    if (pkg_disable_filter_status != PackageDisableFilterStatus::None) {
+      tmp_record = GetCString(idx++, rec);
+      if (tmp_record) {
+        bool filter_passed = CheckPkgDisableFilter(pkg_disable_filter_status,
+            tmp_record, info);
+        free(tmp_record);
+
+        if (!filter_passed)
+          continue;
       }
     }
 
+    if (flag & PMINFO_APPINFO_GET_CATEGORY) {
+      if (GetCategory(db, info->appid, &info->category))
+        return PMINFO_R_ERROR;
+    }
+
     if (flag & PMINFO_APPINFO_GET_APP_CONTROL) {
-      if (_appinfo_get_app_control(db, info->appid,
-          &info->appcontrol)) {
-        ret = PMINFO_R_ERROR;
-        goto __catch;
-      }
+      if (GetAppControl(db, info->appid, &info->appcontrol))
+        return PMINFO_R_ERROR;
     }
 
     if (flag & PMINFO_APPINFO_GET_METADATA) {
-      if (_appinfo_get_metadata(db, info->appid,
-          &info->metadata)) {
-        ret = PMINFO_R_ERROR;
-        goto __catch;
-      }
+      if (GetMetadata(db, info->appid, &info->metadata))
+        return PMINFO_R_ERROR;
     }
 
     if (flag & PMINFO_APPINFO_GET_SPLASH_SCREEN) {
-      if (_appinfo_get_splashscreens(db, info->appid,
-          &info->splashscreens)) {
-        ret = PMINFO_R_ERROR;
-        goto __catch;
-      }
+      if (GetSplashScreens(db, info->appid, &info->splashscreens))
+        return PMINFO_R_ERROR;
     }
 
     if (flag & PMINFO_APPINFO_GET_RES_CONTROL) {
-      if (_appinfo_get_res_control(db, info->appid,
-          &info->res_control)) {
-        ret = PMINFO_R_ERROR;
-        goto __catch;
-      }
+      if (GetResControl(db, info->appid, &info->res_control))
+        return PMINFO_R_ERROR;
     }
 
     if (is_check_storage &&
         __appinfo_check_installed_storage(info) !=
             PMINFO_R_OK) {
-      ret = PMINFO_R_ERROR;
-      pkgmgrinfo_basic_free_application(info);
-      info = nullptr;
       continue;
     }
 
-    applications.emplace_back(info, pkgmgrinfo_basic_free_application);
-  }
-
-  ret = PMINFO_R_OK;
-
-__catch:
-  sqlite3_finalize(stmt);
-
-  if (constraint)
-    free(constraint);
+    if (!CheckAppDisableFilter(filter, info))
+      continue;
 
-  if (ret != PMINFO_R_OK && info != nullptr)
-    pkgmgrinfo_basic_free_application(info);
+    if (!(flag & PMINFO_APPINFO_GET_BASICINFO) && info->is_disabled) {
+      free(info->is_disabled);
+      info->is_disabled = nullptr;
+    }
 
-  g_list_free_full(bind_params, free);
+    applications.push_back(std::move(info_auto));
+  }
 
-  return ret;
+  return PMINFO_R_OK;
 }
 
 }  // namespace
@@ -778,16 +744,20 @@ __catch:
 namespace pkgmgr_server {
 namespace internal {
 
-API int appinfo_internal_filter_get_list(sqlite3* db,
+API bool CheckAppStorageStatus(pkgmgrinfo_filter_x* tmp_filter) {
+  return ::__check_app_storage_status(tmp_filter);
+}
+
+API int GetAppInfo(const tizen_base::Database& db,
     pkgmgrinfo_appinfo_filter_h filter, uid_t db_uid, uid_t uid,
-    const char* locale,
+    const std::string& locale,
     std::vector<std::shared_ptr<application_x>>& appinfo_list) {
-  if (db == nullptr || filter == nullptr) {
+  if (!static_cast<bool>(db) || filter == nullptr) {
     LOGE("Invalid argument");
     return PMINFO_R_EINVAL;
   }
 
-  return ::_appinfo_get_applications(db, db_uid, uid, locale,
+  return ::DoGetAppInfo(db, db_uid, uid, locale.c_str(),
       static_cast<pkgmgrinfo_filter_x*>(filter), PMINFO_APPINFO_GET_ALL,
       appinfo_list);
 }