Remove g_quark dependancy 92/215592/1
authorJusung Son <jusung07.son@samsung.com>
Fri, 11 Oct 2019 07:35:21 +0000 (16:35 +0900)
committerJusung Son <jusung07.son@samsung.com>
Fri, 11 Oct 2019 07:35:21 +0000 (16:35 +0900)
Change-Id: Iaf4ad665656af2773215816e03484bd504f95f5d
Signed-off-by: Jusung Son <jusung07.son@samsung.com>
notification-ex/abstract_item.cc
notification-ex/abstract_item_implementation.h
notification-ex/db_manager.cc
notification-ex/db_manager.h
notification-ex/ex_util.cc
notification-ex/ex_util.h
notification-ex/iitem_info_internal.h
notification-ex/item_info.cc
notification-ex/item_info_internal.h
notification-ex/stub.cc

index 5ab91e9..d1b677e 100644 (file)
@@ -39,6 +39,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__"
@@ -157,6 +158,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);
@@ -302,6 +304,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);
index f943a0c..be381ae 100644 (file)
@@ -68,6 +68,7 @@ class AbstractItem::Impl {
   time_t time_ = 0;
   uid_t uid_ = 0;
   int request_id_ = 0;
+  int64_t private_id_ = 0;
   std::string background_;
   bool ongoing_ = false;
   MainType main_type_ = MainNone;
index 6652aff..d3e342a 100644 (file)
@@ -20,6 +20,7 @@
 #include <vconf.h>
 #include <pkgmgr-info.h>
 #include <tzplatform_config.h>
+#include <inttypes.h>
 
 #include <string.h>
 #include <list>
   " app_id TEXT NOT NULL,\n" \
   " uid INTEGER,\n" \
   " channel TEXT,\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" \
@@ -142,6 +143,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<bool*>(user_data);
@@ -380,6 +410,7 @@ int DBManager::InsertNotification(list<shared_ptr<item::AbstractItem>> addedItem
   int ret = ERROR_NONE;
   int count;
   char* query;
+  int64_t seq;
   sqlite3* db = OpenDB();
 
   if (db == nullptr)
@@ -393,7 +424,7 @@ int DBManager::InsertNotification(list<shared_ptr<item::AbstractItem>> addedItem
 
   for (auto& i : addedItem) {
     uid_t uid = static_pointer_cast<IItemInfoInternal>(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;
 
@@ -404,15 +435,20 @@ int DBManager::InsertNotification(list<shared_ptr<item::AbstractItem>> addedItem
       break;
     }
 
+    ret = GetSequence(db, &seq);
+    if (ret != ERROR_NONE)
+      break;
+
+    static_pointer_cast<IItemInfoInternal>(i->GetInfo())->SetPrivateId(seq);
     Bundle b = i->Serialize();
     query = sqlite3_mprintf("INSERT INTO noti_ex_list"
           " (root_id, app_id, uid, channel, priv_id, pkg_id, policy, data, insert_time)"
-          " VALUES (%Q, %Q, %d, %Q, %d, %Q, %d, %Q, %d)",
+          " VALUES (%Q, %Q, %d, %Q, %" PRId64 ", %Q, %d, %Q, %d)",
           i->GetId().c_str(),
           i->GetSenderAppId().c_str(),
           uid,
           i->GetChannel().c_str(),
-          util::GetQuarkFromString(i->GetId() + to_string(uid)),
+          static_pointer_cast<IItemInfoInternal>(i->GetInfo())->GetPrivateId(),
           GetPkgId(i->GetSenderAppId(), uid).c_str(),
           static_cast<int>(i->GetPolicy()),
           reinterpret_cast<char*>(b.ToRaw().first.get()),
@@ -492,17 +528,20 @@ map<string, string> DBManager::GetHideMap() {
 }
 
 int DBManager::GetCount(const string& app_id, uid_t 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,
                               uid_t 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 {
@@ -567,8 +606,10 @@ int DBManager::UpdateNotification(shared_ptr<item::AbstractItem> updatedItem) {
   char* query;
   uid_t uid =
       static_pointer_cast<IItemInfoInternal>(updatedItem->GetInfo())->GetUid();
+  int64_t priv_id = static_pointer_cast<IItemInfoInternal>(
+      updatedItem->GetInfo())->GetPrivateId();
 
-  ret = GetCount(
+  ret = GetCount(priv_id,
       updatedItem->GetId(), updatedItem->GetSenderAppId(), uid, &count);
   if (ret != ERROR_NONE) {
     LOGE("fail to get count");
@@ -576,7 +617,7 @@ int DBManager::UpdateNotification(shared_ptr<item::AbstractItem> updatedItem) {
   }
 
   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;
   }
@@ -587,17 +628,14 @@ int DBManager::UpdateNotification(shared_ptr<item::AbstractItem> updatedItem) {
 
   Bundle b = updatedItem->Serialize();
   query = sqlite3_mprintf("UPDATE noti_ex_list SET"
-     " priv_id = %d, pkg_id = %Q, channel = %Q, policy = %d, data = %Q, insert_time = %d"
-     " WHERE root_id = %Q AND app_id = %Q AND uid = %d",
-     util::GetQuarkFromString(updatedItem->GetId() + to_string(uid)),
+     " pkg_id = %Q, channel = %Q, policy = %d, data = %Q, insert_time = %d"
+     " WHERE priv_id = %" PRId64 "",
      GetPkgId(updatedItem->GetSenderAppId(), uid).c_str(),
      updatedItem->GetChannel().c_str(),
      static_cast<int>(updatedItem->GetPolicy()),
      reinterpret_cast<char*>(b.ToRaw().first.get()),
      static_pointer_cast<IItemInfo>(updatedItem->GetInfo())->GetTime(),
-     updatedItem->GetId().c_str(),
-     updatedItem->GetSenderAppId().c_str(),
-     uid);
+     priv_id);
 
   if (!query) {
     LOGE("OOM - sql query");
@@ -708,6 +746,26 @@ list<shared_ptr<item::AbstractItem>> DBManager::GetNotificationList
   return item_list;
 }
 
+list<shared_ptr<item::AbstractItem>> DBManager::GetNotificationList
+                             (string app_id, int64_t priv_id, uid_t uid) {
+  char* query;
+  list<shared_ptr<item::AbstractItem>> 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<shared_ptr<item::AbstractItem>> DBManager::GetNotificationList(
       uid_t uid, string channel) {
   int ret, sim_mode;
@@ -751,13 +809,11 @@ list<shared_ptr<item::AbstractItem>> DBManager::GetNotificationList(
 int DBManager::DeleteNotification(shared_ptr<item::AbstractItem> deletedItem) {
   int ret;
   char* query;
-  uid_t uid =
-      static_pointer_cast<IItemInfoInternal>(deletedItem->GetInfo())->GetUid();
+  int64_t priv_id = static_pointer_cast<IItemInfoInternal>(
+      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;
@@ -765,21 +821,6 @@ int DBManager::DeleteNotification(shared_ptr<item::AbstractItem> 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;
 }
 
index 51d7e5d..74f8480 100644 (file)
@@ -40,12 +40,13 @@ class EXPORT_API DBManager {
   static std::map<std::string, std::string> GetHideMap();
   static int UpdateHideList(std::shared_ptr<item::AbstractItem> updatedItem, const std::string& hide_list);
   static int UpdateNotification(std::shared_ptr<item::AbstractItem> updatedItem);
-  static int GetCount(const std::string& root_id, const std::string& app_id, uid_t uid, int* count);
+  static int GetCount(int64_t priv_id, const std::string& root_id, const std::string& app_id,  uid_t uid, int* count);
   static int GetCount(const std::string& app_id, uid_t uid, int* count);
   static int DeleteNotification(std::shared_ptr<item::AbstractItem> deletedItem);
   static std::list<std::shared_ptr<item::AbstractItem>> GetNotificationList(uid_t uid, std::string channel = "");
   static std::list<std::shared_ptr<item::AbstractItem>> GetNotificationList(std::string app_id, uid_t uid);
   static std::list<std::shared_ptr<item::AbstractItem>> GetNotificationList(std::string app_id, std::string root_id, uid_t uid);
+  static std::list<std::shared_ptr<item::AbstractItem>> GetNotificationList(std::string app_id, int64_t private_id, uid_t 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, uid_t uid);
   static void CheckLimit(std::shared_ptr<item::AbstractItem> addedItem, sqlite3* db);
   static int UpdateReceiverList(std::shared_ptr<item::AbstractItem> updatedItem,  sqlite3* db);
index d1bcda8..2429e28 100644 (file)
 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;
index 4920be2..59447dc 100644 (file)
@@ -24,8 +24,6 @@
 namespace notification {
 namespace util {
   std::string GetAppId();
-  GQuark GetQuarkFromString(std::string str);
-  std::string GetQuarkToString(GQuark quark);
   int GetRequestId();
   std::string GetPkgId();
   std::string GetDomainName();
index 38edea4..2f79e36 100644 (file)
@@ -34,6 +34,8 @@ class EXPORT_API IItemInfoInternal : public IItemInfo {
   virtual ~IItemInfoInternal() = default;
   virtual uid_t GetUid() const = 0;
   virtual void SetUid(uid_t 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;
index 1c88e0b..3bf7021 100644 (file)
@@ -35,6 +35,14 @@ 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;
+}
+
 uid_t AbstractItem::Impl::ItemInfo::GetUid() const {
   return impl_->uid_;
 }
index 45257d9..7764f9c 100644 (file)
@@ -30,6 +30,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;
   uid_t GetUid() const override;
   void SetUid(uid_t uid) override;
   time_t GetTime() const override;
index 70fcba7..940abc6 100644 (file)
@@ -55,6 +55,7 @@
 #include "notification-ex/dbus_sender.h"
 #include "notification-ex/dbus_event_listener.h"
 #include "notification-ex/exception.h"
+#include "notification-ex/iitem_info_internal.h"
 
 #ifdef LOG_TAG
 #undef LOG_TAG
@@ -3179,3 +3180,31 @@ extern "C" EXPORT_API int noti_ex_multi_lang_destroy(noti_ex_multi_lang_h handle
   delete mul_ptr;
   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<Handle*>(item);
+  *private_id = static_pointer_cast<IItemInfoInternal>(
+      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<Handle*>(item);
+  static_pointer_cast<IItemInfoInternal>(
+      h->Get()->GetInfo())->SetPrivateId(priv_id);
+
+  return NOTI_EX_ERROR_NONE;
+}