diff options
author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2017-11-08 14:53:26 -0500 |
---|---|---|
committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2017-11-08 14:53:26 -0500 |
commit | 350bfdb5ea9b4f7e50746c50a46d8032cbc5a104 (patch) | |
tree | e339d118669f85de1afb858828a7affd0b47c745 /lib | |
parent | b92db337bf7cbe2ea0564be6c63c336d2bcd4567 (diff) | |
download | verbly-d1.0.tar.gz verbly-d1.0.tar.bz2 verbly-d1.0.zip |
Created database versioning system d1.0
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
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 */ | ||