#include "database.h" #include #include "query.h" #include "version.h" namespace verbly { database::database( std::string path) : ppdb_(std::move(path), hatkirby::dbmode::read) { hatkirby::row version = ppdb_.queryFirst("SELECT major, minor FROM version"); major_ = mpark::get(version[0]); minor_ = mpark::get(version[1]); if (major_ != DATABASE_MAJOR_VERSION) { throw database_version_mismatch(DATABASE_MAJOR_VERSION, major_); } } 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::vector rows = ppdb_.queryAll( "SELECT selrestr FROM selrestrs WHERE part_id = ?", { partId }); std::set result; for (hatkirby::row& r : rows) { result.emplace(std::move(mpark::get(r[0]))); } return result; } std::set database::synrestrs(int partId) const { std::vector rows = ppdb_.queryAll( "SELECT synrestr FROM synrestrs WHERE part_id = ?", { partId }); std::set result; for (hatkirby::row& r : rows) { result.emplace(std::move(mpark::get(r[0]))); } return result; } std::string database_version_mismatch::generateMessage(int right, int wrong) { std::ostringstream msgbuilder; msgbuilder << "Incompatible database version: needed "; msgbuilder << right; msgbuilder << ", found "; msgbuilder << wrong; return msgbuilder.str(); } };