Set the timeout to 60 for write query request 44/282744/3
authorIlho Kim <ilho159.kim@samsung.com>
Tue, 11 Oct 2022 06:08:11 +0000 (15:08 +0900)
committerIlho Kim <ilho159.kim@samsung.com>
Tue, 11 Oct 2022 06:42:00 +0000 (15:42 +0900)
Change-Id: Idcbccef4c5147b6c6d0988d1253cf63c929f9dba
Signed-off-by: Ilho Kim <ilho159.kim@samsung.com>
src/common/request_type.cc
src/common/request_type.hh
src/common/socket/client_socket.cc
src/manager/pkginfo_manager.cc
src/server/database/query_handler.cc
src/server/database/query_handler.hh
src/server/request_handler/request_handler_direct_access.cc
src/server/request_handler_factory.cc
test/unit_tests/test_request_type.cc

index 6a39760..7f3bee9 100644 (file)
@@ -26,7 +26,8 @@ const char* ReqTypeToString(ReqType type) {
       "SET_CERT_INFO",
       "GET_CERT_INFO",
       "GET_PKG_DEP_INFO",
-      "QUERY",
+      "READ_QUERY",
+      "WRITE_QUERY",
       "COMMAND",
       "CREATE_DB",
       "CREATE_CACHE",
index 23e6d00..4f3ba0c 100644 (file)
@@ -33,7 +33,8 @@ enum ReqType {
   SET_CERT_INFO,
   GET_CERT_INFO,
   GET_PKG_DEP_INFO,
-  QUERY,
+  READ_QUERY,
+  WRITE_QUERY,
   COMMAND,
   CREATE_DB,
   CREATE_CACHE,
index 3eda1e5..f386e00 100644 (file)
@@ -31,7 +31,8 @@ namespace {
 
 bool IsDBWriteRequest(pkgmgr_common::ReqType req_type) {
   if (req_type != pkgmgr_common::ReqType::SET_PKG_INFO &&
-      req_type != pkgmgr_common::ReqType::SET_CERT_INFO)
+      req_type != pkgmgr_common::ReqType::SET_CERT_INFO &&
+      req_type != pkgmgr_common::ReqType::WRITE_QUERY)
     return false;
 
   return true;
index 0515e47..c6d5bb1 100644 (file)
@@ -202,7 +202,7 @@ extern "C" EXPORT_API char* _appinfo_get_localed_label(
           pkgmgr_common::DBOperationType::OPERATION_TYPE_READ));
 
   pkgmgr_client::PkgInfoClient client(parcelable, uid,
-      pkgmgr_common::ReqType::QUERY);
+      pkgmgr_common::ReqType::READ_QUERY);
   if (!client.SendRequest())
     return nullptr;
 
@@ -241,7 +241,7 @@ extern "C" EXPORT_API int _appinfo_get_datacontrol_info(
           pkgmgr_common::DBOperationType::OPERATION_TYPE_READ));
 
   pkgmgr_client::PkgInfoClient client(parcelable, uid,
-      pkgmgr_common::ReqType::QUERY);
+      pkgmgr_common::ReqType::READ_QUERY);
   if (!client.SendRequest())
     return PMINFO_R_ERROR;
 
@@ -294,7 +294,7 @@ extern "C" EXPORT_API int _appinfo_get_datacontrol_appid(
           pkgmgr_common::DBOperationType::OPERATION_TYPE_READ));
 
   pkgmgr_client::PkgInfoClient client(parcelable, uid,
-      pkgmgr_common::ReqType::QUERY);
+      pkgmgr_common::ReqType::READ_QUERY);
   if (!client.SendRequest())
     return PMINFO_R_ERROR;
 
@@ -338,7 +338,7 @@ extern "C" EXPORT_API int _appinfo_get_datacontrol_trusted_info(
           pkgmgr_common::DBOperationType::OPERATION_TYPE_READ));
 
   pkgmgr_client::PkgInfoClient client(parcelable, uid,
-      pkgmgr_common::ReqType::QUERY);
+      pkgmgr_common::ReqType::READ_QUERY);
   if (!client.SendRequest())
     return PMINFO_R_ERROR;
 
@@ -392,7 +392,7 @@ extern "C" EXPORT_API int _appinfo_get_datacontrol_privileges(
           pkgmgr_common::DBOperationType::OPERATION_TYPE_READ));
 
   pkgmgr_client::PkgInfoClient client(parcelable, uid,
-      pkgmgr_common::ReqType::QUERY);
+      pkgmgr_common::ReqType::READ_QUERY);
   if (!client.SendRequest())
     return PMINFO_R_ERROR;
 
@@ -432,7 +432,7 @@ extern "C" EXPORT_API int _appinfo_get_appcontrol_privileges(
           pkgmgr_common::DBOperationType::OPERATION_TYPE_READ));
 
   pkgmgr_client::PkgInfoClient client(parcelable, uid,
-      pkgmgr_common::ReqType::QUERY);
+      pkgmgr_common::ReqType::READ_QUERY);
   if (!client.SendRequest())
     return PMINFO_R_ERROR;
 
@@ -486,7 +486,7 @@ extern "C" EXPORT_API int _plugininfo_get_appids(
           pkgmgr_common::DBOperationType::OPERATION_TYPE_READ));
 
   pkgmgr_client::PkgInfoClient client(parcelable, _getuid(),
-      pkgmgr_common::ReqType::QUERY);
+      pkgmgr_common::ReqType::READ_QUERY);
   if (!client.SendRequest())
     return PMINFO_R_ERROR;
 
@@ -571,7 +571,7 @@ extern "C" EXPORT_API int _get_pkg_updateinfo(const char* pkgid,
           pkgmgr_common::DBOperationType::OPERATION_TYPE_READ));
 
   pkgmgr_client::PkgInfoClient client(parcelable, uid,
-      pkgmgr_common::ReqType::QUERY);
+      pkgmgr_common::ReqType::READ_QUERY);
   if (!client.SendRequest())
     return PMINFO_R_ERROR;
 
@@ -657,7 +657,7 @@ extern "C" EXPORT_API int _pkginfo_set_usr_installed_storage(const char* pkgid,
           pkgmgr_common::DBOperationType::OPERATION_TYPE_WRITE));
 
   pkgmgr_client::PkgInfoClient client(parcelable, uid,
-      pkgmgr_common::ReqType::QUERY);
+      pkgmgr_common::ReqType::WRITE_QUERY);
   if (!client.SendRequest())
     return PMINFO_R_ERROR;
 
@@ -673,7 +673,7 @@ extern "C" EXPORT_API int _certinfo_compare_pkg_certinfo(const char* l_pkgid,
           pkgmgr_common::DBType::DB_TYPE_FILE_CERTDB,
           pkgmgr_common::DBOperationType::OPERATION_TYPE_READ));
   pkgmgr_client::PkgInfoClient client(parcelable, 0,
-      pkgmgr_common::ReqType::QUERY);
+      pkgmgr_common::ReqType::READ_QUERY);
   if (!client.SendRequest())
     return PMINFO_R_ERROR;
 
@@ -720,7 +720,7 @@ extern "C" EXPORT_API int _certinfo_compare_app_certinfo(uid_t uid,
           pkgmgr_common::DBType::DB_TYPE_FILE_PKGDB,
           pkgmgr_common::DBOperationType::OPERATION_TYPE_READ));
   pkgmgr_client::PkgInfoClient client(parcelable, uid,
-      pkgmgr_common::ReqType::QUERY);
+      pkgmgr_common::ReqType::READ_QUERY);
   if (!client.SendRequest())
     return PMINFO_R_ERROR;
 
@@ -769,7 +769,7 @@ extern "C" EXPORT_API int _parser_execute_write_query(
           pkgmgr_common::DBOperationType::OPERATION_TYPE_WRITE));
 
   pkgmgr_client::PkgInfoClient client(parcelable, uid,
-                                      pkgmgr_common::ReqType::QUERY);
+                                      pkgmgr_common::ReqType::WRITE_QUERY);
   if (!client.SendRequest())
     return PMINFO_R_ERROR;
 
@@ -795,7 +795,7 @@ extern "C" EXPORT_API int _parser_execute_write_queries(
           pkgmgr_common::DBOperationType::OPERATION_TYPE_WRITE));
 
   pkgmgr_client::PkgInfoClient client(parcelable, uid,
-      pkgmgr_common::ReqType::QUERY);
+      pkgmgr_common::ReqType::WRITE_QUERY);
   if (!client.SendRequest())
     return PMINFO_R_ERROR;
 
@@ -917,7 +917,7 @@ extern "C" EXPORT_API int _pkginfo_delete_certinfo(const char* pkgid) {
           pkgmgr_common::DBOperationType::OPERATION_TYPE_WRITE));
 
   pkgmgr_client::PkgInfoClient client(parcelable, 0,
-                                      pkgmgr_common::ReqType::QUERY);
+                                      pkgmgr_common::ReqType::WRITE_QUERY);
   if (!client.SendRequest())
     return PMINFO_R_ERROR;
 
index 9d3624f..f85dcee 100644 (file)
@@ -219,13 +219,70 @@ std::vector<pkgmgr_common::parcel::StrArgs> QueryHandler::GetResult() {
   return std::move(result_);
 }
 
-int QueryHandler::Execute() {
+int QueryHandler::ExecuteReadQuery(GList* queries, GList* args_list) {
   std::shared_lock<std::shared_mutex> s(lock_);
   if (!Connect()) {
     LOG(ERROR) << "Failed to connect database";
     return PMINFO_R_ERROR;
   }
 
+  std::vector<std::pair<sqlite3*, uid_t>> conn_list = GetConnection();
+  int ret = PMINFO_R_ERROR;
+  for (auto& conn : conn_list) {
+    for (GList* it = args_list; it; it = it->next) {
+      GList* list = nullptr;
+      int row = 0;
+      int col = 0;
+
+      query_args* params = reinterpret_cast<query_args*>(it->data);
+      ret = get_query_result(conn.first, (const char *)queries->data,
+          params->argument, &list, &row, &col);
+      if (ret == PMINFO_R_ERROR) {
+        LOG(ERROR) << "Failed to execute query";
+        return ret;
+      }
+
+      GList* tmp = list;
+      for (int i = 0; i < row; ++i) {
+        pkgmgr_common::parcel::StrArgs vt;
+        for (int j = 0; j < col; ++j) {
+          if (!tmp->data)
+            vt.emplace_back(std::nullopt);
+          else
+            vt.emplace_back(reinterpret_cast<char *>(tmp->data));
+          tmp = tmp->next;
+        }
+        result_.emplace_back(std::move(vt));
+      }
+
+      g_list_free_full(list, free);
+    }
+  }
+
+  return ret;
+}
+
+int QueryHandler::ExecuteWriteQuery(GList* queries, GList* args_list) {
+  std::unique_lock<std::shared_mutex> u(lock_);
+  if (!Connect()) {
+    LOG(ERROR) << "Failed to connect database";
+    return PMINFO_R_ERROR;
+  }
+
+  std::vector<std::pair<sqlite3*, uid_t>> conn_list = GetConnection();
+  int ret = PMINFO_R_ERROR;
+  for (auto& conn : conn_list) {
+    ret = execute_write_queries(conn.first, queries, args_list);
+    if (ret != PMINFO_R_OK) {
+      LOG(ERROR) << "Failed to execute";
+      break;
+    }
+  }
+  database::DBHandleProvider::GetInst(GetUID()).TrimCache();
+  return ret;
+}
+
+int QueryHandler::Execute() {
   GList* queries = nullptr;
   GList* args_list = nullptr;
   for (auto& i : query_args_) {
@@ -253,56 +310,15 @@ int QueryHandler::Execute() {
     args_list = g_list_append(args_list, arg);
   }
 
-  std::vector<std::pair<sqlite3*, uid_t>> conn_list = GetConnection();
-  int ret = PMINFO_R_ERROR;
   if (GetOpType() == pkgmgr_common::DBOperationType::OPERATION_TYPE_READ) {
-    for (auto& conn : conn_list) {
-      for (GList* it = args_list; it; it = it->next) {
-        GList* list = nullptr;
-        int row = 0;
-        int col = 0;
-
-        query_args* params = reinterpret_cast<query_args*>(it->data);
-        ret = get_query_result(conn.first, (const char *)queries->data,
-            params->argument, &list, &row, &col);
-        if (ret == PMINFO_R_ERROR) {
-          LOG(ERROR) << "Failed to execute query";
-          __free_query_list(queries, args_list);
-          return ret;
-        }
-
-        GList* tmp = list;
-        for (int i = 0; i < row; ++i) {
-          pkgmgr_common::parcel::StrArgs vt;
-          for (int j = 0; j < col; ++j) {
-            if (!tmp->data)
-              vt.emplace_back(std::nullopt);
-            else
-              vt.emplace_back(reinterpret_cast<char *>(tmp->data));
-            tmp = tmp->next;
-          }
-          result_.emplace_back(std::move(vt));
-        }
-
-        g_list_free_full(list, free);
-      }
-    }
+    int ret = ExecuteReadQuery(queries, args_list);
     __free_query_list(queries, args_list);
-
     return ret;
   } else {
-    for (auto& conn : conn_list) {
-      ret = execute_write_queries(conn.first, queries, args_list);
-      if (ret != PMINFO_R_OK) {
-        LOG(ERROR) << "Failed to execute";
-        break;
-      }
-    }
+    int ret = ExecuteWriteQuery(queries, args_list);
     __free_query_list(queries, args_list);
-    database::DBHandleProvider::GetInst(GetUID()).TrimCache();
     return ret;
   }
-  return ret;
 }
 
 }  // namespace database
index 7b39a3a..b060508 100644 (file)
@@ -49,6 +49,9 @@ class EXPORT_API QueryHandler : public AbstractDBHandler {
   std::vector<pkgmgr_common::parcel::StrArgs> GetResult();
 
  private:
+  int ExecuteReadQuery(GList* queries, GList* args_list);
+  int ExecuteWriteQuery(GList* queries, GList* args_list);
+
   uid_t uid_;
   std::vector<std::string> query_;
   std::vector<pkgmgr_common::parcel::QueryArgs> query_args_;
index afaa3a8..ad739b1 100644 (file)
@@ -69,7 +69,10 @@ extern "C" EXPORT_API void* _request_handler_direct_access(int req_type,
       handler.reset(
           new pkgmgr_server::request_handler::GetDepinfoRequestHandler());
       break;
-    case pkgmgr_common::ReqType::QUERY:
+    case pkgmgr_common::ReqType::READ_QUERY:
+      handler.reset(new pkgmgr_server::request_handler::QueryRequestHandler());
+      break;
+    case pkgmgr_common::ReqType::WRITE_QUERY:
       handler.reset(new pkgmgr_server::request_handler::QueryRequestHandler());
       break;
     case pkgmgr_common::ReqType::COMMAND:
index cdb3f1f..0da6956 100644 (file)
@@ -43,7 +43,9 @@ RequestHandlerFactory::RequestHandlerFactory() {
       new request_handler::GetCertRequestHandler());
   handler[pkgmgr_common::ReqType::GET_PKG_DEP_INFO].reset(
       new request_handler::GetDepinfoRequestHandler());
-  handler[pkgmgr_common::ReqType::QUERY].reset(
+  handler[pkgmgr_common::ReqType::READ_QUERY].reset(
+      new request_handler::QueryRequestHandler());
+  handler[pkgmgr_common::ReqType::WRITE_QUERY].reset(
       new request_handler::QueryRequestHandler());
   handler[pkgmgr_common::ReqType::COMMAND].reset(
       new request_handler::CommandRequestHandler());
index d92edd9..586c6bc 100644 (file)
@@ -61,9 +61,14 @@ TEST_F(RequestTypeTest, GetPkgDepInfoTypeTest) {
   EXPECT_EQ(strcmp(ReqTypeToString(type), "GET_PKG_DEP_INFO"), 0);
 }
 
-TEST_F(RequestTypeTest, QueryTypeTest) {
-  pc::ReqType type = pc::ReqType::QUERY;
-  EXPECT_EQ(strcmp(ReqTypeToString(type), "QUERY"), 0);
+TEST_F(RequestTypeTest, GetQueryTypeTest) {
+  pc::ReqType type = pc::ReqType::READ_QUERY;
+  EXPECT_EQ(strcmp(ReqTypeToString(type), "READ_QUERY"), 0);
+}
+
+TEST_F(RequestTypeTest, SetQueryTypeTest) {
+  pc::ReqType type = pc::ReqType::WRITE_QUERY;
+  EXPECT_EQ(strcmp(ReqTypeToString(type), "WRITE_QUERY"), 0);
 }
 
 TEST_F(RequestTypeTest, CommandTypeTest) {