commit 3e3e091
default
·
2022-11-23 12:32:23 +0000 UTC
parent 20235df
New function db_upgrade().
M
data.c
+57,
-7
1@@ -13,6 +13,10 @@
2 #include <glob.h>
3 #include <sys/stat.h>
4
5+double db_layout = 2.0;
6+
7+
8+int db_upgrade(d_char **error);
9
10 int srv_open(char *basedir)
11 /* opens a server */
12@@ -47,13 +51,10 @@ int srv_open(char *basedir)
13 char *host;
14 char *prefix;
15 char *dbglvl;
16- char *layout;
17- double f = 0.0;
18
19 host = xs_dict_get(srv_config, "host");
20 prefix = xs_dict_get(srv_config, "prefix");
21 dbglvl = xs_dict_get(srv_config, "dbglevel");
22- layout = xs_dict_get(srv_config, "layout");
23
24 if (host == NULL || prefix == NULL)
25 error = xs_str_new("ERROR: cannot get server data");
26@@ -67,10 +68,7 @@ int srv_open(char *basedir)
27 error = xs_fmt("DEBUG level set to %d from environment", dbglevel);
28 }
29
30- if (!layout || (f = xs_number_get(layout)) != 2.0)
31- error = xs_fmt("ERROR: unsupported old disk layout %f\n", f);
32- else
33- ret = 1;
34+ ret = db_upgrade(&error);
35 }
36
37 }
38@@ -1238,3 +1236,55 @@ void purge_all(void)
39 }
40 }
41 }
42+
43+
44+int db_upgrade(d_char **error)
45+{
46+ int ret = 1;
47+ int changed = 0;
48+ double f = 0.0;
49+
50+ do {
51+ char *layout = xs_dict_get(srv_config, "layout");
52+
53+ f = xs_number_get(layout);
54+
55+ if (f < 2.0) {
56+ *error = xs_fmt("ERROR: unsupported old disk layout %lf\n", f);
57+ ret = 0;
58+ break;
59+ }
60+/* else
61+ if (f < 2.1) {
62+ srv_log(xs_dup("upgrading db layout to version 2.1"));
63+
64+ xs *dir = xs_fmt("%s/object", srv_basedir);
65+ mkdir(dir, 0755);
66+
67+ xs *nv = xs_number_new(2.1);
68+ srv_config = xs_dict_set(srv_config, "layout", nv);
69+ changed++;
70+ }*/
71+ } while (f < db_layout);
72+
73+ if (f > db_layout) {
74+ *error = xs_fmt("ERROR: unknown future version %lf\n", f);
75+ ret = 0;
76+ }
77+
78+ if (changed) {
79+ /* upgrade the configuration file */
80+ xs *fn = xs_fmt("%s/server.json", srv_basedir);
81+ FILE *f;
82+
83+ if ((f = fopen(fn, "w")) != NULL) {
84+ xs *j = xs_json_dumps_pp(srv_config, 4);
85+ fwrite(j, strlen(j), 1, f);
86+ fclose(f);
87+ }
88+ else
89+ ret = 0;
90+ }
91+
92+ return ret;
93+}
M
snac.h
+1,
-0
1@@ -5,6 +5,7 @@
2
3 #define USER_AGENT "snac/" VERSION
4
5+extern double db_layout;
6 extern d_char *srv_basedir;
7 extern d_char *srv_config;
8 extern d_char *srv_baseurl;
M
utils.c
+7,
-1
1@@ -18,7 +18,7 @@ const char *default_srv_config = "{"
2 "\"prefix\": \"\","
3 "\"address\": \"127.0.0.1\","
4 "\"port\": 8001,"
5- "\"layout\": 2,"
6+ "\"layout\": 0.0,"
7 "\"dbglevel\": 0,"
8 "\"queue_retry_minutes\": 2,"
9 "\"queue_retry_max\": 10,"
10@@ -103,6 +103,9 @@ int initdb(const char *basedir)
11
12 srv_config = xs_json_loads(default_srv_config);
13
14+ xs *layout = xs_number_new(db_layout);
15+ srv_config = xs_dict_set(srv_config, "layout", layout);
16+
17 printf("Network address [%s]:\n", xs_dict_get(srv_config, "address"));
18 {
19 xs *i = xs_strip(xs_readline(stdin));
20@@ -148,6 +151,9 @@ int initdb(const char *basedir)
21 xs *udir = xs_fmt("%s/user", srv_basedir);
22 mkdir(udir, 0755);
23
24+ xs *odir = xs_fmt("%s/object", srv_basedir);
25+ mkdir(odir, 0755);
26+
27 xs *gfn = xs_fmt("%s/greeting.html", srv_basedir);
28 if ((f = fopen(gfn, "w")) == NULL) {
29 printf("ERROR: cannot create '%s'\n", gfn);