diff options
| author | 2022-11-23 13:32:23 +0100 | |
|---|---|---|
| committer | 2022-11-23 13:32:23 +0100 | |
| commit | 3e3e091cdb403a54013dde1cc8a103fae6b0147a (patch) | |
| tree | a426c5cbc9e6ff056ff0a0caf4180fa8229aea59 | |
| parent | Updated TODO. (diff) | |
| download | snac2-3e3e091cdb403a54013dde1cc8a103fae6b0147a.tar.gz snac2-3e3e091cdb403a54013dde1cc8a103fae6b0147a.tar.xz snac2-3e3e091cdb403a54013dde1cc8a103fae6b0147a.zip | |
New function db_upgrade().
| -rw-r--r-- | data.c | 64 | ||||
| -rw-r--r-- | snac.h | 1 | ||||
| -rw-r--r-- | utils.c | 8 |
3 files changed, 65 insertions, 8 deletions
| @@ -13,6 +13,10 @@ | |||
| 13 | #include <glob.h> | 13 | #include <glob.h> |
| 14 | #include <sys/stat.h> | 14 | #include <sys/stat.h> |
| 15 | 15 | ||
| 16 | double db_layout = 2.0; | ||
| 17 | |||
| 18 | |||
| 19 | int db_upgrade(d_char **error); | ||
| 16 | 20 | ||
| 17 | int srv_open(char *basedir) | 21 | int srv_open(char *basedir) |
| 18 | /* opens a server */ | 22 | /* opens a server */ |
| @@ -47,13 +51,10 @@ int srv_open(char *basedir) | |||
| 47 | char *host; | 51 | char *host; |
| 48 | char *prefix; | 52 | char *prefix; |
| 49 | char *dbglvl; | 53 | char *dbglvl; |
| 50 | char *layout; | ||
| 51 | double f = 0.0; | ||
| 52 | 54 | ||
| 53 | host = xs_dict_get(srv_config, "host"); | 55 | host = xs_dict_get(srv_config, "host"); |
| 54 | prefix = xs_dict_get(srv_config, "prefix"); | 56 | prefix = xs_dict_get(srv_config, "prefix"); |
| 55 | dbglvl = xs_dict_get(srv_config, "dbglevel"); | 57 | dbglvl = xs_dict_get(srv_config, "dbglevel"); |
| 56 | layout = xs_dict_get(srv_config, "layout"); | ||
| 57 | 58 | ||
| 58 | if (host == NULL || prefix == NULL) | 59 | if (host == NULL || prefix == NULL) |
| 59 | error = xs_str_new("ERROR: cannot get server data"); | 60 | error = xs_str_new("ERROR: cannot get server data"); |
| @@ -67,10 +68,7 @@ int srv_open(char *basedir) | |||
| 67 | error = xs_fmt("DEBUG level set to %d from environment", dbglevel); | 68 | error = xs_fmt("DEBUG level set to %d from environment", dbglevel); |
| 68 | } | 69 | } |
| 69 | 70 | ||
| 70 | if (!layout || (f = xs_number_get(layout)) != 2.0) | 71 | ret = db_upgrade(&error); |
| 71 | error = xs_fmt("ERROR: unsupported old disk layout %f\n", f); | ||
| 72 | else | ||
| 73 | ret = 1; | ||
| 74 | } | 72 | } |
| 75 | 73 | ||
| 76 | } | 74 | } |
| @@ -1238,3 +1236,55 @@ void purge_all(void) | |||
| 1238 | } | 1236 | } |
| 1239 | } | 1237 | } |
| 1240 | } | 1238 | } |
| 1239 | |||
| 1240 | |||
| 1241 | int db_upgrade(d_char **error) | ||
| 1242 | { | ||
| 1243 | int ret = 1; | ||
| 1244 | int changed = 0; | ||
| 1245 | double f = 0.0; | ||
| 1246 | |||
| 1247 | do { | ||
| 1248 | char *layout = xs_dict_get(srv_config, "layout"); | ||
| 1249 | |||
| 1250 | f = xs_number_get(layout); | ||
| 1251 | |||
| 1252 | if (f < 2.0) { | ||
| 1253 | *error = xs_fmt("ERROR: unsupported old disk layout %lf\n", f); | ||
| 1254 | ret = 0; | ||
| 1255 | break; | ||
| 1256 | } | ||
| 1257 | /* else | ||
| 1258 | if (f < 2.1) { | ||
| 1259 | srv_log(xs_dup("upgrading db layout to version 2.1")); | ||
| 1260 | |||
| 1261 | xs *dir = xs_fmt("%s/object", srv_basedir); | ||
| 1262 | mkdir(dir, 0755); | ||
| 1263 | |||
| 1264 | xs *nv = xs_number_new(2.1); | ||
| 1265 | srv_config = xs_dict_set(srv_config, "layout", nv); | ||
| 1266 | changed++; | ||
| 1267 | }*/ | ||
| 1268 | } while (f < db_layout); | ||
| 1269 | |||
| 1270 | if (f > db_layout) { | ||
| 1271 | *error = xs_fmt("ERROR: unknown future version %lf\n", f); | ||
| 1272 | ret = 0; | ||
| 1273 | } | ||
| 1274 | |||
| 1275 | if (changed) { | ||
| 1276 | /* upgrade the configuration file */ | ||
| 1277 | xs *fn = xs_fmt("%s/server.json", srv_basedir); | ||
| 1278 | FILE *f; | ||
| 1279 | |||
| 1280 | if ((f = fopen(fn, "w")) != NULL) { | ||
| 1281 | xs *j = xs_json_dumps_pp(srv_config, 4); | ||
| 1282 | fwrite(j, strlen(j), 1, f); | ||
| 1283 | fclose(f); | ||
| 1284 | } | ||
| 1285 | else | ||
| 1286 | ret = 0; | ||
| 1287 | } | ||
| 1288 | |||
| 1289 | return ret; | ||
| 1290 | } | ||
| @@ -5,6 +5,7 @@ | |||
| 5 | 5 | ||
| 6 | #define USER_AGENT "snac/" VERSION | 6 | #define USER_AGENT "snac/" VERSION |
| 7 | 7 | ||
| 8 | extern double db_layout; | ||
| 8 | extern d_char *srv_basedir; | 9 | extern d_char *srv_basedir; |
| 9 | extern d_char *srv_config; | 10 | extern d_char *srv_config; |
| 10 | extern d_char *srv_baseurl; | 11 | extern d_char *srv_baseurl; |
| @@ -18,7 +18,7 @@ const char *default_srv_config = "{" | |||
| 18 | "\"prefix\": \"\"," | 18 | "\"prefix\": \"\"," |
| 19 | "\"address\": \"127.0.0.1\"," | 19 | "\"address\": \"127.0.0.1\"," |
| 20 | "\"port\": 8001," | 20 | "\"port\": 8001," |
| 21 | "\"layout\": 2," | 21 | "\"layout\": 0.0," |
| 22 | "\"dbglevel\": 0," | 22 | "\"dbglevel\": 0," |
| 23 | "\"queue_retry_minutes\": 2," | 23 | "\"queue_retry_minutes\": 2," |
| 24 | "\"queue_retry_max\": 10," | 24 | "\"queue_retry_max\": 10," |
| @@ -103,6 +103,9 @@ int initdb(const char *basedir) | |||
| 103 | 103 | ||
| 104 | srv_config = xs_json_loads(default_srv_config); | 104 | srv_config = xs_json_loads(default_srv_config); |
| 105 | 105 | ||
| 106 | xs *layout = xs_number_new(db_layout); | ||
| 107 | srv_config = xs_dict_set(srv_config, "layout", layout); | ||
| 108 | |||
| 106 | printf("Network address [%s]:\n", xs_dict_get(srv_config, "address")); | 109 | printf("Network address [%s]:\n", xs_dict_get(srv_config, "address")); |
| 107 | { | 110 | { |
| 108 | xs *i = xs_strip(xs_readline(stdin)); | 111 | xs *i = xs_strip(xs_readline(stdin)); |
| @@ -148,6 +151,9 @@ int initdb(const char *basedir) | |||
| 148 | xs *udir = xs_fmt("%s/user", srv_basedir); | 151 | xs *udir = xs_fmt("%s/user", srv_basedir); |
| 149 | mkdir(udir, 0755); | 152 | mkdir(udir, 0755); |
| 150 | 153 | ||
| 154 | xs *odir = xs_fmt("%s/object", srv_basedir); | ||
| 155 | mkdir(odir, 0755); | ||
| 156 | |||
| 151 | xs *gfn = xs_fmt("%s/greeting.html", srv_basedir); | 157 | xs *gfn = xs_fmt("%s/greeting.html", srv_basedir); |
| 152 | if ((f = fopen(gfn, "w")) == NULL) { | 158 | if ((f = fopen(gfn, "w")) == NULL) { |
| 153 | printf("ERROR: cannot create '%s'\n", gfn); | 159 | printf("ERROR: cannot create '%s'\n", gfn); |