From 516cd35c568648c616b2489d5f228341fad5609e Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Thu, 11 Mar 2021 13:02:35 +0900 Subject: [PATCH] Update pkg get db handler implementation Signed-off-by: Junghyun Yeon --- src/common/database/pkg_get_db_handler.cc | 24 ++++++++++++++++-------- src/pkginfo_internal.c | 29 +++++++---------------------- src/pkgmgrinfo_internal.h | 2 +- 3 files changed, 24 insertions(+), 31 deletions(-) diff --git a/src/common/database/pkg_get_db_handler.cc b/src/common/database/pkg_get_db_handler.cc index e93d4c2..382a279 100644 --- a/src/common/database/pkg_get_db_handler.cc +++ b/src/common/database/pkg_get_db_handler.cc @@ -23,11 +23,18 @@ 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(value); std::vector* app_list = static_cast*>(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 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; } diff --git a/src/pkginfo_internal.c b/src/pkginfo_internal.c index a06c5d9..27ccc4b 100644 --- a/src/pkginfo_internal.c +++ b/src/pkginfo_internal.c @@ -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; } diff --git a/src/pkgmgrinfo_internal.h b/src/pkgmgrinfo_internal.h index 5ec49aa..448c7b2 100644 --- a/src/pkgmgrinfo_internal.h +++ b/src/pkgmgrinfo_internal.h @@ -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); -- 2.7.4