commit 3e3e091

default  ·  2022-11-23 12:32:23 +0000 UTC
parent 20235df
New function db_upgrade().
3 files changed,  +65, -8
M data.c
M snac.h
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;
+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);