annotate libmlk-core/core/save.c @ 243:71b3b7036de7

misc: lot of cleanups, - prefix libraries with libmlk, - move assets from source directories closes #2520, - prefix header guards closes #2519
author David Demelier <markand@malikania.fr>
date Sat, 28 Nov 2020 22:37:30 +0100
parents libcore/core/save.c@76afe639fd72
children f978fa0137ce
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
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
243
71b3b7036de7 misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents: 241
diff changeset
26 #include <assets/sql/init.h>
71b3b7036de7 misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents: 241
diff changeset
27 #include <assets/sql/property-get.h>
71b3b7036de7 misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents: 241
diff changeset
28 #include <assets/sql/property-remove.h>
71b3b7036de7 misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents: 241
diff changeset
29 #include <assets/sql/property-set.h>
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
30
241
76afe639fd72 misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
31 #include "core_p.h"
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 #include "error.h"
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 #include "save.h"
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 #include "sys.h"
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
35 #include "util.h"
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
36
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
37 #define SQL_BEGIN "BEGIN EXCLUSIVE TRANSACTION"
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
38 #define SQL_COMMIT "COMMIT"
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
39 #define SQL_ROLLBACK "ROLLBACK"
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
40
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
41 static bool
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
42 exec(struct save *db, const char *sql)
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
43 {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
44 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
45 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
46
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
47 return true;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
48 }
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
49
241
76afe639fd72 misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
50 static const char *
76afe639fd72 misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
51 path(unsigned int idx)
76afe639fd72 misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
52 {
76afe639fd72 misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
53 return pprintf("%s/%u", sys_dir(SYS_DIR_SAVE), idx);
76afe639fd72 misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
54 }
76afe639fd72 misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
55
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 static bool
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
57 execu(struct save *db, const unsigned char *sql)
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
58 {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
59 return exec(db, (const 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
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
62 bool
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
63 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
64 {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
65 assert(db);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
66
241
76afe639fd72 misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
67 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
68 }
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
69
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
70 bool
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
71 verify(struct save *db)
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 {
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
73 struct {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
74 time_t *date;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
75 struct save_property prop;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
76 } table[] = {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
77 { .date = &db->created, { .key = "molko.create-date" } },
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
78 { .date = &db->updated, { .key = "molko.update-date" } },
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 /* Ensure create and update dates are present. */
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
82 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
83 if (!save_get_property(db, &table[i].prop)) {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
84 sqlite3_close(db->handle);
241
76afe639fd72 misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
85 return errorf(_("database not initialized correctly"));
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
86 }
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
87
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
88 *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
89 }
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
90
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 return true;
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
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 bool
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
95 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
96 {
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
97 assert(db);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
98 assert(path);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
99
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
100 int flags = 0;
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 switch (mode) {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
103 case SAVE_MODE_WRITE:
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
104 flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
105 break;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
106 default:
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
107 flags = SQLITE_OPEN_READONLY;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
108 break;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
109 }
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
110
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
111 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
112 return errorf("%s", sqlite3_errmsg(db->handle));
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 if (mode == SAVE_MODE_WRITE) {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
115 if (!execu(db, sql_init)) {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
116 sqlite3_close(db->handle);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
117 return false;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
118 }
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
119 }
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 return verify(db);
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
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 bool
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
125 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
126 {
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
127 assert(db);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
128 assert(prop);
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
129
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 sqlite3_stmt *stmt = NULL;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
131
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
132 if (!exec(db, SQL_BEGIN))
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 return false;
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
134 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
135 goto sqlite3_err;
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
136 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
137 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
138 goto sqlite3_err;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 if (sqlite3_step(stmt) != SQLITE_DONE)
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
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 sqlite3_finalize(stmt);
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
143
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
144 return exec(db, SQL_COMMIT);
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
145
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 sqlite3_err:
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
147 errorf("%s", sqlite3_errmsg(db->handle));
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
148
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
149 if (stmt)
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 sqlite3_finalize(stmt);
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
151
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
152 exec(db, SQL_ROLLBACK);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
153
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
154 return false;
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
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
157 bool
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
158 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
159 {
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
160 assert(db);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
161 assert(prop);
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
162
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 sqlite3_stmt *stmt = NULL;
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
164 bool ret = true;
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
165
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
166 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
167 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
168 goto sqlite3_err;
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
169 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
170 goto sqlite3_err;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
171
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 switch (sqlite3_step(stmt)) {
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 case SQLITE_DONE:
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 /* Not found. */
241
76afe639fd72 misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
175 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
176 break;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 case SQLITE_ROW:
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 /* Found. */
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
179 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
180 break;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 default:
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 /* Error. */
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 goto sqlite3_err;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 }
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
185
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 sqlite3_finalize(stmt);
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 return ret;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
189
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 sqlite3_err:
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
191 errorf("%s", sqlite3_errmsg(db->handle));
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
192
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 if (stmt)
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 sqlite3_finalize(stmt);
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
195
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
196 return false;
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
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 bool
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
200 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
201 {
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
202 assert(db);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
203 assert(prop);
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
204
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 sqlite3_stmt *stmt = NULL;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
206
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
207 if (!exec(db, SQL_BEGIN))
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 return false;
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
209 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
210 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
211 goto sqlite3_err;
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
212 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
213 goto sqlite3_err;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 if (sqlite3_step(stmt) != SQLITE_DONE)
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 goto sqlite3_err;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
216
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 sqlite3_finalize(stmt);
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
218
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
219 return exec(db, SQL_COMMIT);
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
220
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 sqlite3_err:
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
222 errorf("%s", sqlite3_errmsg(db->handle));
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
223
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 if (stmt)
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 sqlite3_finalize(stmt);
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
226
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
227 exec(db, SQL_ROLLBACK);
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
228
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 return false;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 }
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 void
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
233 save_finish(struct save *db)
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 {
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
235 assert(db);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
236
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
237 if (db->handle)
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
238 sqlite3_close(db->handle);
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 memset(db, 0, sizeof (*db));
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 }