]> git.sesse.net Git - nageru/blob - db.cpp
Embed shaders into the binary.
[nageru] / db.cpp
1 #include "db.h"
2
3 #include <string>
4
5 using namespace std;
6
7 DB::DB(const std::string &filename)
8 {
9         int ret = sqlite3_open(filename.c_str(), &db);
10         if (ret != SQLITE_OK) {
11                 fprintf(stderr, "%s: %s\n", filename.c_str(), sqlite3_errmsg(db));
12                 exit(1);
13         }
14
15         sqlite3_exec(db, R"(
16                 CREATE TABLE IF NOT EXISTS state (state BLOB);
17         )", nullptr, nullptr, nullptr);  // Ignore errors.
18 }
19
20 StateProto DB::get_state()
21 {
22         StateProto state;
23
24         sqlite3_stmt *stmt;
25         int ret = sqlite3_prepare(db, "SELECT state FROM state", -1, &stmt, 0);
26         if (ret != SQLITE_OK) {
27                 fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db));
28                 exit(1);
29         }
30
31         ret = sqlite3_step(stmt);
32         if (ret == SQLITE_ROW) {
33                 bool ok = state.ParseFromArray(sqlite3_column_blob(stmt, 0), sqlite3_column_bytes(stmt, 0));
34                 if (!ok) {
35                         fprintf(stderr, "State in database is corrupted!\n");
36                         exit(1);
37                 }
38         } else if (ret != SQLITE_DONE) {
39                 fprintf(stderr, "SELECT step: %s\n", sqlite3_errmsg(db));
40                 exit(1);
41         }
42
43         ret = sqlite3_finalize(stmt);
44         if (ret != SQLITE_OK) {
45                 fprintf(stderr, "SELECT finalize: %s\n", sqlite3_errmsg(db));
46                 exit(1);
47         }
48
49         return state;
50 }
51
52 void DB::store_state(const StateProto &state)
53 {
54         string serialized;
55         state.SerializeToString(&serialized);
56
57         int ret = sqlite3_exec(db, "BEGIN", nullptr, nullptr, nullptr);
58         if (ret != SQLITE_OK) {
59                 fprintf(stderr, "BEGIN: %s\n", sqlite3_errmsg(db));
60                 exit(1);
61         }
62
63         ret = sqlite3_exec(db, "DELETE FROM state", nullptr, nullptr, nullptr);
64         if (ret != SQLITE_OK) {
65                 fprintf(stderr, "DELETE: %s\n", sqlite3_errmsg(db));
66                 exit(1);
67         }
68
69         sqlite3_stmt *stmt;
70         ret = sqlite3_prepare(db, "INSERT INTO state VALUES (?)", -1, &stmt, 0);
71         if (ret != SQLITE_OK) {
72                 fprintf(stderr, "INSERT prepare: %s\n", sqlite3_errmsg(db));
73                 exit(1);
74         }
75
76         sqlite3_bind_blob(stmt, 1, serialized.data(), serialized.size(), SQLITE_STATIC);
77
78         ret = sqlite3_step(stmt);
79         if (ret == SQLITE_ROW) {
80                 fprintf(stderr, "INSERT step: %s\n", sqlite3_errmsg(db));
81                 exit(1);
82         }
83
84         ret = sqlite3_finalize(stmt);
85         if (ret != SQLITE_OK) {
86                 fprintf(stderr, "INSERT finalize: %s\n", sqlite3_errmsg(db));
87                 exit(1);
88         }
89
90         ret = sqlite3_exec(db, "COMMIT", nullptr, nullptr, nullptr);
91         if (ret != SQLITE_OK) {
92                 fprintf(stderr, "COMMIT: %s\n", sqlite3_errmsg(db));
93                 exit(1);
94         }
95 }