[Contact] - fixing problem with timeUsed attribute
authorAndrzej Popowski <a.popowski@samsung.com>
Mon, 18 Jan 2016 14:27:43 +0000 (15:27 +0100)
committerAndrzej Popowski <a.popowski@samsung.com>
Mon, 18 Jan 2016 14:27:43 +0000 (15:27 +0100)
Change-Id: Ia0b50368bf65fd5defd270cdff8246a9ae884124
Signed-off-by: Andrzej Popowski <a.popowski@samsung.com>
src/contact/contact_manager.cc
src/contact/contact_search_engine.cc
src/contact/contact_search_engine.h

index d90788c78acf0ab89e7cc96b00beb4cce77fb787..5a6181a673da7d0c56d877968f14d5371ab10353 100755 (executable)
@@ -28,6 +28,7 @@
 #include <contacts_db_extension.h>
 #include "contact/contact_instance.h"
 #include "contact/person.h"
+#include "contact/contact_search_engine.h"
 
 namespace extension {
 namespace contact {
@@ -180,27 +181,21 @@ PlatformResult ContactManagerGetInternal(int person_id, JsonObject* out) {
   PlatformResult status =
       ContactUtil::ImportPersonFromContactsRecord(contacts_record, out);
 
-  if (CONTACTS_ERROR_NONE != contacts_record_destroy(contacts_record, true)) {
-    LoggerE("failed to destroy contacts_record_h");
+  if (status.IsError()) {
+    if (CONTACTS_ERROR_NONE != contacts_record_destroy(contacts_record, true)) {
+      LoggerE("failed to destroy contacts_record_h");
+    }
+    return status;
   }
 
-  if (status.IsError()) return status;
-
   //get information from view _contacts_person_usage
-  error_code = contacts_db_get_record(_contacts_person_usage._uri, person_id,
-                                          &contacts_record);
-  if (CONTACTS_ERROR_NONE != error_code) {
-    LoggerE("Person with id: %d, not found, error: %d", person_id, error_code);
-    return PlatformResult(ErrorCode::NOT_FOUND_ERR, "Person not found");
-  }
-
-  status = ContactUtil::ImportPersonFromContactsUsageRecord(contacts_record, out);
-
+  status = ContactSearchEngine::GetPersonUsage(person_id, out);
   if (CONTACTS_ERROR_NONE != contacts_record_destroy(contacts_record, true)) {
     LoggerE("failed to destroy contacts_record_h");
   }
-
-  if (status.IsError()) return status;
+  if (!status) {
+    return status;
+  }
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 }
index f1297fdf8a896f9b50c25dc1c7abc2a501a51586..bc11b0be0124b9ed9c9ce712083c2456bc00da1a 100644 (file)
@@ -633,6 +633,81 @@ PlatformResult ContactSearchEngine::GetContacts(Iterator begin, Iterator end,
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
+PlatformResult ContactSearchEngine::GetPersonUsage(int person_id, JsonObject* out_ptr) {
+  LoggerD("Entered");
+
+  contacts_query_h query = nullptr;
+  contacts_filter_h filter = nullptr;
+  contacts_list_h list = nullptr;
+  PlatformResult status(ErrorCode::NO_ERROR);
+
+  int error_code = contacts_query_create(_contacts_person_usage._uri, &query);
+  status = ContactUtil::ErrorChecker(error_code, "Failed contacts_query_create");
+  if (!status) {
+    return status;
+  }
+  ContactUtil::ContactsQueryHPtr query_ptr(&query, ContactUtil::ContactsQueryDeleter);
+
+  error_code = contacts_filter_create(_contacts_person_usage._uri, &filter);
+  status = ContactUtil::ErrorChecker(error_code, "Failed contacts_filter_create");
+  if (!status) {
+    return status;
+  }
+  ContactUtil::ContactsFilterPtr filter_ptr(filter, ContactUtil::ContactsFilterDeleter);
+
+  error_code = contacts_filter_add_int(filter,
+                                       _contacts_person_usage.person_id,
+                                       CONTACTS_MATCH_EQUAL,
+                                       person_id);
+  status = ContactUtil::ErrorChecker(error_code, "Failed contacts_filter_add_int");
+  if (!status) {
+    return status;
+  }
+
+  error_code = contacts_query_set_filter(query, filter);
+  status = ContactUtil::ErrorChecker(error_code, "Failed contacts_query_set_filter");
+  if (!status) {
+    return status;
+  }
+
+  error_code = contacts_db_get_records_with_query(query, 0, 0, &list);
+  status = ContactUtil::ErrorChecker(error_code, "Failed contacts_db_get_records_with_query");
+  if (!status) {
+    return status;
+  }
+  ContactUtil::ContactsListHPtr list_ptr(&list, ContactUtil::ContactsListDeleter);
+
+  int record_count = 0;
+  error_code = contacts_list_get_count(list, &record_count);
+  status = ContactUtil::ErrorChecker(error_code, "Failed contacts_list_get_count");
+  if (!status) {
+    return status;
+  }
+
+  if (record_count == 1) {
+    contacts_record_h record = nullptr;
+
+    contacts_list_first(list);
+    error_code = contacts_list_get_current_record_p(list, &record);
+    status = ContactUtil::ErrorChecker(error_code, "Failed contacts_list_get_current_record_p");
+    if (!status) {
+      return status;
+    }
+
+    int times_used = 0;
+    error_code = contacts_record_get_int(record, _contacts_person_usage.times_used, &times_used);
+    status = ContactUtil::ErrorChecker(error_code, "Failed contacts_record_get_int");
+    if (!status) {
+      return status;
+    }
+    out_ptr->insert(std::make_pair("timesUsed", JsonValue(static_cast<double>(times_used))));
+  } else {
+    out_ptr->insert(std::make_pair("timesUsed", JsonValue(static_cast<double>(0))));
+  }
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
 common::PlatformResult ContactSearchEngine::GetQueryResults(
     contacts_query_h query, contacts_filter_h filter, unsigned int property_id,
     LongSetPtr result) {
index 7cc91ed4ec5cb05336b0457859b76fc9f5818fa4..f859b36f30a816031b395f595661ae78cf4be6ac 100644 (file)
@@ -27,6 +27,7 @@
 #include "common/filter-utils.h"
 #include "common/picojson.h"
 #include "common/platform_result.h"
+#include "contact/contact_util.h"
 
 namespace extension {
 namespace contact {
@@ -41,6 +42,8 @@ class ContactSearchEngine {
 
   common::PlatformResult Find(picojson::array* out);
 
+  static common::PlatformResult GetPersonUsage(int person_id, JsonObject* out_ptr);
+
  private:
   typedef std::vector<long> LongVector;
   typedef std::shared_ptr<LongVector> LongVectorPtr;
@@ -85,7 +88,6 @@ class ContactSearchEngine {
   template<typename Iterator>
   common::PlatformResult GetContacts(Iterator begin, Iterator end,
                                      picojson::array* out);
-
   common::PlatformResult QueryAttributeBool(
       const FilterPropertyStruct& attribute_properties, LongSetPtr result,
       bool match_value);