diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/database.cpp | 42 | ||||
| -rw-r--r-- | lib/database.h | 44 | ||||
| -rw-r--r-- | lib/version.h | 11 |
3 files changed, 97 insertions, 0 deletions
| 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 @@ | |||
| 1 | #include "database.h" | 1 | #include "database.h" |
| 2 | #include <sqlite3.h> | 2 | #include <sqlite3.h> |
| 3 | #include <stdexcept> | 3 | #include <stdexcept> |
| 4 | #include <sstream> | ||
| 4 | #include "query.h" | 5 | #include "query.h" |
| 6 | #include "version.h" | ||
| 5 | 7 | ||
| 6 | namespace verbly { | 8 | namespace verbly { |
| 7 | 9 | ||
| @@ -17,6 +19,35 @@ namespace verbly { | |||
| 17 | 19 | ||
| 18 | throw database_error("Could not open verbly datafile", errmsg); | 20 | throw database_error("Could not open verbly datafile", errmsg); |
| 19 | } | 21 | } |
| 22 | |||
| 23 | std::string queryString = "SELECT major, minor FROM version"; | ||
| 24 | |||
| 25 | sqlite3_stmt* ppstmt; | ||
| 26 | if (sqlite3_prepare_v2(ppdb_, queryString.c_str(), queryString.length(), &ppstmt, NULL) != SQLITE_OK) | ||
| 27 | { | ||
| 28 | std::string errorMsg = sqlite3_errmsg(ppdb_); | ||
| 29 | sqlite3_finalize(ppstmt); | ||
| 30 | |||
| 31 | throw database_error("Error reading database version", errorMsg); | ||
| 32 | } | ||
| 33 | |||
| 34 | if (sqlite3_step(ppstmt) != SQLITE_ROW) | ||
| 35 | { | ||
| 36 | std::string errorMsg = sqlite3_errmsg(ppdb_); | ||
| 37 | sqlite3_finalize(ppstmt); | ||
| 38 | |||
| 39 | throw database_error("Error reading database version", errorMsg); | ||
| 40 | } | ||
| 41 | |||
| 42 | major_ = sqlite3_column_int(ppstmt, 0); | ||
| 43 | minor_ = sqlite3_column_int(ppstmt, 1); | ||
| 44 | |||
| 45 | sqlite3_finalize(ppstmt); | ||
| 46 | |||
| 47 | if (major_ != DATABASE_MAJOR_VERSION) | ||
| 48 | { | ||
| 49 | throw database_version_mismatch(DATABASE_MAJOR_VERSION, major_); | ||
| 50 | } | ||
| 20 | } | 51 | } |
| 21 | 52 | ||
| 22 | database::database(database&& other) : database() | 53 | database::database(database&& other) : database() |
| @@ -135,4 +166,15 @@ namespace verbly { | |||
| 135 | return result; | 166 | return result; |
| 136 | } | 167 | } |
| 137 | 168 | ||
| 169 | std::string database_version_mismatch::generateMessage(int right, int wrong) | ||
| 170 | { | ||
| 171 | std::ostringstream msgbuilder; | ||
| 172 | msgbuilder << "Incompatible database version: needed "; | ||
| 173 | msgbuilder << right; | ||
| 174 | msgbuilder << ", found "; | ||
| 175 | msgbuilder << wrong; | ||
| 176 | |||
| 177 | return msgbuilder.str(); | ||
| 178 | } | ||
| 179 | |||
| 138 | }; | 180 | }; |
| diff --git a/lib/database.h b/lib/database.h index ef5ff87..efb54e1 100644 --- a/lib/database.h +++ b/lib/database.h | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | #include <string> | 4 | #include <string> |
| 5 | #include <exception> | 5 | #include <exception> |
| 6 | #include <stdexcept> | ||
| 6 | #include <list> | 7 | #include <list> |
| 7 | #include <set> | 8 | #include <set> |
| 8 | #include "notion.h" | 9 | #include "notion.h" |
| @@ -45,6 +46,18 @@ namespace verbly { | |||
| 45 | 46 | ||
| 46 | ~database(); | 47 | ~database(); |
| 47 | 48 | ||
| 49 | // Information | ||
| 50 | |||
| 51 | int getMajorVersion() const | ||
| 52 | { | ||
| 53 | return major_; | ||
| 54 | } | ||
| 55 | |||
| 56 | int getMinorVersion() const | ||
| 57 | { | ||
| 58 | return minor_; | ||
| 59 | } | ||
| 60 | |||
| 48 | // Queries | 61 | // Queries |
| 49 | 62 | ||
| 50 | query<notion> notions(filter where, order sortOrder = {}, int limit = 1) const; | 63 | query<notion> notions(filter where, order sortOrder = {}, int limit = 1) const; |
| @@ -69,6 +82,37 @@ namespace verbly { | |||
| 69 | 82 | ||
| 70 | sqlite3* ppdb_ = nullptr; | 83 | sqlite3* ppdb_ = nullptr; |
| 71 | 84 | ||
| 85 | int major_; | ||
| 86 | int minor_; | ||
| 87 | |||
| 88 | }; | ||
| 89 | |||
| 90 | class database_version_mismatch : public std::logic_error { | ||
| 91 | public: | ||
| 92 | |||
| 93 | database_version_mismatch(int right, int wrong) : | ||
| 94 | std::logic_error(generateMessage(right, wrong)), | ||
| 95 | right_(right), | ||
| 96 | wrong_(wrong) | ||
| 97 | { | ||
| 98 | } | ||
| 99 | |||
| 100 | int getRightVersion() const noexcept | ||
| 101 | { | ||
| 102 | return right_; | ||
| 103 | } | ||
| 104 | |||
| 105 | int getWrongVersion() const noexcept | ||
| 106 | { | ||
| 107 | return wrong_; | ||
| 108 | } | ||
| 109 | |||
| 110 | private: | ||
| 111 | |||
| 112 | static std::string generateMessage(int right, int wrong); | ||
| 113 | |||
| 114 | int right_; | ||
| 115 | int wrong_; | ||
| 72 | }; | 116 | }; |
| 73 | 117 | ||
| 74 | }; | 118 | }; |
| diff --git a/lib/version.h b/lib/version.h new file mode 100644 index 0000000..41ab79e --- /dev/null +++ b/lib/version.h | |||
| @@ -0,0 +1,11 @@ | |||
| 1 | #ifndef VERSION_H_3CACFC4B | ||
| 2 | #define VERSION_H_3CACFC4B | ||
| 3 | |||
| 4 | namespace verbly { | ||
| 5 | |||
| 6 | const int DATABASE_MAJOR_VERSION = 1; | ||
| 7 | const int DATABASE_MINOR_VERSION = 0; | ||
| 8 | |||
| 9 | }; | ||
| 10 | |||
| 11 | #endif /* end of include guard: VERSION_H_3CACFC4B */ | ||
