Add metadata to pkginfo
[platform/core/appfw/pkgmgr-info.git] / src / server / database / db_handle_provider.cc
index 0ee999d..78bc332 100644 (file)
@@ -404,8 +404,26 @@ int DBHandleProvider::UpdateCache(const tizen_base::Database& db, pid_t pid,
   return ret;
 }
 
+inline bool CheckMetadataFilter(GList* metadata_list,
+    const std::unordered_map<std::string, std::string>& metadata_map) {
+  for (auto* it = metadata_list; it != nullptr; it = g_list_next(it)) {
+    auto* node = reinterpret_cast<metadata_x*>(it->data);
+    if (node->key != nullptr) {
+      auto metadata = metadata_map.find(node->key);
+      if (metadata == metadata_map.end())
+        continue;
+
+      if (metadata->second.empty() ||
+          strcmp(node->value ? node->value : "", metadata->second.c_str()) == 0)
+        return true;
+    }
+  }
+  return false;
+}
+
 inline bool CheckPkgFilters(pkgmgrinfo_filter_x* filter,
-    const std::shared_ptr<package_x>& info) {
+    const std::shared_ptr<package_x>& info,
+    const std::unordered_map<std::string, std::string>& metadata_map) {
   for (auto* it = filter->list; it != nullptr; it = g_slist_next(it)) {
     auto node = reinterpret_cast<pkgmgrinfo_node_x*>(it->data);
     auto* checker = FilterCheckerProvider::GetInst().
@@ -414,7 +432,11 @@ inline bool CheckPkgFilters(pkgmgrinfo_filter_x* filter,
       return false;
   }
 
-  return true;
+  bool pass = true;
+  if (!metadata_map.empty())
+    pass = CheckMetadataFilter(info->metadata, metadata_map);
+
+  return pass;
 }
 
 std::vector<std::shared_ptr<package_x>> DBHandleProvider::GetPackages(
@@ -422,6 +444,17 @@ std::vector<std::shared_ptr<package_x>> DBHandleProvider::GetPackages(
     const std::string& package) {
   std::vector<std::shared_ptr<package_x>> ret;
 
+  /* make metadata filter map */
+  std::unordered_map<std::string, std::string> metadata_map;
+  for (auto* it = filter->list_pkg_metadata; it != nullptr;
+      it = g_slist_next(it)) {
+    auto node = reinterpret_cast<pkgmgrinfo_metadata_node_x*>(it->data);
+    if (node->key == nullptr)
+      continue;
+    LOG(ERROR) << "add metadata filter";
+    metadata_map[node->key] = (node->value ? node->value : "");
+  }
+
   if (internal::CheckPackageStorageStatus(filter)) {
     if (pkgmgrinfo_pkginfo_filter_add_bool(filter,
         PMINFO_PKGINFO_PROP_PACKAGE_CHECK_STORAGE, true) != PMINFO_R_OK) {
@@ -431,12 +464,13 @@ std::vector<std::shared_ptr<package_x>> DBHandleProvider::GetPackages(
   }
   if (package.empty()) {
     for (auto& info : pkg_map_) {
-      if (CheckPkgFilters(filter, info.second))
+      if (CheckPkgFilters(filter, info.second, metadata_map))
         ret.push_back(info.second);
     }
   } else {
     auto map_it = pkg_map_.find(package);
-    if (map_it != pkg_map_.end() && CheckPkgFilters(filter, map_it->second))
+    if (map_it != pkg_map_.end() && CheckPkgFilters(filter, map_it->second,
+        metadata_map))
       ret.push_back(map_it->second);
   }
 
@@ -449,35 +483,20 @@ void DBHandleProvider::AddPackage(std::string package,
 }
 
 inline bool CheckAppFilters(pkgmgrinfo_filter_x* filter,
-    const std::shared_ptr<application_x>& info,
-    const std::unordered_map<std::string, std::string>& metadata_map) {
-    for (auto* it = filter->list; it != nullptr; it = g_slist_next(it)) {
-      auto node = reinterpret_cast<pkgmgrinfo_node_x*>(it->data);
-      auto* checker = FilterCheckerProvider::GetInst().
-          GetAppFilterChecker(node->prop);
-      if (!checker->CheckFilter(node, info.get()))
-        return false;
-    }
-
-    bool pass = true;
-    if (!metadata_map.empty()) {
-      pass = false;
-      for (auto* it = info->metadata; it != nullptr; it = g_list_next(it)) {
-        auto* node = reinterpret_cast<metadata_x*>(it->data);
-        if (node->key != nullptr) {
-          auto metadata = metadata_map.find(node->key);
-          if (metadata == metadata_map.end())
-            continue;
-
-          if (metadata->second.empty() ||
-              strcmp(node->value ? node->value : "",
-                  metadata->second.c_str()) == 0)
-            return true;
-        }
-      }
-    }
+  const std::shared_ptr<application_x>& info,
+  const std::unordered_map<std::string, std::string>& metadata_map) {
+  for (auto* it = filter->list; it != nullptr; it = g_slist_next(it)) {
+    auto node = reinterpret_cast<pkgmgrinfo_node_x*>(it->data);
+    auto* checker = FilterCheckerProvider::GetInst().
+        GetAppFilterChecker(node->prop);
+    if (!checker->CheckFilter(node, info.get()))
+      return false;
+  }
 
-    return pass;
+  bool pass = true;
+  if (!metadata_map.empty())
+    pass = CheckMetadataFilter(info->metadata, metadata_map);
+  return pass;
 }
 
 std::vector<std::shared_ptr<application_x>> DBHandleProvider::GetApplications(