upgrade.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /* snac - A simple, minimalistic ActivityPub instance */
  2. /* copyright (c) 2022 grunfink - MIT license */
  3. #include "xs.h"
  4. #include "xs_io.h"
  5. #include "xs_json.h"
  6. #include "xs_glob.h"
  7. #include "snac.h"
  8. #include <sys/stat.h>
  9. int db_upgrade(d_char **error)
  10. {
  11. int ret = 1;
  12. int changed = 0;
  13. double f = 0.0;
  14. for (;;) {
  15. char *layout = xs_dict_get(srv_config, "layout");
  16. double nf;
  17. f = nf = xs_number_get(layout);
  18. if (!(f < db_layout))
  19. break;
  20. srv_log(xs_fmt("db_upgrade %1.1lf < %1.1lf", f, db_layout));
  21. if (f < 2.0) {
  22. *error = xs_fmt("ERROR: unsupported old disk layout %1.1lf\n", f);
  23. ret = 0;
  24. break;
  25. }
  26. else
  27. if (f < 2.1) {
  28. xs *dir = xs_fmt("%s/object", srv_basedir);
  29. mkdir(dir, 0755);
  30. nf = 2.1;
  31. }
  32. if (f < nf) {
  33. f = nf;
  34. xs *nv = xs_number_new(f);
  35. srv_config = xs_dict_set(srv_config, "layout", nv);
  36. srv_log(xs_fmt("db_upgrade converted to version %1.1lf", f));
  37. changed++;
  38. }
  39. else
  40. break;
  41. }
  42. if (f > db_layout) {
  43. *error = xs_fmt("ERROR: unknown future version %lf\n", f);
  44. ret = 0;
  45. }
  46. if (changed) {
  47. /* upgrade the configuration file */
  48. xs *fn = xs_fmt("%s/server.json", srv_basedir);
  49. FILE *f;
  50. if ((f = fopen(fn, "w")) != NULL) {
  51. xs *j = xs_json_dumps_pp(srv_config, 4);
  52. fwrite(j, strlen(j), 1, f);
  53. fclose(f);
  54. srv_log(xs_fmt("upgraded db %s after %d changes", fn, changed));
  55. }
  56. else
  57. ret = 0;
  58. }
  59. return ret;
  60. }