From ee651486fa9a1112c466271a7c24a1f78b6f96d3 Mon Sep 17 00:00:00 2001 From: Kyuho Jo Date: Wed, 20 May 2015 11:08:23 +0900 Subject: [PATCH] Getting the count of packages from package manager to refresh setting table. Change-Id: I76aae4d820e726f18f1cbeb9ee38c36c460dfc14 Signed-off-by: Kyuho Jo --- src/notification_setting.c | 97 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 2 deletions(-) diff --git a/src/notification_setting.c b/src/notification_setting.c index 44526f5..ec5e81e 100644 --- a/src/notification_setting.c +++ b/src/notification_setting.c @@ -503,7 +503,7 @@ static bool _is_package_in_setting_table(sqlite3 *db, const char *package_name) { sqlite3_stmt *db_statement = NULL; int sqlite3_ret = SQLITE_OK; - int err = true; + bool err = true; int field_index = 1; sqlite3_ret = sqlite3_prepare_v2(db, "SELECT package_name FROM notification_setting WHERE package_name = ?", -1, &db_statement, NULL); @@ -537,6 +537,80 @@ out: return err; } +static int _get_count_of_setting(sqlite3 *db, int *count) +{ + int sqlite3_ret = SQLITE_OK; + int err = NOTIFICATION_ERROR_NONE; + const char *sql_query = "SELECT COUNT(priv_id) FROM notification_setting"; + char **result_table = NULL; + + if (count == NULL) { + NOTIFICATION_ERR("NOTIFICATION_ERROR_INVALID_PARAMETER"); + err = NOTIFICATION_ERROR_INVALID_PARAMETER; + goto out; + } + + sqlite3_ret = sqlite3_get_table(db, sql_query, &result_table, NULL, NULL, NULL); + + if (sqlite3_ret != SQLITE_OK || result_table[1] == NULL) { + NOTIFICATION_ERR("sqlite3_get_table failed [%d][%s]", sqlite3_ret, sqlite3_errmsg(db)); + err = NOTIFICATION_ERROR_FROM_DB; + goto out; + } + + *count = atoi(result_table[1]); + +out: + + if (result_table) + sqlite3_free_table(result_table); + + return err; +} + +static int _get_count_of_package(int *count) +{ + int err = NOTIFICATION_ERROR_NONE; + int pkgmgr_ret = PACKAGE_MANAGER_ERROR_NONE; + package_manager_filter_h package_filter = NULL; + int package_count = 0; + + if (count == NULL) { + NOTIFICATION_ERR("NOTIFICATION_ERROR_INVALID_PARAMETER"); + err = NOTIFICATION_ERROR_INVALID_PARAMETER; + goto out; + } + + if ((pkgmgr_ret = package_manager_filter_create (&package_filter)) != PACKAGE_MANAGER_ERROR_NONE) { + NOTIFICATION_ERR("package_manager_filter_create failed [%08X]", pkgmgr_ret); + err = NOTIFICATION_ERROR_FROM_DB; + goto out; + } + + if ((pkgmgr_ret = package_manager_filter_add_bool(package_filter, "PMINFO_PKGINFO_PROP_PACKAGE_NODISPLAY_SETTING", false)) != PACKAGE_MANAGER_ERROR_NONE) { + NOTIFICATION_ERR("package_manager_filter_add_bool failed [%08X]", pkgmgr_ret); + err = NOTIFICATION_ERROR_FROM_DB; + goto out; + } + + if ((pkgmgr_ret = package_manager_filter_count(package_filter, &package_count)) != PACKAGE_MANAGER_ERROR_NONE) { + NOTIFICATION_ERR("package_manager_filter_count failed [%08X]", pkgmgr_ret); + err = NOTIFICATION_ERROR_FROM_DB; + goto out; + } + + *count = package_count; + +out: + if (package_filter) { + if ((pkgmgr_ret = package_manager_filter_destroy(package_filter)) != PACKAGE_MANAGER_ERROR_NONE) { + NOTIFICATION_WARN("package_manager_filter_destroy failed [%08X]", pkgmgr_ret); + } + } + + return err; +} + static bool foreach_package_info_callback(package_info_h package_info, void *user_data) { sqlite3 *db = user_data; @@ -598,6 +672,8 @@ EXPORT_API int notification_setting_refresh_setting_table() sqlite3 *db = NULL; int sqlite3_ret = SQLITE_OK; int pkgmgr_ret = PACKAGE_MANAGER_ERROR_NONE; + int setting_count = 0; + int package_count = 0; sqlite3_ret = db_util_open(DBPATH, &db, 0); @@ -607,6 +683,23 @@ EXPORT_API int notification_setting_refresh_setting_table() goto out; } + if ((err = _get_count_of_setting(db, &setting_count)) != NOTIFICATION_ERROR_NONE) { + NOTIFICATION_ERR("_get_count_of_setting failed [%08X]", err); + goto out; + } + + if ((err = _get_count_of_package(&package_count)) != NOTIFICATION_ERROR_NONE) { + NOTIFICATION_ERR("_get_count_of_package failed [%08X]", err); + goto out; + } + + NOTIFICATION_INFO("setting_count [%d], package_count [%d]", setting_count, package_count); + + if (setting_count == package_count) { + NOTIFICATION_INFO("No need to refresh"); + goto out; + } + sqlite3_exec(db, "BEGIN immediate;", NULL, NULL, NULL); pkgmgr_ret = package_manager_foreach_package_info(foreach_package_info_callback, db); @@ -631,7 +724,7 @@ out: } } - NOTIFICATION_INFO("notification_setting_refresh_setting_table returns [%d]", err); + NOTIFICATION_INFO("notification_setting_refresh_setting_table returns [%08X]", err); return err; } -- 2.7.4