Mercurial > molko
annotate libcore/core/save.c @ 193:78774cc2cc6b
doc: minimal typo
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 07 Nov 2020 19:26:51 +0100 |
parents | 6250883b81f0 |
children | 76afe639fd72 |
rev | line source |
---|---|
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * save.c -- save functions |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr> |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <assert.h> |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #include <stdio.h> |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
21 #include <stdlib.h> |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include <string.h> |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 #include <sqlite3.h> |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
26 #include <core/assets/sql/init.h> |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
27 #include <core/assets/sql/property-get.h> |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
28 #include <core/assets/sql/property-remove.h> |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
29 #include <core/assets/sql/property-set.h> |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
30 |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 #include "error.h" |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 #include "save.h" |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 #include "sys.h" |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
34 #include "util.h" |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
36 #define SQL_BEGIN "BEGIN EXCLUSIVE TRANSACTION" |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
37 #define SQL_COMMIT "COMMIT" |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
38 #define SQL_ROLLBACK "ROLLBACK" |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
40 static bool |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
41 exec(struct save *db, const char *sql) |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
42 { |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
43 if (sqlite3_exec(db->handle, sql, NULL, NULL, NULL) != SQLITE_OK) |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
44 return errorf("%s", sqlite3_errmsg(db->handle)); |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
46 return true; |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
47 } |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 static bool |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
50 execu(struct save *db, const unsigned char *sql) |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
51 { |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
52 return exec(db, (const char *)sql); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
53 } |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
54 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
55 bool |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
56 save_open(struct save *db, unsigned int idx, enum save_mode mode) |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
57 { |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
58 assert(db); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
59 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
60 return save_open_path(db, sys_savepath(idx), mode); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
61 } |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
62 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
63 bool |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
64 verify(struct save *db) |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 { |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
66 struct { |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
67 time_t *date; |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
68 struct save_property prop; |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
69 } table[] = { |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
70 { .date = &db->created, { .key = "molko.create-date" } }, |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
71 { .date = &db->updated, { .key = "molko.update-date" } }, |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
72 }; |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
73 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
74 /* Ensure create and update dates are present. */ |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
75 for (size_t i = 0; i < NELEM(table); ++i) { |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
76 if (!save_get_property(db, &table[i].prop)) { |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
77 sqlite3_close(db->handle); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
78 return errorf("database not initialized correctly"); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
79 } |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
80 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
81 *table[i].date = strtoull(table[i].prop.value, NULL, 10); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
82 } |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 return true; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 } |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 bool |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
88 save_open_path(struct save *db, const char *path, enum save_mode mode) |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 { |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
90 assert(db); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
91 assert(path); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
92 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
93 int flags = 0; |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
94 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
95 switch (mode) { |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
96 case SAVE_MODE_WRITE: |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
97 flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE; |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
98 break; |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
99 default: |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
100 flags = SQLITE_OPEN_READONLY; |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
101 break; |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
102 } |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
103 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
104 if (sqlite3_open_v2(path, (sqlite3**)&db->handle, flags, NULL) != SQLITE_OK) |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
105 return errorf("%s", sqlite3_errmsg(db->handle)); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
106 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
107 if (mode == SAVE_MODE_WRITE) { |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
108 if (!execu(db, sql_init)) { |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
109 sqlite3_close(db->handle); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
110 return false; |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
111 } |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
112 } |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
113 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
114 return verify(db); |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
115 } |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 bool |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
118 save_set_property(struct save *db, const struct save_property *prop) |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
119 { |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
120 assert(db); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
121 assert(prop); |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
122 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
123 sqlite3_stmt *stmt = NULL; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
124 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
125 if (!exec(db, SQL_BEGIN)) |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
126 return false; |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
127 if (sqlite3_prepare(db->handle, (const char *)sql_property_set, -1, &stmt, NULL) != SQLITE_OK) |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
128 goto sqlite3_err; |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
129 if (sqlite3_bind_text(stmt, 1, prop->key, -1, NULL) != SQLITE_OK || |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
130 sqlite3_bind_text(stmt, 2, prop->value, -1, NULL) != SQLITE_OK) |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
131 goto sqlite3_err; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
132 if (sqlite3_step(stmt) != SQLITE_DONE) |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
133 goto sqlite3_err; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
134 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
135 sqlite3_finalize(stmt); |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
136 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
137 return exec(db, SQL_COMMIT); |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
138 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
139 sqlite3_err: |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
140 errorf("%s", sqlite3_errmsg(db->handle)); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
141 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
142 if (stmt) |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
143 sqlite3_finalize(stmt); |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
144 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
145 exec(db, SQL_ROLLBACK); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
146 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
147 return false; |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
148 } |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
149 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
150 bool |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
151 save_get_property(struct save *db, struct save_property *prop) |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
152 { |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
153 assert(db); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
154 assert(prop); |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
155 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
156 sqlite3_stmt *stmt = NULL; |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
157 bool ret = true; |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
158 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
159 if (sqlite3_prepare(db->handle, (const char *)sql_property_get, |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
160 sizeof (sql_property_get), &stmt, NULL) != SQLITE_OK) |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
161 goto sqlite3_err; |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
162 if (sqlite3_bind_text(stmt, 1, prop->key, -1, NULL) != SQLITE_OK) |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
163 goto sqlite3_err; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
164 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
165 switch (sqlite3_step(stmt)) { |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
166 case SQLITE_DONE: |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
167 /* Not found. */ |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
168 ret = errorf("property '%s' was not found", prop->key); |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
169 break; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
170 case SQLITE_ROW: |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
171 /* Found. */ |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
172 snprintf(prop->value, sizeof (prop->value), "%s", sqlite3_column_text(stmt, 0)); |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
173 break; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
174 default: |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
175 /* Error. */ |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
176 goto sqlite3_err; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
177 } |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
178 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
179 sqlite3_finalize(stmt); |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
180 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
181 return ret; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
182 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
183 sqlite3_err: |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
184 errorf("%s", sqlite3_errmsg(db->handle)); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
185 |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
186 if (stmt) |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
187 sqlite3_finalize(stmt); |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
188 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
189 return false; |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
190 } |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
191 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
192 bool |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
193 save_remove_property(struct save *db, const struct save_property *prop) |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
194 { |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
195 assert(db); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
196 assert(prop); |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
197 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
198 sqlite3_stmt *stmt = NULL; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
199 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
200 if (!exec(db, SQL_BEGIN)) |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
201 return false; |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
202 if (sqlite3_prepare(db->handle, (const char *)sql_property_remove, |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
203 sizeof (sql_property_remove), &stmt, NULL) != SQLITE_OK) |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
204 goto sqlite3_err; |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
205 if (sqlite3_bind_text(stmt, 1, prop->key, -1, NULL) != SQLITE_OK) |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
206 goto sqlite3_err; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
207 if (sqlite3_step(stmt) != SQLITE_DONE) |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
208 goto sqlite3_err; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
209 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
210 sqlite3_finalize(stmt); |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
211 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
212 return exec(db, SQL_COMMIT); |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
213 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
214 sqlite3_err: |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
215 errorf("%s", sqlite3_errmsg(db->handle)); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
216 |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
217 if (stmt) |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
218 sqlite3_finalize(stmt); |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
219 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
220 exec(db, SQL_ROLLBACK); |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
221 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
222 return false; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
223 } |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
224 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
225 void |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
226 save_finish(struct save *db) |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
227 { |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
228 assert(db); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
229 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
230 if (db->handle) |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
231 sqlite3_close(db->handle); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
232 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
233 memset(db, 0, sizeof (*db)); |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
234 } |