From 83b42e802061dbfdf56edd72421c86ee4ae51ddf Mon Sep 17 00:00:00 2001 From: Ilho Kim Date: Tue, 11 Oct 2022 15:08:11 +0900 Subject: [PATCH] Set the timeout to 60 for write query request Change-Id: Idcbccef4c5147b6c6d0988d1253cf63c929f9dba Signed-off-by: Ilho Kim --- src/common/request_type.cc | 3 +- src/common/request_type.hh | 3 +- src/common/socket/client_socket.cc | 3 +- src/manager/pkginfo_manager.cc | 28 +++--- src/server/database/query_handler.cc | 104 ++++++++++++--------- src/server/database/query_handler.hh | 3 + .../request_handler_direct_access.cc | 5 +- src/server/request_handler_factory.cc | 4 +- test/unit_tests/test_request_type.cc | 11 ++- 9 files changed, 98 insertions(+), 66 deletions(-) diff --git a/src/common/request_type.cc b/src/common/request_type.cc index 6a39760..7f3bee9 100644 --- a/src/common/request_type.cc +++ b/src/common/request_type.cc @@ -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", diff --git a/src/common/request_type.hh b/src/common/request_type.hh index 23e6d00..4f3ba0c 100644 --- a/src/common/request_type.hh +++ b/src/common/request_type.hh @@ -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, diff --git a/src/common/socket/client_socket.cc b/src/common/socket/client_socket.cc index 3eda1e5..f386e00 100644 --- a/src/common/socket/client_socket.cc +++ b/src/common/socket/client_socket.cc @@ -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; diff --git a/src/manager/pkginfo_manager.cc b/src/manager/pkginfo_manager.cc index 0515e47..c6d5bb1 100644 --- a/src/manager/pkginfo_manager.cc +++ b/src/manager/pkginfo_manager.cc @@ -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; diff --git a/src/server/database/query_handler.cc b/src/server/database/query_handler.cc index 9d3624f..f85dcee 100644 --- a/src/server/database/query_handler.cc +++ b/src/server/database/query_handler.cc @@ -219,13 +219,70 @@ std::vector QueryHandler::GetResult() { return std::move(result_); } -int QueryHandler::Execute() { +int QueryHandler::ExecuteReadQuery(GList* queries, GList* args_list) { std::shared_lock s(lock_); if (!Connect()) { LOG(ERROR) << "Failed to connect database"; return PMINFO_R_ERROR; } + std::vector> 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(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(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 u(lock_); + if (!Connect()) { + LOG(ERROR) << "Failed to connect database"; + return PMINFO_R_ERROR; + } + + std::vector> 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> 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(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(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 diff --git a/src/server/database/query_handler.hh b/src/server/database/query_handler.hh index 7b39a3a..b060508 100644 --- a/src/server/database/query_handler.hh +++ b/src/server/database/query_handler.hh @@ -49,6 +49,9 @@ class EXPORT_API QueryHandler : public AbstractDBHandler { std::vector GetResult(); private: + int ExecuteReadQuery(GList* queries, GList* args_list); + int ExecuteWriteQuery(GList* queries, GList* args_list); + uid_t uid_; std::vector query_; std::vector query_args_; diff --git a/src/server/request_handler/request_handler_direct_access.cc b/src/server/request_handler/request_handler_direct_access.cc index afaa3a8..ad739b1 100644 --- a/src/server/request_handler/request_handler_direct_access.cc +++ b/src/server/request_handler/request_handler_direct_access.cc @@ -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: diff --git a/src/server/request_handler_factory.cc b/src/server/request_handler_factory.cc index cdb3f1f..0da6956 100644 --- a/src/server/request_handler_factory.cc +++ b/src/server/request_handler_factory.cc @@ -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()); diff --git a/test/unit_tests/test_request_type.cc b/test/unit_tests/test_request_type.cc index d92edd9..586c6bc 100644 --- a/test/unit_tests/test_request_type.cc +++ b/test/unit_tests/test_request_type.cc @@ -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) { -- 2.7.4