annotate src/libmlk-rpg/rpg/save.c @ 428:26d23999a54b

core: get rid of zfile
author David Demelier <markand@malikania.fr>
date Sat, 15 Oct 2022 14:38:15 +0200
parents 7d2ebc334c8c
children 8f59201dc76b
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 *
378
460c78706989 misc: update copyright years
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
4 * Copyright (c) 2020-2022 David Demelier <markand@malikania.fr>
84
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
420
7d2ebc334c8c misc: rename core to util
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
26 #include <util/util.h>
319
b843eef4cc35 misc: fix some warnings
David Demelier <markand@malikania.fr>
parents: 316
diff changeset
27
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
28 #include <core/error.h>
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
29 #include <core/sys.h>
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
30 #include <core/util.h>
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
31
243
71b3b7036de7 misc: lot of cleanups,
David Demelier <markand@malikania.fr>
parents: 241
diff changeset
32 #include <assets/sql/init.h>
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
33
328
60a4f904da21 rpg: separate property from save
David Demelier <markand@malikania.fr>
parents: 320
diff changeset
34 #include "property.h"
84
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
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
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
41 static int
172
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
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
47 return 0;
172
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 {
280
11c824a82e63 core: fix save_open functions
David Demelier <markand@malikania.fr>
parents: 268
diff changeset
53 return util_pathf("%s%u.db", 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
54 }
76afe639fd72 misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
55
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
56 static int
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
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
62 static int
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
63 verify(struct save *db)
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 {
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
65 struct {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
66 time_t *date;
328
60a4f904da21 rpg: separate property from save
David Demelier <markand@malikania.fr>
parents: 320
diff changeset
67 struct property prop;
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
68 } table[] = {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
69 { .date = &db->created, { .key = "molko.create-date" } },
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
70 { .date = &db->updated, { .key = "molko.update-date" } },
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
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
73 /* Ensure create and update dates are present. */
261
bfde372bf152 core: prefix utilities with util_
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
74 for (size_t i = 0; i < UTIL_SIZE(table); ++i) {
328
60a4f904da21 rpg: separate property from save
David Demelier <markand@malikania.fr>
parents: 320
diff changeset
75 if (property_load(&table[i].prop, db) < 0) {
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
76 sqlite3_close(db->handle);
411
d74f53299252 make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
77 return errorf("database not initialized correctly");
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
78 }
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 *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
81 }
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
82
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
83 return 0;
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 }
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
85
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
86 static int
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
87 prepare(struct save *s, struct save_stmt *stmt, const char *sql, const char *args, va_list ap)
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
88 {
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
89 stmt->parent = s;
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
90 stmt->handle = NULL;
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
91
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
92 if (sqlite3_prepare(s->handle, sql, -1, (sqlite3_stmt **)&stmt->handle, NULL) != SQLITE_OK)
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
93 goto sqlite3_err;
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
94
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
95 for (int i = 1; args && *args; ++args) {
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
96 switch (*args) {
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
97 case 'i':
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
98 case 'u':
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
99 if (sqlite3_bind_int(stmt->handle, i++, va_arg(ap, int)) != SQLITE_OK)
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
100 return -1;
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
101 break;
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
102 case 's':
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
103 if (sqlite3_bind_text(stmt->handle, i++, va_arg(ap, const char *), -1, NULL) != SQLITE_OK)
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
104 return -1;
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
105 break;
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
106 case 't':
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
107 if (sqlite3_bind_int64(stmt->handle, i++, va_arg(ap, time_t)) != SQLITE_OK)
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
108 return -1;
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
109 break;
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
110 case ' ':
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
111 break;
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
112 default:
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
113 return errorf("invalid format: %c", *args);
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
114 }
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
115 }
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
116
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
117 return 0;
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
118
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
119 sqlite3_err:
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
120 return errorf("%s", sqlite3_errmsg(s->handle));
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
121 }
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
122
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
123 static int
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
124 extract(struct save_stmt *stmt, const char *args, va_list ap)
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
125 {
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
126 const int ncols = sqlite3_column_count(stmt->handle);
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
127
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
128 for (int c = 0; args && *args; ++args) {
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
129 if (c >= ncols)
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
130 return errorf("too many arguments");
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
131
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
132 /* TODO: type check. */
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
133 switch (*args) {
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
134 case 'i':
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
135 case 'u':
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
136 *va_arg(ap, int *) = sqlite3_column_int(stmt->handle, c++);
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
137 break;
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
138 case 's': {
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
139 char *str = va_arg(ap, char *);
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
140 size_t max = va_arg(ap, size_t);
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
141
420
7d2ebc334c8c misc: rename core to util
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
142 util_strlcpy(str, (const char *)sqlite3_column_text(stmt->handle, c++), max);
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
143 break;
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
144 }
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
145 case 't':
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
146 *va_arg(ap, time_t *) = sqlite3_column_int64(stmt->handle, c++);
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
147 break;
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
148 case ' ':
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
149 break;
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
150 default:
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
151 return errorf("invalid format: %c", *args);
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
152 }
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
153 }
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
154
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
155 return 0;
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
156 }
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
157
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
158 int
268
3f710c68bb97 core: hide internal functions in save
David Demelier <markand@malikania.fr>
parents: 261
diff changeset
159 save_open(struct save *db, unsigned int idx, enum save_mode mode)
3f710c68bb97 core: hide internal functions in save
David Demelier <markand@malikania.fr>
parents: 261
diff changeset
160 {
3f710c68bb97 core: hide internal functions in save
David Demelier <markand@malikania.fr>
parents: 261
diff changeset
161 assert(db);
3f710c68bb97 core: hide internal functions in save
David Demelier <markand@malikania.fr>
parents: 261
diff changeset
162
3f710c68bb97 core: hide internal functions in save
David Demelier <markand@malikania.fr>
parents: 261
diff changeset
163 return save_open_path(db, path(idx), mode);
3f710c68bb97 core: hide internal functions in save
David Demelier <markand@malikania.fr>
parents: 261
diff changeset
164 }
3f710c68bb97 core: hide internal functions in save
David Demelier <markand@malikania.fr>
parents: 261
diff changeset
165
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
166 int
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
167 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
168 {
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
169 assert(db);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
170 assert(path);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
171
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
172 int flags = 0;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
173
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
174 switch (mode) {
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
175 case SAVE_MODE_WRITE:
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
176 flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
177 break;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
178 default:
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
179 flags = SQLITE_OPEN_READONLY;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
180 break;
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
181 }
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
182
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
183 if (sqlite3_open_v2(path, (sqlite3**)&db->handle, flags, NULL) != SQLITE_OK)
280
11c824a82e63 core: fix save_open functions
David Demelier <markand@malikania.fr>
parents: 268
diff changeset
184 goto sqlite3_err;
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
185
411
d74f53299252 make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
186 if (mode == SAVE_MODE_WRITE && execu(db, assets_init) < 0)
280
11c824a82e63 core: fix save_open functions
David Demelier <markand@malikania.fr>
parents: 268
diff changeset
187 goto sqlite3_err;
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
188
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
189 return verify(db);
280
11c824a82e63 core: fix save_open functions
David Demelier <markand@malikania.fr>
parents: 268
diff changeset
190
11c824a82e63 core: fix save_open functions
David Demelier <markand@malikania.fr>
parents: 268
diff changeset
191 sqlite3_err:
11c824a82e63 core: fix save_open functions
David Demelier <markand@malikania.fr>
parents: 268
diff changeset
192 errorf("%s", sqlite3_errmsg(db->handle));
11c824a82e63 core: fix save_open functions
David Demelier <markand@malikania.fr>
parents: 268
diff changeset
193 sqlite3_close(db->handle);
11c824a82e63 core: fix save_open functions
David Demelier <markand@malikania.fr>
parents: 268
diff changeset
194
11c824a82e63 core: fix save_open functions
David Demelier <markand@malikania.fr>
parents: 268
diff changeset
195 memset(db, 0, sizeof (*db));
11c824a82e63 core: fix save_open functions
David Demelier <markand@malikania.fr>
parents: 268
diff changeset
196
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
197 return -1;
280
11c824a82e63 core: fix save_open functions
David Demelier <markand@malikania.fr>
parents: 268
diff changeset
198 }
11c824a82e63 core: fix save_open functions
David Demelier <markand@malikania.fr>
parents: 268
diff changeset
199
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
200 int
280
11c824a82e63 core: fix save_open functions
David Demelier <markand@malikania.fr>
parents: 268
diff changeset
201 save_ok(const struct save *db)
11c824a82e63 core: fix save_open functions
David Demelier <markand@malikania.fr>
parents: 268
diff changeset
202 {
11c824a82e63 core: fix save_open functions
David Demelier <markand@malikania.fr>
parents: 268
diff changeset
203 assert(db);
11c824a82e63 core: fix save_open functions
David Demelier <markand@malikania.fr>
parents: 268
diff changeset
204
11c824a82e63 core: fix save_open functions
David Demelier <markand@malikania.fr>
parents: 268
diff changeset
205 return db && db->handle;
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 }
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
207
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
208 int
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
209 save_exec(struct save *db, const char *sql, const char *args, ...)
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
210 {
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
211 assert(save_ok(db));
330
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
212 assert(sql);
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
213
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
214 struct save_stmt stmt;
330
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
215 enum save_stmt_errno ret;
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
216 va_list ap;
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
217
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
218 va_start(ap, args);
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
219 ret = prepare(db, &stmt, sql, args, ap);
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
220 va_end(ap);
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
221
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
222 if (ret < 0)
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
223 return -1;
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
224
328
60a4f904da21 rpg: separate property from save
David Demelier <markand@malikania.fr>
parents: 320
diff changeset
225 ret = save_stmt_next(&stmt, NULL);
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
226 save_stmt_finish(&stmt);
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
227
330
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
228 return ret == SAVE_STMT_ERROR ? -1 : 0;
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
229 }
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
230
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 void
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
232 save_finish(struct save *db)
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 {
172
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
234 assert(db);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
235
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
236 if (db->handle)
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
237 sqlite3_close(db->handle);
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
238
6250883b81f0 core: improve save module, closes #2507
David Demelier <markand@malikania.fr>
parents: 168
diff changeset
239 memset(db, 0, sizeof (*db));
84
a6c2067709ce core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 }
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
241
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
242 int
329
ea4a3af71c18 rpg: change save_stmt_next API
David Demelier <markand@malikania.fr>
parents: 328
diff changeset
243 save_stmt_init(struct save_stmt *stmt, struct save *db, const char *sql, const char *args, ...)
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
244 {
329
ea4a3af71c18 rpg: change save_stmt_next API
David Demelier <markand@malikania.fr>
parents: 328
diff changeset
245 assert(stmt);
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
246 assert(save_ok(db));
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
247 assert(args);
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
248
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
249 va_list ap;
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 281
diff changeset
250 int ret;
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
251
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
252 va_start(ap, args);
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
253 ret = prepare(db, stmt, sql, args, ap);
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
254 va_end(ap);
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
255
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
256 return ret;
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
257 }
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
258
328
60a4f904da21 rpg: separate property from save
David Demelier <markand@malikania.fr>
parents: 320
diff changeset
259 enum save_stmt_errno
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
260 save_stmt_next(struct save_stmt *stmt, const char *args, ...)
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
261 {
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
262 assert(stmt);
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
263
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
264 va_list ap;
328
60a4f904da21 rpg: separate property from save
David Demelier <markand@malikania.fr>
parents: 320
diff changeset
265 enum save_stmt_errno ret = SAVE_STMT_ERROR;
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
266
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
267 switch (sqlite3_step(stmt->handle)) {
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
268 case SQLITE_ROW:
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
269 va_start(ap, args);
411
d74f53299252 make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
270
328
60a4f904da21 rpg: separate property from save
David Demelier <markand@malikania.fr>
parents: 320
diff changeset
271 if (extract(stmt, args, ap) == 0)
60a4f904da21 rpg: separate property from save
David Demelier <markand@malikania.fr>
parents: 320
diff changeset
272 ret = SAVE_STMT_ROW;
411
d74f53299252 make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
273
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
274 va_end(ap);
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
275 break;
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
276 case SQLITE_DONE:
328
60a4f904da21 rpg: separate property from save
David Demelier <markand@malikania.fr>
parents: 320
diff changeset
277 ret = SAVE_STMT_DONE;
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
278 break;
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
279 default:
330
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
280 errorf("%s", sqlite3_errmsg(stmt->parent->handle));
281
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
281 break;
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
282 }
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
283
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
284 return ret;
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
285 }
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
286
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
287 void
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
288 save_stmt_finish(struct save_stmt *stmt)
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
289 {
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
290 assert(stmt);
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
291
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
292 sqlite3_finalize(stmt->handle);
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
293 memset(stmt, 0, sizeof (*stmt));
87b8c7510717 rpg: implement load/save for characters
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
294 }
330
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
295
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
296 int
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
297 save_tx_begin(struct save *s)
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
298 {
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
299 assert(save_ok(s));
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
300
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
301 return save_exec(s, "BEGIN EXCLUSIVE TRANSACTION", NULL);
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
302 }
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
303
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
304 void
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
305 save_tx_rollback(struct save *s)
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
306 {
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
307 assert(save_ok(s));
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
308
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
309 (void)save_exec(s, "ROLLBACK", NULL);
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
310 }
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
311
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
312 void
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
313 save_tx_commit(struct save *s)
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
314 {
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
315 assert(save_ok(s));
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
316
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
317 (void)save_exec(s, "COMMIT", NULL);
e0657709fbe3 rpg: add support for basic quests
David Demelier <markand@malikania.fr>
parents: 329
diff changeset
318 }