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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }