From 350bfdb5ea9b4f7e50746c50a46d8032cbc5a104 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Wed, 8 Nov 2017 14:53:26 -0500 Subject: Created database versioning system Also added an ANALYZE statement to the end of the datafile generation process. This generates information that allows sqlite to sometimes come up with a better query plan, and in many cases can significant speed up queries. This constitutes a minor database update, but because this is the first version that uses the database versioning system, older versions are essentially incompatible. refs #2 --- lib/database.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'lib/database.cpp') diff --git a/lib/database.cpp b/lib/database.cpp index a4d056d..fe64763 100644 --- a/lib/database.cpp +++ b/lib/database.cpp @@ -1,7 +1,9 @@ #include "database.h" #include #include +#include #include "query.h" +#include "version.h" namespace verbly { @@ -17,6 +19,35 @@ namespace verbly { 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); + } + + major_ = sqlite3_column_int(ppstmt, 0); + minor_ = sqlite3_column_int(ppstmt, 1); + + sqlite3_finalize(ppstmt); + + if (major_ != DATABASE_MAJOR_VERSION) + { + throw database_version_mismatch(DATABASE_MAJOR_VERSION, major_); + } } database::database(database&& other) : database() @@ -135,4 +166,15 @@ namespace verbly { 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(); + } + }; -- cgit 1.4.1