From 38c17f093615a16a4b4ec6dc2b5d3edb5c1d3895 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Thu, 27 Sep 2018 21:40:52 -0400 Subject: More hkutil refactoring All database access goes through hatkirby::database now. verbly::token, verbly::statement::condition, and verbly::part have been converted to use mpark::variant now. verbly::binding has been deleted, and replaced with a mpark::variant typedef in statement.h. This means that the only remaining tagged union class is verbly::generator::part. refs #5 --- lib/database.cpp | 123 ++++++++++--------------------------------------------- 1 file changed, 21 insertions(+), 102 deletions(-) (limited to 'lib/database.cpp') diff --git a/lib/database.cpp b/lib/database.cpp index fe64763..96eed45 100644 --- a/lib/database.cpp +++ b/lib/database.cpp @@ -1,48 +1,19 @@ #include "database.h" -#include -#include #include #include "query.h" #include "version.h" namespace verbly { - database::database(std::string path) + database::database( + std::string path) : + ppdb_(std::move(path), hatkirby::dbmode::read) { - if (sqlite3_open_v2(path.c_str(), &ppdb_, SQLITE_OPEN_READONLY, NULL) != SQLITE_OK) - { - // We still have to free the resources allocated. In the event that - // allocation failed, ppdb will be null and sqlite3_close_v2 will just - // ignore it. - std::string errmsg(sqlite3_errmsg(ppdb_)); - sqlite3_close_v2(ppdb_); - - throw database_error("Could not open verbly datafile", errmsg); - } - - std::string queryString = "SELECT major, minor FROM version"; - - sqlite3_stmt* ppstmt; - if (sqlite3_prepare_v2(ppdb_, queryString.c_str(), queryString.length(), &ppstmt, NULL) != SQLITE_OK) - { - std::string errorMsg = sqlite3_errmsg(ppdb_); - sqlite3_finalize(ppstmt); - - throw database_error("Error reading database version", errorMsg); - } - - if (sqlite3_step(ppstmt) != SQLITE_ROW) - { - std::string errorMsg = sqlite3_errmsg(ppdb_); - sqlite3_finalize(ppstmt); - - throw database_error("Error reading database version", errorMsg); - } + hatkirby::row version = + ppdb_.queryFirst("SELECT major, minor FROM version"); - major_ = sqlite3_column_int(ppstmt, 0); - minor_ = sqlite3_column_int(ppstmt, 1); - - sqlite3_finalize(ppstmt); + major_ = mpark::get(version[0]); + minor_ = mpark::get(version[1]); if (major_ != DATABASE_MAJOR_VERSION) { @@ -50,28 +21,6 @@ namespace verbly { } } - database::database(database&& other) : database() - { - swap(*this, other); - } - - database& database::operator=(database&& other) - { - swap(*this, other); - - return *this; - } - - void swap(database& first, database& second) - { - std::swap(first.ppdb_, second.ppdb_); - } - - database::~database() - { - sqlite3_close_v2(ppdb_); - } - query database::notions(filter where, order sortOrder, int limit) const { return query(*this, ppdb_, std::move(where), std::move(sortOrder), limit); @@ -104,65 +53,35 @@ namespace verbly { std::set database::selrestrs(int partId) const { - std::string queryString = "SELECT selrestr FROM selrestrs WHERE part_id = ?"; - - sqlite3_stmt* ppstmt; - if (sqlite3_prepare_v2(ppdb_, queryString.c_str(), queryString.length(), &ppstmt, NULL) != SQLITE_OK) - { - std::string errorMsg = sqlite3_errmsg(ppdb_); - sqlite3_finalize(ppstmt); - - throw database_error("Error preparing query", errorMsg); - } - - if (sqlite3_bind_int(ppstmt, 1, partId) != SQLITE_OK) - { - std::string errorMsg = sqlite3_errmsg(ppdb_); - sqlite3_finalize(ppstmt); - - throw database_error("Error binding value to query", errorMsg); - } + std::vector rows = + ppdb_.queryAll( + "SELECT selrestr FROM selrestrs WHERE part_id = ?", + { partId }); std::set result; - while (sqlite3_step(ppstmt) == SQLITE_ROW) + + for (hatkirby::row& r : rows) { - result.insert(reinterpret_cast(sqlite3_column_blob(ppstmt, 0))); + result.emplace(std::move(mpark::get(r[0]))); } - sqlite3_finalize(ppstmt); - return result; } std::set database::synrestrs(int partId) const { - std::string queryString = "SELECT synrestr FROM synrestrs WHERE part_id = ?"; - - sqlite3_stmt* ppstmt; - if (sqlite3_prepare_v2(ppdb_, queryString.c_str(), queryString.length(), &ppstmt, NULL) != SQLITE_OK) - { - std::string errorMsg = sqlite3_errmsg(ppdb_); - sqlite3_finalize(ppstmt); - - throw database_error("Error preparing query", errorMsg); - } - - if (sqlite3_bind_int(ppstmt, 1, partId) != SQLITE_OK) - { - std::string errorMsg = sqlite3_errmsg(ppdb_); - sqlite3_finalize(ppstmt); - - throw database_error("Error binding value to query", errorMsg); - } + std::vector rows = + ppdb_.queryAll( + "SELECT synrestr FROM synrestrs WHERE part_id = ?", + { partId }); std::set result; - while (sqlite3_step(ppstmt) == SQLITE_ROW) + + for (hatkirby::row& r : rows) { - result.insert(reinterpret_cast(sqlite3_column_blob(ppstmt, 0))); + result.emplace(std::move(mpark::get(r[0]))); } - sqlite3_finalize(ppstmt); - return result; } -- cgit 1.4.1