commit 494b1d4
default
·
2022-11-23 13:38:37 +0000 UTC
parent 14bcc0f
New generic object functions.
1 files changed,
+76,
-0
M
data.c
M
data.c
+76,
-0
1@@ -190,6 +190,80 @@ double mtime(char *fn)
2 }
3
4
5+/** object database 2.1+ **/
6+
7+d_char *_object_fn_by_md5(const char *md5)
8+{
9+ xs *bfn = xs_fmt("%s/object/%c%c/", srv_basedir, md5[0], md5[1]);
10+
11+ mkdir(bfn, 0755);
12+
13+ return xs_fmt("%s/%s.json", bfn, md5);
14+}
15+
16+
17+d_char *_object_fn_by_id(const char *id)
18+{
19+ xs *md5 = xs_md5_hex(id, strlen(id));
20+
21+ return _object_fn_by_md5(md5);
22+}
23+
24+
25+int object_get(const char *id, d_char **obj, const char *type)
26+/* returns a loaded object, optionally of the requested type */
27+{
28+ int status = 404;
29+ xs *fn = _object_fn_by_id(id);
30+ FILE *f;
31+
32+ if ((f = fopen(fn, "r")) != NULL) {
33+ xs *j = xs_readall(f);
34+ fclose(f);
35+
36+ *obj = xs_json_loads(j);
37+
38+ if (*obj) {
39+ status = 200;
40+
41+ /* specific type requested? */
42+ if (!xs_is_null(type)) {
43+ char *v = xs_dict_get(*obj, "type");
44+
45+ if (xs_is_null(v) || strcmp(v, type) != 0) {
46+ status = 404;
47+ *obj = xs_free(*obj);
48+ }
49+ }
50+ }
51+ }
52+ else
53+ *obj = NULL;
54+
55+ return status;
56+}
57+
58+
59+int object_add(const char *id, d_char *obj)
60+/* stores an object */
61+{
62+ int status = 201; /* Created */
63+ xs *fn = _object_fn_by_id(id);
64+ FILE *f;
65+
66+ if ((f = fopen(fn, "w")) != NULL) {
67+ xs *j = xs_json_dumps_pp(obj, 4);
68+
69+ fwrite(j, strlen(j), 1, f);
70+ fclose(f);
71+ }
72+ else
73+ status = 500;
74+
75+ return status;
76+}
77+
78+
79 d_char *_follower_fn(snac *snac, char *actor)
80 {
81 xs *md5 = xs_md5_hex(actor, strlen(actor));
82@@ -877,6 +951,8 @@ int actor_add(snac *snac, char *actor, char *msg)
83
84 snac_debug(snac, 2, xs_fmt("actor_add %s %s", actor, fn));
85
86+ object_add(actor, msg);
87+
88 return ret;
89 }
90