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