From: hyunho Date: Wed, 24 Jul 2019 06:06:58 +0000 (+0900) Subject: Remove g_quark dependancy X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ae2ccc42e29a7536ac33626b0e42f36f5cb76df7;p=platform%2Fcore%2Fapi%2Fnotification.git Remove g_quark dependancy Change-Id: Id5bfd74223fbf63a94757b6f2e6d5b9477033c0e Signed-off-by: hyunho --- diff --git a/notification-ex/abstract_item.cc b/notification-ex/abstract_item.cc index f5206b9d..f39331ea 100644 --- a/notification-ex/abstract_item.cc +++ b/notification-ex/abstract_item.cc @@ -37,6 +37,7 @@ #define ABSTRACT_ITEM_TYPE_KEY "__ABSTRACT_ITEM_TYPE_KEY__" #define ABSTRACT_ITEM_ID_KEY "__ABSTRACT_ITEM_ID_KEY__" #define ABSTRACT_ITEM_UID_KEY "__ABSTRACT_ITEM_UID_KEY__" +#define ABSTRACT_ITEM_PRIVATE_ID_KEY "__ABSTRACT_ITEM_PRIVATE_ID_KEY__" #define ABSTRACT_ITEM_TIME_KEY "__ABSTRACT_ITEM_TIME_KEY__" #define ABSTRACT_ITEM_SENDER_APPID_KEY "__ABSTRACT_ITEM_SENDER_APPID_KEY__" #define ABSTRACT_ITEM_TAG_KEY "__ABSTRACT_ITEM_TAG_KEY__" @@ -144,6 +145,7 @@ Bundle AbstractItem::Serialize() const { b.Add(ABSTRACT_ITEM_HIDE_TIME_KEY, to_string(impl_->hide_time_)); b.Add(ABSTRACT_ITEM_DELETE_TIME_KEY, to_string(impl_->delete_time_)); b.Add(ABSTRACT_ITEM_UID_KEY, to_string(impl_->uid_)); + b.Add(ABSTRACT_ITEM_PRIVATE_ID_KEY, to_string(impl_->private_id_)); b.Add(ABSTRACT_ITEM_TAG_KEY, impl_->tag_); localtime_r(&impl_->time_, &timeinfo); @@ -251,6 +253,7 @@ void AbstractItem::Deserialize(Bundle b) { impl_->sound_path_ = b.GetString(ABSTRACT_ITEM_SOUND_PATH_KEY); impl_->vibration_path_ = b.GetString(ABSTRACT_ITEM_VIBRATION_PATH_KEY); impl_->uid_ = stoi(b.GetString(ABSTRACT_ITEM_UID_KEY)); + impl_->private_id_ = stoi(b.GetString(ABSTRACT_ITEM_PRIVATE_ID_KEY)); impl_->tag_ = b.GetString(ABSTRACT_ITEM_TAG_KEY); time_s = b.GetString(ABSTRACT_ITEM_TIME_KEY); diff --git a/notification-ex/abstract_item_implementation.h b/notification-ex/abstract_item_implementation.h index af62938f..24a434b6 100644 --- a/notification-ex/abstract_item_implementation.h +++ b/notification-ex/abstract_item_implementation.h @@ -64,6 +64,7 @@ class AbstractItem::Impl { time_t time_ = 0; int uid_ = 0; int request_id_ = 0; + int64_t private_id_ = 0; }; } // namespace item diff --git a/notification-ex/api/notification_ex_internal.h b/notification-ex/api/notification_ex_internal.h index ab462706..da7ea5dd 100644 --- a/notification-ex/api/notification_ex_internal.h +++ b/notification-ex/api/notification_ex_internal.h @@ -27,6 +27,8 @@ int noti_ex_item_get_version(noti_ex_item_h item, int *version); int noti_ex_item_set_version(noti_ex_item_h item, int version); int noti_ex_item_get_uid(noti_ex_item_h item, int *uid); int noti_ex_item_set_uid(noti_ex_item_h item, int uid); +int noti_ex_item_get_private_id(noti_ex_item_h item, int64_t *priv_id); +int noti_ex_item_set_private_id(noti_ex_item_h item, int64_t priv_id); int noti_ex_item_set_sender_app_id(noti_ex_item_h item, const char *app_id); int noti_ex_item_add_hide_viewer(noti_ex_item_h item, const char *app_id); int noti_ex_item_get_hide_viewer_list(noti_ex_item_h item, diff --git a/notification-ex/db_manager.cc b/notification-ex/db_manager.cc index de71ff9d..734d5b42 100644 --- a/notification-ex/db_manager.cc +++ b/notification-ex/db_manager.cc @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -44,13 +45,13 @@ " root_id TEXT NOT NULL,\n" \ " app_id TEXT NOT NULL,\n" \ " uid INTEGER,\n" \ - " priv_id INTEGER,\n" \ + " priv_id INTEGER PRIMARY KEY,\n" \ " pkg_id TEXT,\n" \ " policy INTEGER,\n" \ " data TEXT NOT NULL,\n" \ " insert_time INTEGER,\n" \ " hide_list TEXT,\n" \ - " PRIMARY KEY (root_id, app_id, uid));\n" \ + " UNIQUE (root_id, app_id, uid));\n" \ "CREATE TABLE IF NOT EXISTS receiver_list (\n" \ " root_id TEXT NOT NULL,\n" \ " app_id TEXT NOT NULL,\n" \ @@ -140,6 +141,35 @@ int DBManager::ExecuteQuery(const char* query, int* num_changes) { return ret; } +int DBManager::GetSequence(sqlite3* db, int64_t* seq) { + int ret = ERROR_NONE; + sqlite3_stmt *stmt; + + if (db == nullptr || seq == nullptr) + return ERROR_INVALID_PARAMETER; + + string query = "SELECT IFNULL(MIN(priv_id), 0), IFNULL(MAX(priv_id), 0)" + " FROM noti_ex_list"; + sqlite3_prepare_v2(db, query.c_str(), query.size(), &stmt, nullptr); + ret = sqlite3_step(stmt); + if (ret == SQLITE_ROW) { + int64_t min_p = sqlite3_column_int64(stmt, 0); + if (min_p > 1) + *seq = min_p - 1; + else + *seq = sqlite3_column_int64(stmt, 1) + 1; + ret = ERROR_NONE; + } else { + /* LCOV_EXCL_START */ + LOGE("Sqlite err [%d][%s]", ret, sqlite3_errmsg(db)); + ret = ERROR_FROM_DB; + /* LCOV_EXCL_STOP */ + } + + sqlite3_finalize(stmt); + return ret; +} + int DBManager::CheckDBIntegrity(void* user_data, int argc, char** argv, char** notUsed) { bool* is_db_corrupted = static_cast(user_data); @@ -376,6 +406,7 @@ int DBManager::InsertNotification(list> addedItem int ret = ERROR_NONE; int count; char* query; + int64_t seq; sqlite3* db = OpenDB(); if (db == nullptr) @@ -389,7 +420,7 @@ int DBManager::InsertNotification(list> addedItem for (auto& i : addedItem) { int uid = static_pointer_cast(i->GetInfo())->GetUid(); - ret = GetCount(i->GetId(), i->GetSenderAppId(), uid, &count); + ret = GetCount(0, i->GetId(), i->GetSenderAppId(), uid, &count); if (ret != ERROR_NONE) break; @@ -400,14 +431,19 @@ int DBManager::InsertNotification(list> addedItem break; } + ret = GetSequence(db, &seq); + if (ret != ERROR_NONE) + break; + + static_pointer_cast(i->GetInfo())->SetPrivateId(seq); Bundle b = i->Serialize(); query = sqlite3_mprintf("INSERT INTO noti_ex_list" " (root_id, app_id, uid, priv_id, pkg_id, policy, data, insert_time)" - " VALUES (%Q, %Q, %d, %d, %Q, %d, %Q, %d)", + " VALUES (%Q, %Q, %d, %" PRId64 ", %Q, %d, %Q, %d)", i->GetId().c_str(), i->GetSenderAppId().c_str(), uid, - util::GetQuarkFromString(i->GetId()), + static_pointer_cast(i->GetInfo())->GetPrivateId(), GetPkgId(i->GetSenderAppId(),uid).c_str(), static_cast(i->GetPolicy()), reinterpret_cast(b.ToRaw().first.get()), @@ -487,17 +523,20 @@ map DBManager::GetHideMap() { } int DBManager::GetCount(const string& app_id, int uid, int* count) { - return GetCount(string(), app_id, uid, count); + return GetCount(0, string(), app_id, uid, count); } -int DBManager::GetCount(const string& root_id, const string& app_id, +int DBManager::GetCount(int64_t priv_id, const string& root_id, const string& app_id, int uid, int* count) { int ret; char* query; sqlite3_stmt *stmt; sqlite3* db; - if (root_id.empty()) { + if (priv_id != 0) { + query = sqlite3_mprintf("SELECT count(*) FROM noti_ex_list" + " WHERE priv_id = %" PRId64 "", priv_id); + } else if (root_id.empty()) { query = sqlite3_mprintf("SELECT count(*) FROM noti_ex_list" " WHERE app_id = %Q AND uid = %d", app_id.c_str(), uid); } else { @@ -560,16 +599,20 @@ int DBManager::UpdateHideList(shared_ptr updatedItem, int DBManager::UpdateNotification(shared_ptr updatedItem) { int count, ret; char* query; - int uid = static_pointer_cast(updatedItem->GetInfo())->GetUid(); + int uid = static_pointer_cast( + updatedItem->GetInfo())->GetUid(); + int64_t priv_id = static_pointer_cast( + updatedItem->GetInfo())->GetPrivateId(); - ret = GetCount(updatedItem->GetId(), updatedItem->GetSenderAppId(), uid, &count); + ret = GetCount(priv_id, updatedItem->GetId(), updatedItem->GetSenderAppId(), + uid, &count); if (ret != ERROR_NONE) { LOGE("fail to get count"); return ret; } if (count <= 0) { - LOGE("not exist id(%s) for appid(%s)", + LOGE("not exist priv_id(%" PRId64 ") id(%s) for appid(%s)", priv_id, updatedItem->GetId().c_str(), updatedItem->GetSenderAppId().c_str()); return ERROR_NOT_EXIST_ID; } @@ -580,16 +623,13 @@ int DBManager::UpdateNotification(shared_ptr updatedItem) { Bundle b = updatedItem->Serialize(); query = sqlite3_mprintf("UPDATE noti_ex_list SET" - " priv_id = %d, pkg_id = %Q, policy = %d, data = %Q, insert_time = %d" - " WHERE root_id = %Q AND app_id = %Q AND uid = %d", - util::GetQuarkFromString(updatedItem->GetId()), + " pkg_id = %Q, policy = %d, data = %Q, insert_time = %d" + " WHERE priv_id = %" PRId64 "", GetPkgId(updatedItem->GetSenderAppId(), uid).c_str(), static_cast(updatedItem->GetPolicy()), reinterpret_cast(b.ToRaw().first.get()), static_pointer_cast(updatedItem->GetInfo())->GetTime(), - updatedItem->GetId().c_str(), - updatedItem->GetSenderAppId().c_str(), - uid); + priv_id); if (!query) { LOGE("OOM - sql query"); @@ -699,6 +739,26 @@ list> DBManager::GetNotificationList return item_list; } +list> DBManager::GetNotificationList + (string app_id, int64_t priv_id, int uid) { + char* query; + list> item_list; + + query = sqlite3_mprintf("SELECT data FROM noti_ex_list" + " WHERE uid = %d AND app_id = %Q AND priv_id = %" PRId64 "", + uid, app_id.c_str(), priv_id); + + if (!query) { + LOGE("OOM - sql query"); + return item_list; + } + + item_list = ExecuteGetList(query); + sqlite3_free(query); + + return item_list; +} + list> DBManager::GetNotificationList(int uid) { int ret, sim_mode; char* query; @@ -734,12 +794,11 @@ list> DBManager::GetNotificationList(int uid) { int DBManager::DeleteNotification(shared_ptr deletedItem) { int ret; char* query; - int uid = static_pointer_cast(deletedItem->GetInfo())->GetUid(); + int64_t priv_id = static_pointer_cast( + deletedItem->GetInfo())->GetPrivateId(); - query = sqlite3_mprintf("DELETE FROM noti_ex_list" - " WHERE root_id = %Q AND app_id = %Q AND uid = %d", - deletedItem->GetId().c_str(), deletedItem->GetSenderAppId().c_str(), - uid); + query = sqlite3_mprintf("DELETE FROM noti_ex_list WHERE priv_id = %" PRId64 "", + priv_id); if (!query) { LOGE("OOM - sql query"); return ERROR_OUT_OF_MEMORY; @@ -747,21 +806,6 @@ int DBManager::DeleteNotification(shared_ptr deletedItem) { ret = ExecuteQuery(query, nullptr); sqlite3_free(query); - if (ret != ERROR_NONE) - return ret; - - query = sqlite3_mprintf("DELETE FROM receiver_list" - " WHERE root_id = %Q AND app_id = %Q AND uid = %d", - deletedItem->GetId().c_str(), deletedItem->GetSenderAppId().c_str(), - uid); - if (!query) { - LOGE("OOM - sql query"); - return ERROR_OUT_OF_MEMORY; - } - - ret = ExecuteQuery(query, nullptr); - sqlite3_free(query); - return ret; } diff --git a/notification-ex/db_manager.h b/notification-ex/db_manager.h index 23f63463..0817dfa1 100644 --- a/notification-ex/db_manager.h +++ b/notification-ex/db_manager.h @@ -40,12 +40,13 @@ class EXPORT_API DBManager { static std::map GetHideMap(); static int UpdateHideList(std::shared_ptr updatedItem, const std::string& hide_list); static int UpdateNotification(std::shared_ptr updatedItem); - static int GetCount(const std::string& root_id, const std::string& app_id, int uid, int* count); + static int GetCount(int64_t priv_id, const std::string& root_id, const std::string& app_id, int uid, int* count); static int GetCount(const std::string& app_id, int uid, int* count); static int DeleteNotification(std::shared_ptr deletedItem); static std::list> GetNotificationList(int uid); static std::list> GetNotificationList(std::string app_id, int uid); static std::list> GetNotificationList(std::string app_id, std::string root_id, int uid); + static std::list> GetNotificationList(std::string app_id, int64_t private_id, int uid); private: DBManager(); /* LCOV_EXCL_LINE */ @@ -56,6 +57,7 @@ class EXPORT_API DBManager { static int RecoverCorruptedDB(sqlite3* db); static int ExecuteQuery(const char* query, int* num_changes); static int ExecuteQuery(sqlite3* db, const char* query, int* num_changes); + static int GetSequence(sqlite3* db, int64_t* seq); static std::string GetPkgId(const std::string& app_id, int uid); static void CheckLimit(std::shared_ptr addedItem, sqlite3* db); static int UpdateReceiverList(std::shared_ptr updatedItem, sqlite3* db); diff --git a/notification-ex/ex_util.cc b/notification-ex/ex_util.cc index 975a6ee5..52b996a0 100644 --- a/notification-ex/ex_util.cc +++ b/notification-ex/ex_util.cc @@ -33,13 +33,6 @@ using namespace std; namespace notification { namespace util { -GQuark GetQuarkFromString(string str) { - return g_quark_from_string(str.c_str()); -} - -std::string GetQuarkToString(GQuark quark) { - return g_quark_to_string(quark); -} int GetRequestId() { static int id = 0; diff --git a/notification-ex/ex_util.h b/notification-ex/ex_util.h index 958a3486..9ae1393d 100644 --- a/notification-ex/ex_util.h +++ b/notification-ex/ex_util.h @@ -24,8 +24,6 @@ namespace notification { namespace util { std::string GetAppId(); - GQuark GetQuarkFromString(std::string str); - std::string GetQuarkToString(GQuark quark); int GetRequestId(); } // namespace util } // namespace notification diff --git a/notification-ex/iitem_info_internal.h b/notification-ex/iitem_info_internal.h index 57059bff..597debce 100644 --- a/notification-ex/iitem_info_internal.h +++ b/notification-ex/iitem_info_internal.h @@ -31,6 +31,8 @@ class EXPORT_API IItemInfoInternal : public IItemInfo { virtual ~IItemInfoInternal() = default; virtual int GetUid() const = 0; virtual void SetUid(int uid) = 0; + virtual int64_t GetPrivateId() const = 0; + virtual void SetPrivateId(int64_t private_id) = 0; virtual int GetVersion() const = 0; virtual void SetVersion(int ver) = 0; virtual void AddHideViewer(std::string appid) = 0; diff --git a/notification-ex/item_info.cc b/notification-ex/item_info.cc index 36f3cfaf..60da396d 100644 --- a/notification-ex/item_info.cc +++ b/notification-ex/item_info.cc @@ -34,6 +34,15 @@ namespace item { AbstractItem::Impl::ItemInfo::ItemInfo(AbstractItem::Impl* impl) : impl_(impl) { } + +int64_t AbstractItem::Impl::ItemInfo::GetPrivateId() const { + return impl_->private_id_; +} + +void AbstractItem::Impl::ItemInfo::SetPrivateId(int64_t private_id) { + impl_->private_id_ = private_id; +} + int AbstractItem::Impl::ItemInfo::GetUid() const { return impl_->uid_; } diff --git a/notification-ex/item_info_internal.h b/notification-ex/item_info_internal.h index dc10c724..c40af758 100644 --- a/notification-ex/item_info_internal.h +++ b/notification-ex/item_info_internal.h @@ -27,6 +27,8 @@ class AbstractItem::Impl::ItemInfo : public IItemInfoInternal { public: ItemInfo(AbstractItem::Impl* impl); virtual ~ItemInfo() = default; + int64_t GetPrivateId() const override; + void SetPrivateId(int64_t private_id) override; int GetUid() const override; void SetUid(int uid) override; time_t GetTime() const override; diff --git a/notification-ex/stub.cc b/notification-ex/stub.cc index 6eb09339..e5923c49 100644 --- a/notification-ex/stub.cc +++ b/notification-ex/stub.cc @@ -2660,6 +2660,34 @@ extern "C" EXPORT_API int noti_ex_item_set_version( return NOTI_EX_ERROR_NONE; } +extern "C" EXPORT_API int noti_ex_item_get_private_id( + noti_ex_item_h item, int64_t* private_id) { + if (item == nullptr || private_id == nullptr) { + LOGE("Invalid parameter"); + return NOTI_EX_ERROR_INVALID_PARAMETER; + } + + Handle* h = static_cast(item); + *private_id = static_pointer_cast( + h->Get()->GetInfo())->GetPrivateId(); + + return NOTI_EX_ERROR_NONE; +} + +extern "C" EXPORT_API int noti_ex_item_set_private_id( + noti_ex_item_h item, int64_t priv_id) { + if (item == nullptr) { + LOGE("Invalid parameter"); + return NOTI_EX_ERROR_INVALID_PARAMETER; + } + + Handle* h = static_cast(item); + static_pointer_cast( + h->Get()->GetInfo())->SetPrivateId(priv_id); + + return NOTI_EX_ERROR_NONE; +} + extern "C" EXPORT_API int noti_ex_item_get_uid( noti_ex_item_h item, int* uid) { if (item == nullptr || uid == nullptr) { diff --git a/notification/src/notification_convert.c b/notification/src/notification_convert.c index 4efd9873..c110cabd 100644 --- a/notification/src/notification_convert.c +++ b/notification/src/notification_convert.c @@ -1477,6 +1477,7 @@ EXPORT_API int notification_convert_to_legacy( notification_h notification; int ret, i; char *id; + int64_t priv_id; if (item == NULL || noti == NULL) { ERR("Invalid param"); @@ -1490,9 +1491,8 @@ EXPORT_API int notification_convert_to_legacy( return ret; } - noti_ex_item_get_id(item, &id); - ret = notification_set_priv_id(notification, g_quark_from_string(id)); - free(id); + noti_ex_item_get_private_id(item, &priv_id); + ret = notification_set_priv_id(notification, priv_id); if (ret != NOTI_EX_ERROR_NONE) { ERR("failed to convert(%d)", ret); goto out; @@ -1537,16 +1537,18 @@ EXPORT_API int notification_convert_to_ex( noti_ex_item_h group_item; const char *id = NULL; const char *tag = NULL; - char *priv_id; + int legacy_priv_id; if (noti == NULL || item == NULL) { ERR("Invalid param"); return NOTIFICATION_ERROR_INVALID_PARAMETER; } - if (noti->priv_id > 0) { /* case of update */ - id = g_quark_to_string(noti->priv_id); - } else { /* case of insert */ + /* Legacy tag was legacy notification's Root ID + * If legacy notification does not has a tag then auto ID generated by + * abstract item will be used as Root ID + */ + if (noti->tag) { notification_get_tag(noti, &tag); if (tag != NULL) id = tag; @@ -1562,35 +1564,21 @@ EXPORT_API int notification_convert_to_ex( ret = noti_ex_item_set_sender_app_id(group_item, id); if (ret != NOTI_EX_ERROR_NONE) { ERR("failed to convert(%d)", ret); - goto out; + noti_ex_item_destroy(group_item); + return notification_convert_to_legacy_error(ret); } + notification_get_id(noti, NULL, &legacy_priv_id); + noti_ex_item_set_private_id(group_item, legacy_priv_id); for (i = 0; i < sizeof(convert_to_ex_arr) / sizeof(convert_to_ex_arr[0]); i++) { ret = convert_to_ex_arr[i](noti, group_item); if (ret != NOTI_EX_ERROR_NONE) { ERR("failed (%d)(%d)", i, ret); - goto out; - } - } - -out: - if (ret == NOTI_EX_ERROR_NONE) { - if (noti->priv_id <= 0) { - ret = noti_ex_item_get_id(group_item, &priv_id); - if (ret != NOTI_EX_ERROR_NONE) { - ERR("failed to convert(%d)", ret); - noti_ex_item_destroy(group_item); - return notification_convert_to_legacy_error(ret); - } - notification_set_priv_id(noti, g_quark_from_string(priv_id)); - free(priv_id); + noti_ex_item_destroy(group_item); + return notification_convert_to_legacy_error(ret); } - - *item = group_item; - } else { - noti_ex_item_destroy(group_item); } - + *item = group_item; return notification_convert_to_legacy_error(ret); }