Fix getting information
[platform/core/appfw/pkgmgr-info.git] / src / common / database / pkg_get_db_handler.cc
index 2b822de..8752a20 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);
+
+  return true;
+}
+
+void __free_packages(gpointer data) {
+  pkgmgrinfo_basic_free_package((package_x*)data);
 }
 
 }  // namespace
@@ -56,23 +62,26 @@ 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;
+  int ret = PMINFO_R_OK;
   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) {
-      g_hash_table_destroy(list);
-      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 (g_hash_table_size(list) == 0)
+    ret = PMINFO_R_ENOENT;
+
+  if (ret == PMINFO_R_OK)
+    g_hash_table_foreach_steal(list, _move_func, &handle_list_);
 
+  g_hash_table_destroy(list);
   return ret;
 }