Remove g_quark dependancy 28/210728/9
authorhyunho <hhstark.kang@samsung.com>
Wed, 24 Jul 2019 06:06:58 +0000 (15:06 +0900)
committerhyunho <hhstark.kang@samsung.com>
Fri, 26 Jul 2019 09:06:36 +0000 (18:06 +0900)
Change-Id: Id5bfd74223fbf63a94757b6f2e6d5b9477033c0e
Signed-off-by: hyunho <hhstark.kang@samsung.com>
12 files changed:
notification-ex/abstract_item.cc
notification-ex/abstract_item_implementation.h
notification-ex/api/notification_ex_internal.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
notification/src/notification_convert.c

index f5206b9d1160606377eaf39e4888c53fd3c73be9..f39331eaabe1eca9ffeaef8fbde979a553a67bd2 100644 (file)
@@ -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);
index af62938f2e957650cc08220a0a114167cf88b370..24a434b6b47da73a375fd221aa374e5605610736 100644 (file)
@@ -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
index ab462706c98576f8eb9976d427bee0c482457da5..da7ea5dd8e7c71e6c542a78f385f459e9ac95706 100644 (file)
@@ -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,
index de71ff9d01c6ae7ac12dae4991e5a0dc87a75631..734d5b42cbbe6cfe1f7c4c68ac3289e542685db6 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>
   " 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<bool*>(user_data);
@@ -376,6 +406,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)
@@ -389,7 +420,7 @@ int DBManager::InsertNotification(list<shared_ptr<item::AbstractItem>> addedItem
 
   for (auto& i : addedItem) {
     int 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;
 
@@ -400,14 +431,19 @@ 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, 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<IItemInfoInternal>(i->GetInfo())->GetPrivateId(),
           GetPkgId(i->GetSenderAppId(),uid).c_str(),
           static_cast<int>(i->GetPolicy()),
           reinterpret_cast<char*>(b.ToRaw().first.get()),
@@ -487,17 +523,20 @@ map<string, string> 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<item::AbstractItem> updatedItem,
 int DBManager::UpdateNotification(shared_ptr<item::AbstractItem> updatedItem) {
   int count, ret;
   char* query;
-  int uid = static_pointer_cast<IItemInfoInternal>(updatedItem->GetInfo())->GetUid();
+  int uid = static_pointer_cast<IItemInfoInternal>(
+      updatedItem->GetInfo())->GetUid();
+  int64_t priv_id = static_pointer_cast<IItemInfoInternal>(
+      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<item::AbstractItem> 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<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");
@@ -699,6 +739,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, int 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(int uid) {
   int ret, sim_mode;
   char* query;
@@ -734,12 +794,11 @@ list<shared_ptr<item::AbstractItem>> DBManager::GetNotificationList(int uid) {
 int DBManager::DeleteNotification(shared_ptr<item::AbstractItem> deletedItem) {
   int ret;
   char* query;
-  int 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;
@@ -747,21 +806,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 23f634634457f1c38cf38509b8a6f42647ca11a5..0817dfa13fac1a0f6d2c1aaee7568ccaad31348a 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, 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<item::AbstractItem> deletedItem);
   static std::list<std::shared_ptr<item::AbstractItem>> GetNotificationList(int uid);
   static std::list<std::shared_ptr<item::AbstractItem>> GetNotificationList(std::string app_id, int uid);
   static std::list<std::shared_ptr<item::AbstractItem>> GetNotificationList(std::string app_id, std::string root_id, int uid);
+  static std::list<std::shared_ptr<item::AbstractItem>> 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<item::AbstractItem> addedItem, sqlite3* db);
   static int UpdateReceiverList(std::shared_ptr<item::AbstractItem> updatedItem,  sqlite3* db);
index 975a6ee5bbacf8788bb76fa1b87f4d9efe4e4ca2..52b996a0f8f34641ea140d4192b70932815a4201 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 958a34869d6a03aecc660278646ec5acc07db7c0..9ae1393d6c6337dee25beba85131b1835142f30a 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();
 }  // namespace util
 }  // namespace notification
index 57059bff8bb79dc10b38974412643989740dc85d..597debcef9612c2a588c6f12e414d19c22e359e2 100644 (file)
@@ -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;
index 36f3cfaf105fad2675010ee9a946b14c456e1ac2..60da396d352bb221f9594e25711c1406108454b3 100644 (file)
@@ -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_;
 }
index dc10c7249d2a914d38faa6ec8cf5795daaeb60ba..c40af758f43e88dba7ec459bfd308b3d4628e715 100644 (file)
@@ -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;
index 6eb09339314632be519e5f71fe504f88995b1591..e5923c4959a60992461b1ec80c83a2668505a5a2 100644 (file)
@@ -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<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;
+}
+
 extern "C" EXPORT_API int noti_ex_item_get_uid(
     noti_ex_item_h item, int* uid) {
   if (item == nullptr || uid == nullptr) {
index 4efd987373bd2fe25e03f303e9157c03a6210ea9..c110cabd45ba9a333428851d928c750df0761628 100644 (file)
@@ -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);
 }