QueryMaker __query_maker;
-void __free_argument(gpointer data) {
- query_args* args = reinterpret_cast<query_args*>(data);
- g_list_free(args->argument);
- free(args);
-}
-
-void __free_query_list(GList* queries, GList* args_list) {
- g_list_free(queries);
- g_list_free_full(args_list, __free_argument);
-}
-
} // namespace
namespace pkgmgr_server {
return std::move(result_);
}
-int QueryHandler::ExecuteReadQuery(GList* queries, GList* args_list) {
+int QueryHandler::ExecuteReadQuery(const std::vector<std::string>& queries,
+ const std::vector<std::vector<std::optional<std::string>>>& 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();
+ const auto& 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);
+ for (const auto& conn : conn_list) {
+ int i = 0;
+ for (auto& q : queries) {
+ std::vector<std::vector<std::optional<std::string>>> result;
+ ret = internal::GetQueryResult(conn.first, q, args_list[i++], result);
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));
+ for (auto& r : result) {
+ result_.push_back(std::move(r));
}
-
- g_list_free_full(list, free);
}
}
return ret;
}
-int QueryHandler::ExecuteWriteQuery(GList* queries, GList* args_list,
+int QueryHandler::ExecuteWriteQuery(const std::vector<std::string>& queries,
+ const std::vector<std::vector<std::optional<std::string>>>& args_list,
const std::vector<std::pair<CacheChangeFlag, std::string>>& changes) {
std::unique_lock<std::shared_mutex> u(lock_);
if (!Connect()) {
return PMINFO_R_ERROR;
}
- std::vector<std::pair<sqlite3*, uid_t>> conn_list = GetConnection();
+ const auto& conn_list = GetConnection();
int ret = PMINFO_R_ERROR;
bool is_writer = DBHandleProvider::IsWriter(GetPID());
- for (auto& conn : conn_list) {
- ret = execute_write_queries(conn.first, queries, args_list);
+ for (const auto& conn : conn_list) {
+ ret = internal::ExecuteWriteQueries(conn.first, queries, args_list);
if (ret != PMINFO_R_OK) {
LOG(ERROR) << "Failed to execute";
break;
}
int QueryHandler::Execute() {
- GList* queries = nullptr;
- GList* args_list = nullptr;
+ std::vector<std::string> queries;
+ std::vector<std::vector<std::optional<std::string>>> args_list;
std::vector<std::pair<CacheChangeFlag, std::string>> changes;
for (auto& [queryIndex, args] : query_args_) {
const auto& query_info = __query_maker.GetQueryInfo(queryIndex);
const char* query = std::get<0>(query_info);
if (query == nullptr) {
LOG(ERROR) << "Failed to get query";
- __free_query_list(queries, args_list);
return PMINFO_R_ERROR;
}
- queries = g_list_append(queries, (gpointer)query);
- query_args* arg = reinterpret_cast<query_args*>(
- calloc(1, sizeof(query_args)));
- if (arg == nullptr) {
- LOG(ERROR) << "Out of memory";
- __free_query_list(queries, args_list);
- return PMINFO_R_ERROR;
- }
- arg->len = args.size();
- for (auto& argument : args) {
- arg->argument = g_list_append(arg->argument,
- gpointer(argument ? (*argument).c_str() : nullptr));
- }
-
- args_list = g_list_append(args_list, arg);
+ queries.push_back(query);
+ args_list.push_back(args);
if (GetOpType() == pkgmgr_common::DBOperationType::OPERATION_TYPE_READ)
continue;
unsigned int idx = std::get<2>(query_info);
if (args.size() <= idx) {
LOG(ERROR) << "Invalid query argument";
- __free_query_list(queries, args_list);
return PMINFO_R_ERROR;
}
if (GetOpType() == pkgmgr_common::DBOperationType::OPERATION_TYPE_READ) {
int ret = ExecuteReadQuery(queries, args_list);
- __free_query_list(queries, args_list);
return ret;
} else {
int ret = ExecuteWriteQuery(queries, args_list, changes);
- __free_query_list(queries, args_list);
return ret;
}
}