#include "database.h" #include #include #include "query.h" namespace verbly { database::database(std::string path) { 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); } } 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); } query database::words(filter where, order sortOrder, int limit) const { return query(*this, ppdb_, std::move(where), std::move(sortOrder), limit); } query database::frames(filter where, order sortOrder, int limit) const { return query(*this, ppdb_, std::move(where), std::move(sortOrder), limit); } query database::parts(filter where, order sortOrder, int limit) const { return query(*this, ppdb_, std::move(where), std::move(sortOrder), limit); } query
database::forms(filter where, order sortOrder, int limit) const { return query(*this, ppdb_, std::move(where), std::move(sortOrder), limit); } query database::pronunciations(filter where, order sortOrder, int limit) const { return query(*this, ppdb_, std::move(where), std::move(sortOrder), limit); } 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::set result; while (sqlite3_step(ppstmt) == SQLITE_ROW) { result.insert(reinterpret_cast(sqlite3_column_blob(ppstmt, 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::set result; while (sqlite3_step(ppstmt) == SQLITE_ROW) { result.insert(reinterpret_cast(sqlite3_column_blob(ppstmt, 0))); } sqlite3_finalize(ppstmt); return result; } };