annotate libcore/core/save.c @ 193:78774cc2cc6b

doc: minimal typo
author David Demelier <markand@malikania.fr>
date Sat, 07 Nov 2020 19:26:51 +0100
parents 6250883b81f0
children 76afe639fd72
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
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
26 #include <core/assets/sql/init.h>
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
27 #include <core/assets/sql/property-get.h>
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
28 #include <core/assets/sql/property-remove.h>
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
29 #include <core/assets/sql/property-set.h>
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
30
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 #include "error.h"
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 #include "save.h"
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 #include "sys.h"
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
34 #include "util.h"
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
35
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
36 #define SQL_BEGIN "BEGIN EXCLUSIVE TRANSACTION"
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
37 #define SQL_COMMIT "COMMIT"
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
38 #define SQL_ROLLBACK "ROLLBACK"
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
39
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
40 static bool
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
41 exec(struct save *db, const char *sql)
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
42 {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
43 if (sqlite3_exec(db->handle, sql, NULL, NULL, NULL) != SQLITE_OK)
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
44 return errorf("%s", sqlite3_errmsg(db->handle));
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
45
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
46 return true;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
47 }
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 static bool
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
50 execu(struct save *db, const unsigned char *sql)
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
51 {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
52 return exec(db, (const char *)sql);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
53 }
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
54
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
55 bool
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
56 save_open(struct save *db, unsigned int idx, enum save_mode mode)
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
57 {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
58 assert(db);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
59
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
60 return save_open_path(db, sys_savepath(idx), mode);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
61 }
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
62
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
63 bool
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
64 verify(struct save *db)
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 {
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
66 struct {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
67 time_t *date;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
68 struct save_property prop;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
69 } table[] = {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
70 { .date = &db->created, { .key = "molko.create-date" } },
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
71 { .date = &db->updated, { .key = "molko.update-date" } },
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
72 };
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
73
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
74 /* Ensure create and update dates are present. */
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
75 for (size_t i = 0; i < NELEM(table); ++i) {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
76 if (!save_get_property(db, &table[i].prop)) {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
77 sqlite3_close(db->handle);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
78 return errorf("database not initialized correctly");
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
79 }
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
80
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
81 *table[i].date = strtoull(table[i].prop.value, NULL, 10);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
82 }
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
83
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 return true;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 }
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
86
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 bool
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
88 save_open_path(struct save *db, const char *path, enum save_mode mode)
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 {
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
90 assert(db);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
91 assert(path);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
92
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
93 int flags = 0;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
94
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
95 switch (mode) {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
96 case SAVE_MODE_WRITE:
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
97 flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
98 break;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
99 default:
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
100 flags = SQLITE_OPEN_READONLY;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
101 break;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
102 }
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
103
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
104 if (sqlite3_open_v2(path, (sqlite3**)&db->handle, flags, NULL) != SQLITE_OK)
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
105 return errorf("%s", sqlite3_errmsg(db->handle));
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
106
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
107 if (mode == SAVE_MODE_WRITE) {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
108 if (!execu(db, sql_init)) {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
109 sqlite3_close(db->handle);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
110 return false;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
111 }
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
112 }
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
113
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
114 return verify(db);
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 }
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
116
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 bool
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
118 save_set_property(struct save *db, const struct save_property *prop)
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 {
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
120 assert(db);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
121 assert(prop);
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
122
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 sqlite3_stmt *stmt = NULL;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
124
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
125 if (!exec(db, SQL_BEGIN))
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 return false;
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
127 if (sqlite3_prepare(db->handle, (const char *)sql_property_set, -1, &stmt, NULL) != SQLITE_OK)
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 goto sqlite3_err;
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
129 if (sqlite3_bind_text(stmt, 1, prop->key, -1, NULL) != SQLITE_OK ||
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
130 sqlite3_bind_text(stmt, 2, prop->value, -1, NULL) != SQLITE_OK)
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 goto sqlite3_err;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 if (sqlite3_step(stmt) != SQLITE_DONE)
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 goto sqlite3_err;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
134
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 sqlite3_finalize(stmt);
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
136
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
137 return exec(db, SQL_COMMIT);
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
138
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 sqlite3_err:
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
140 errorf("%s", sqlite3_errmsg(db->handle));
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
141
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
142 if (stmt)
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 sqlite3_finalize(stmt);
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
144
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
145 exec(db, SQL_ROLLBACK);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
146
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
147 return false;
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 }
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
149
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
150 bool
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
151 save_get_property(struct save *db, struct save_property *prop)
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 {
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
153 assert(db);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
154 assert(prop);
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
155
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 sqlite3_stmt *stmt = NULL;
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
157 bool ret = true;
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
158
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
159 if (sqlite3_prepare(db->handle, (const char *)sql_property_get,
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
160 sizeof (sql_property_get), &stmt, NULL) != SQLITE_OK)
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 goto sqlite3_err;
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
162 if (sqlite3_bind_text(stmt, 1, prop->key, -1, NULL) != SQLITE_OK)
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 goto sqlite3_err;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
164
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 switch (sqlite3_step(stmt)) {
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 case SQLITE_DONE:
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 /* Not found. */
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
168 ret = errorf("property '%s' was not found", prop->key);
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 break;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 case SQLITE_ROW:
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 /* Found. */
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
172 snprintf(prop->value, sizeof (prop->value), "%s", sqlite3_column_text(stmt, 0));
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 break;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 default:
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 /* Error. */
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 goto sqlite3_err;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 }
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
178
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 sqlite3_finalize(stmt);
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
180
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 return ret;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
182
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 sqlite3_err:
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
184 errorf("%s", sqlite3_errmsg(db->handle));
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
185
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 if (stmt)
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 sqlite3_finalize(stmt);
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
188
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
189 return false;
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 }
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
191
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 bool
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
193 save_remove_property(struct save *db, const struct save_property *prop)
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 {
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
195 assert(db);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
196 assert(prop);
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
197
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 sqlite3_stmt *stmt = NULL;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
199
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
200 if (!exec(db, SQL_BEGIN))
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 return false;
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
202 if (sqlite3_prepare(db->handle, (const char *)sql_property_remove,
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
203 sizeof (sql_property_remove), &stmt, NULL) != SQLITE_OK)
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 goto sqlite3_err;
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
205 if (sqlite3_bind_text(stmt, 1, prop->key, -1, NULL) != SQLITE_OK)
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 goto sqlite3_err;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 if (sqlite3_step(stmt) != SQLITE_DONE)
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 goto sqlite3_err;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
209
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 sqlite3_finalize(stmt);
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
211
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
212 return exec(db, SQL_COMMIT);
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
213
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 sqlite3_err:
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
215 errorf("%s", sqlite3_errmsg(db->handle));
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
216
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 if (stmt)
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 sqlite3_finalize(stmt);
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
219
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
220 exec(db, SQL_ROLLBACK);
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
221
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 return false;
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 }
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
224
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 void
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
226 save_finish(struct save *db)
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 {
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
228 assert(db);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
229
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
230 if (db->handle)
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
231 sqlite3_close(db->handle);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
232
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
233 memset(db, 0, sizeof (*db));
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 }