Mercurial > molko
annotate libmlk-core/core/save.c @ 261:bfde372bf152
core: prefix utilities with util_
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 06 Dec 2020 23:06:34 +0100 |
parents | f978fa0137ce |
children | 3f710c68bb97 |
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 |
258
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
19 #include <compat.h> |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
20 |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 #include <assert.h> |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include <stdio.h> |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
23 #include <stdlib.h> |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 #include <string.h> |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 #include <sqlite3.h> |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 |
243
71b3b7036de7
misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents:
241
diff
changeset
|
28 #include <assets/sql/init.h> |
71b3b7036de7
misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents:
241
diff
changeset
|
29 #include <assets/sql/property-get.h> |
71b3b7036de7
misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents:
241
diff
changeset
|
30 #include <assets/sql/property-remove.h> |
71b3b7036de7
misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents:
241
diff
changeset
|
31 #include <assets/sql/property-set.h> |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
32 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
172
diff
changeset
|
33 #include "core_p.h" |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 #include "error.h" |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 #include "save.h" |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 #include "sys.h" |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
37 #include "util.h" |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
39 #define SQL_BEGIN "BEGIN EXCLUSIVE TRANSACTION" |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
40 #define SQL_COMMIT "COMMIT" |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
41 #define SQL_ROLLBACK "ROLLBACK" |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
43 static bool |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
44 exec(struct save *db, const char *sql) |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
45 { |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
46 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
|
47 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
|
48 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
49 return true; |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
50 } |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
172
diff
changeset
|
52 static const char * |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
172
diff
changeset
|
53 path(unsigned int idx) |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
172
diff
changeset
|
54 { |
261
bfde372bf152
core: prefix utilities with util_
David Demelier <markand@malikania.fr>
parents:
258
diff
changeset
|
55 return util_pathf("%s/%u", sys_dir(SYS_DIR_SAVE), idx); |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
172
diff
changeset
|
56 } |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
172
diff
changeset
|
57 |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 static bool |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
59 execu(struct save *db, const unsigned char *sql) |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
60 { |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
61 return exec(db, (const char *)sql); |
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 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
64 bool |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
65 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
|
66 { |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
67 assert(db); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
68 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
172
diff
changeset
|
69 return save_open_path(db, path(idx), mode); |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
70 } |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
71 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
72 bool |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
73 verify(struct save *db) |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 { |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
75 struct { |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
76 time_t *date; |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
77 struct save_property prop; |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
78 } table[] = { |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
79 { .date = &db->created, { .key = "molko.create-date" } }, |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
80 { .date = &db->updated, { .key = "molko.update-date" } }, |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
81 }; |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
82 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
83 /* Ensure create and update dates are present. */ |
261
bfde372bf152
core: prefix utilities with util_
David Demelier <markand@malikania.fr>
parents:
258
diff
changeset
|
84 for (size_t i = 0; i < UTIL_SIZE(table); ++i) { |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
85 if (!save_get_property(db, &table[i].prop)) { |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
86 sqlite3_close(db->handle); |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
172
diff
changeset
|
87 return errorf(_("database not initialized correctly")); |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
88 } |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
89 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
90 *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
|
91 } |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 return true; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 } |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 bool |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
97 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
|
98 { |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
99 assert(db); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
100 assert(path); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
101 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
102 int flags = 0; |
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 switch (mode) { |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
105 case SAVE_MODE_WRITE: |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
106 flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE; |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
107 break; |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
108 default: |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
109 flags = SQLITE_OPEN_READONLY; |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
110 break; |
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 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
|
114 return errorf("%s", sqlite3_errmsg(db->handle)); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
115 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
116 if (mode == SAVE_MODE_WRITE) { |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
117 if (!execu(db, sql_init)) { |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
118 sqlite3_close(db->handle); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
119 return false; |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
120 } |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
121 } |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
122 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
123 return verify(db); |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
124 } |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
125 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
126 bool |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
127 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
|
128 { |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
129 assert(db); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
130 assert(prop); |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
131 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
132 sqlite3_stmt *stmt = NULL; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
133 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
134 if (!exec(db, SQL_BEGIN)) |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
135 return false; |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
136 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
|
137 goto sqlite3_err; |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
138 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
|
139 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
|
140 goto sqlite3_err; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
141 if (sqlite3_step(stmt) != SQLITE_DONE) |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
142 goto sqlite3_err; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
143 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
144 sqlite3_finalize(stmt); |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
145 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
146 return exec(db, SQL_COMMIT); |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
147 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
148 sqlite3_err: |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
149 errorf("%s", sqlite3_errmsg(db->handle)); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
150 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
151 if (stmt) |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
152 sqlite3_finalize(stmt); |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
153 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
154 exec(db, SQL_ROLLBACK); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
155 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
156 return false; |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
157 } |
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 bool |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
160 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
|
161 { |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
162 assert(db); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
163 assert(prop); |
84
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 sqlite3_stmt *stmt = NULL; |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
166 bool ret = true; |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
167 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
168 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
|
169 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
|
170 goto sqlite3_err; |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
171 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
|
172 goto sqlite3_err; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
173 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
174 switch (sqlite3_step(stmt)) { |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
175 case SQLITE_DONE: |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
176 /* Not found. */ |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
172
diff
changeset
|
177 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
|
178 break; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
179 case SQLITE_ROW: |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
180 /* Found. */ |
258
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
181 strlcpy(prop->value, (const char *)sqlite3_column_text(stmt, 0), |
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
182 sizeof (prop->value)); |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
183 break; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
184 default: |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
185 /* Error. */ |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
186 goto sqlite3_err; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
187 } |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
188 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
189 sqlite3_finalize(stmt); |
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 return ret; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
192 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
193 sqlite3_err: |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
194 errorf("%s", sqlite3_errmsg(db->handle)); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
195 |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
196 if (stmt) |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
197 sqlite3_finalize(stmt); |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
198 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
199 return false; |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
200 } |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
201 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
202 bool |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
203 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
|
204 { |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
205 assert(db); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
206 assert(prop); |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
207 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
208 sqlite3_stmt *stmt = NULL; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
209 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
210 if (!exec(db, SQL_BEGIN)) |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
211 return false; |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
212 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
|
213 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
|
214 goto sqlite3_err; |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
215 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
|
216 goto sqlite3_err; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
217 if (sqlite3_step(stmt) != SQLITE_DONE) |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
218 goto sqlite3_err; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
219 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
220 sqlite3_finalize(stmt); |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
221 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
222 return exec(db, SQL_COMMIT); |
84
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 sqlite3_err: |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
225 errorf("%s", sqlite3_errmsg(db->handle)); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
226 |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
227 if (stmt) |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
228 sqlite3_finalize(stmt); |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
229 |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
230 exec(db, SQL_ROLLBACK); |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
231 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
232 return false; |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
233 } |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
234 |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
235 void |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
236 save_finish(struct save *db) |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
237 { |
172
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
238 assert(db); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
239 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
240 if (db->handle) |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
241 sqlite3_close(db->handle); |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
242 |
6250883b81f0
core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents:
168
diff
changeset
|
243 memset(db, 0, sizeof (*db)); |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
244 } |