From 838e0af7f280c425dd4bb74fe77902afcf4a2812 Mon Sep 17 00:00:00 2001 From: Ilho Kim Date: Thu, 25 Feb 2021 22:24:42 +0900 Subject: [PATCH] Implement QueryHandler Signed-off-by: Ilho Kim --- src/common/database/query_handler.cc | 32 +++++++++++++++++++++++++++++++- src/common/database/query_handler.hh | 5 ++++- src/pkginfo_internal.c | 34 ++++++++++++++++++++++++++++++++++ src/pkgmgrinfo_internal.h | 1 + 4 files changed, 70 insertions(+), 2 deletions(-) diff --git a/src/common/database/query_handler.cc b/src/common/database/query_handler.cc index 2105eed..8d4d3d9 100644 --- a/src/common/database/query_handler.cc +++ b/src/common/database/query_handler.cc @@ -16,6 +16,8 @@ #include "query_handler.hh" +#include "pkgmgrinfo_internal.h" + namespace pkgmgr_common { namespace database { @@ -23,16 +25,44 @@ QueryHandler::QueryHandler(uid_t uid) : AbstractDBHandler(uid), uid_(uid) {} QueryHandler::~QueryHandler() {} -void QueryHandler::SetQuery(std::string query) {} +void QueryHandler::SetQuery(std::string query) { + query_ = query; +} std::string QueryHandler::GetString() { return std::string(); } int QueryHandler::GetInt() { return 0; } int QueryHandler::GetRecordCount() { return 0; } +std::vector>&& QueryHandler::GetResult() { + return std::move(result_); +} + bool QueryHandler::Execute() { SetOpType(OPERATION_TYPE_READ); SetDBType(DB_TYPE_FILE_PKGDB); + if (!Connect()) return false; + + // TODO: db handle should be delivered + GList* list =nullptr; + int row = 0; + int col = 0; + int ret = get_query_result(GetConnection(), query_.c_str(), &list, &row, &col); + if (ret != PMINFO_R_OK) { + // TODO: error log + return false; + } + + result_.clear(); + result_.resize(row); + GList* tmp = list; + for (int i = 0; i < row; ++i) { + for (int j = 0; j < col; ++j) { + result_[i].emplace_back(reinterpret_cast(tmp->data)); + tmp = tmp->next; + } + } + g_list_free(list); return true; } diff --git a/src/common/database/query_handler.hh b/src/common/database/query_handler.hh index 68de496..a1df5b4 100644 --- a/src/common/database/query_handler.hh +++ b/src/common/database/query_handler.hh @@ -18,6 +18,7 @@ #define QUERY_HANDLER_HH_ #include +#include #include @@ -43,10 +44,12 @@ class EXPORT_API QueryHandler : public AbstractDBHandler{ int GetInt(); int GetRecordCount(); bool Execute() override; + std::vector>&& GetResult(); private: uid_t uid_; - pkgmgr_certinfo_x* handle_ = nullptr; + std::string query_; + std::vector> result_; }; } // namespace database diff --git a/src/pkginfo_internal.c b/src/pkginfo_internal.c index a0fe7d8..827e2ad 100644 --- a/src/pkginfo_internal.c +++ b/src/pkginfo_internal.c @@ -578,3 +578,37 @@ API int pkginfo_internal_filter_get_list( *pkginfo_list = list; return PMINFO_R_OK; } + +API int get_query_result(sqlite3 *db, const char *query, + GList **list, int *row, int *col) { + int ret = 0; + int col_cnt = 0; + int row_cnt = 0; + int idx = 0; + sqlite3_stmt *stmt = NULL; + char *result = NULL; + + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + LOGE("prepare failed: %s", sqlite3_errmsg(db)); + return PMINFO_R_ERROR; + } + + col_cnt = sqlite3_column_count(stmt); + + while (sqlite3_step(stmt) == SQLITE_ROW) { + row_cnt++; + for (idx = 0; idx < col_cnt; ++idx) { + _save_column_str(stmt, idx, &result); + *list = g_list_append(*list, result); + result = NULL; + } + } + + *row = row_cnt; + *col = col_cnt; + + sqlite3_finalize(stmt); + + return PMINFO_R_OK; +} diff --git a/src/pkgmgrinfo_internal.h b/src/pkgmgrinfo_internal.h index 31ccab4..8697af7 100644 --- a/src/pkgmgrinfo_internal.h +++ b/src/pkgmgrinfo_internal.h @@ -20,6 +20,7 @@ int appinfo_internal_filter_get_list(sqlite3 *db, pkgmgrinfo_appinfo_filter_h fi int certinfo_internal_get(sqlite3 *db, const char *pkgid, uid_t uid, pkgmgrinfo_certinfo_h certinfo); int certinfo_internal_set(sqlite3 *db, const char *pkgid, pkgmgrinfo_instcertinfo_h handle, uid_t uid); int certinfo_internal_delete(sqlite3 *db, const char *pkgid); +int get_query_result(sqlite3 *db, const char *query, GList **list, int *row, int *col); /** @} */ #ifdef __cplusplus } -- 2.7.4