Update pkg get db handler implementation
authorJunghyun Yeon <jungh.yeon@samsung.com>
Thu, 11 Mar 2021 04:02:35 +0000 (13:02 +0900)
committer연정현/Tizen Platform Lab(SR)/Staff Engineer/삼성전자 <jungh.yeon@samsung.com>
Thu, 11 Mar 2021 05:45:23 +0000 (14:45 +0900)
Signed-off-by: Junghyun Yeon <jungh.yeon@samsung.com>
src/common/database/pkg_get_db_handler.cc
src/pkginfo_internal.c
src/pkgmgrinfo_internal.h

index e93d4c2..382a279 100644 (file)
 
 namespace {
 
-void _move(gpointer key, gpointer value, gpointer user_data) {
+gboolean _move_func(gpointer key, gpointer value, gpointer user_data) {
   package_x* appinfo = static_cast<package_x*>(value);
   std::vector<package_x*>* app_list =
       static_cast<std::vector<package_x*>*>(user_data);
   app_list->emplace_back(appinfo);
+
+  _LOGE("jungh move pkgid[%s]", appinfo->package);
+  return true;
+}
+
+void __free_packages(gpointer data) {
+  pkgmgrinfo_basic_free_package((package_x*)data);
 }
 
 }  // namespace
@@ -56,21 +63,22 @@ int PkgGetDBHandler::Execute() {
     return PMINFO_R_ERROR;
   }
 
-  // TODO: db handle should be delivered
-  GHashTable* list;
+  GHashTable* list = g_hash_table_new_full(g_str_hash, g_str_equal,
+      NULL, __free_packages);
   std::vector<sqlite3*> conn_list = GetConnection();
   int ret;
   for (auto& conn : conn_list) {
     ret = pkginfo_internal_filter_get_list(conn, filter_, uid_,
-                                            GetLocale().c_str(), &list);
+                                            GetLocale().c_str(), list);
     if (ret == PMINFO_R_ERROR)
-      return ret;
+      _LOGE("Failed to pkginfo_internal_filter_get_list (%d)", ret);
+      break;
   }
 
-  // TODO: possible memory leak?
-  g_hash_table_foreach(list, _move, &handle_list_);
-  g_hash_table_destroy(list);
+  if (ret == PMINFO_R_OK)
+    g_hash_table_foreach_steal(list, _move_func, &handle_list_);
 
+  g_hash_table_destroy(list);
   return ret;
 }
 
index a06c5d9..27ccc4b 100644 (file)
@@ -92,14 +92,6 @@ do {                                                                           \
 #define XXHDPI_MIN 481
 #define XXHDPI_MAX 600
 
-static int __free_packages(gpointer key, gpointer value,
-               gpointer user_data)
-{
-       pkgmgrinfo_basic_free_package((package_x *)value);
-
-       return 0;
-}
-
 static const char join_localized_info[] =
        " LEFT OUTER JOIN package_localized_info"
        "  ON pi.package=package_localized_info.package"
@@ -630,8 +622,7 @@ catch:
 
 API int pkginfo_internal_filter_get_list(
                sqlite3 *db, pkgmgrinfo_pkginfo_filter_h filter,
-               uid_t uid, const char *locale, GHashTable **pkginfo_list) {
-       GHashTable *list;
+               uid_t uid, const char *locale, GHashTable *pkginfo_list) {
        int ret;
 
        if (filter == NULL || pkginfo_list == NULL) {
@@ -639,24 +630,18 @@ API int pkginfo_internal_filter_get_list(
                return PMINFO_R_EINVAL;
        }
 
-       list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
-                       NULL);
-       if (list == NULL)
-               return PMINFO_R_ERROR;
-
        ret = _pkginfo_get_packages(db, uid, locale, filter,
-                       PMINFO_PKGINFO_GET_ALL, list);
+                       PMINFO_PKGINFO_GET_ALL, pkginfo_list);
        if (ret == PMINFO_R_OK && uid != GLOBAL_USER)
                ret = _pkginfo_get_packages(db, GLOBAL_USER, locale, filter,
-                               PMINFO_PKGINFO_GET_ALL, list);
+                               PMINFO_PKGINFO_GET_ALL, pkginfo_list);
 
-       if (ret != PMINFO_R_OK) {
-               g_hash_table_foreach_remove(list, __free_packages, NULL);
-               g_hash_table_destroy(list);
+       if (ret == PMINFO_R_ERROR)
                return ret;
-       }
 
-       *pkginfo_list = list;
+       if (!g_hash_table_size(pkginfo_list))
+               return PMINFO_R_ENOENT;
+
        return PMINFO_R_OK;
 }
 
index 5ec49aa..448c7b2 100644 (file)
@@ -32,7 +32,7 @@ extern "C" {
 #endif
 
 // TODO: should we get sqlite handle as parameter??
-int pkginfo_internal_filter_get_list(sqlite3 *db, pkgmgrinfo_pkginfo_filter_h filter, uid_t uid, const char *locale, GHashTable **list);
+int pkginfo_internal_filter_get_list(sqlite3 *db, pkgmgrinfo_pkginfo_filter_h filter, uid_t uid, const char *locale, GHashTable *list);
 int appinfo_internal_filter_get_list(sqlite3 *db, pkgmgrinfo_appinfo_filter_h filter, uid_t uid, const char *locale, GHashTable *list);
 int certinfo_internal_get(sqlite3 *db, const char *pkgid, uid_t uid, pkgmgrinfo_certinfo_h certinfo);
 int certinfo_internal_set(sqlite3 *db, const char *pkgid, pkgmgrinfo_instcertinfo_h handle, uid_t uid);