summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordefault <nobody@localhost>2022-11-23 14:38:37 +0100
committerdefault <nobody@localhost>2022-11-23 14:38:37 +0100
commit494b1d43ba771b5db3b096cd0d8c04893b2d645f (patch)
treee7159a88fade085b53aacbfbd13677530a933eee
parent14bcc0f8588935b5b382e5abe07ac8b506e80287 (diff)
New generic object functions.
-rw-r--r--data.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/data.c b/data.c
index 22c47d2..044c51b 100644
--- a/data.c
+++ b/data.c
@@ -190,6 +190,80 @@ double mtime(char *fn)
}
+/** object database 2.1+ **/
+
+d_char *_object_fn_by_md5(const char *md5)
+{
+ xs *bfn = xs_fmt("%s/object/%c%c/", srv_basedir, md5[0], md5[1]);
+
+ mkdir(bfn, 0755);
+
+ return xs_fmt("%s/%s.json", bfn, md5);
+}
+
+
+d_char *_object_fn_by_id(const char *id)
+{
+ xs *md5 = xs_md5_hex(id, strlen(id));
+
+ return _object_fn_by_md5(md5);
+}
+
+
+int object_get(const char *id, d_char **obj, const char *type)
+/* returns a loaded object, optionally of the requested type */
+{
+ int status = 404;
+ xs *fn = _object_fn_by_id(id);
+ FILE *f;
+
+ if ((f = fopen(fn, "r")) != NULL) {
+ xs *j = xs_readall(f);
+ fclose(f);
+
+ *obj = xs_json_loads(j);
+
+ if (*obj) {
+ status = 200;
+
+ /* specific type requested? */
+ if (!xs_is_null(type)) {
+ char *v = xs_dict_get(*obj, "type");
+
+ if (xs_is_null(v) || strcmp(v, type) != 0) {
+ status = 404;
+ *obj = xs_free(*obj);
+ }
+ }
+ }
+ }
+ else
+ *obj = NULL;
+
+ return status;
+}
+
+
+int object_add(const char *id, d_char *obj)
+/* stores an object */
+{
+ int status = 201; /* Created */
+ xs *fn = _object_fn_by_id(id);
+ FILE *f;
+
+ if ((f = fopen(fn, "w")) != NULL) {
+ xs *j = xs_json_dumps_pp(obj, 4);
+
+ fwrite(j, strlen(j), 1, f);
+ fclose(f);
+ }
+ else
+ status = 500;
+
+ return status;
+}
+
+
d_char *_follower_fn(snac *snac, char *actor)
{
xs *md5 = xs_md5_hex(actor, strlen(actor));
@@ -877,6 +951,8 @@ int actor_add(snac *snac, char *actor, char *msg)
snac_debug(snac, 2, xs_fmt("actor_add %s %s", actor, fn));
+ object_add(actor, msg);
+
return ret;
}