summaryrefslogtreecommitdiff
path: root/data.c
diff options
context:
space:
mode:
Diffstat (limited to 'data.c')
-rw-r--r--data.c81
1 files changed, 30 insertions, 51 deletions
diff --git a/data.c b/data.c
index b3f124e..1b9be2d 100644
--- a/data.c
+++ b/data.c
@@ -15,7 +15,7 @@
#include <sys/file.h>
#include <fcntl.h>
-double db_layout = 2.4;
+double db_layout = 2.5;
int db_upgrade(d_char **error);
@@ -641,94 +641,73 @@ int object_user_cache_in(snac *snac, const char *id, const char *cachedir)
}
-/** specialized functions **/
-
-d_char *_follower_fn(snac *snac, char *actor)
+d_char *object_user_cache_list(snac *snac, const char *cachedir, int max)
+/* returns the objects in a cache as a list */
{
- xs *md5 = xs_md5_hex(actor, strlen(actor));
- return xs_fmt("%s/followers/%s.json", snac->basedir, md5);
+ xs *idx = xs_fmt("%s/%s.idx", snac->basedir, cachedir);
+ return index_list(idx, max);
}
-int follower_add(snac *snac, char *actor, char *msg)
-/* adds a follower */
-{
- int ret = 201; /* created */
- xs *fn = _follower_fn(snac, actor);
- FILE *f;
+/** specialized functions **/
- if ((f = fopen(fn, "w")) != NULL) {
- xs *j = xs_json_dumps_pp(msg, 4);
+/** followers **/
- fwrite(j, 1, strlen(j), f);
- fclose(f);
- }
- else
- ret = 500;
+int follower_add(snac *snac, const char *actor)
+/* adds a follower */
+{
+ int status = object_user_cache_add(snac, actor, "followers");
- snac_debug(snac, 2, xs_fmt("follower_add %s %s", actor, fn));
+ snac_debug(snac, 2, xs_fmt("follower_add %s %s", actor));
- return ret;
+ return status;
}
-int follower_del(snac *snac, char *actor)
+int follower_del(snac *snac, const char *actor)
/* deletes a follower */
{
- int status = 200;
- xs *fn = _follower_fn(snac, actor);
-
- if (fn != NULL)
- unlink(fn);
- else
- status = 404;
+ int status = object_user_cache_del(snac, actor, "followers");
- snac_debug(snac, 2, xs_fmt("follower_del %s %s", actor, fn));
+ snac_debug(snac, 2, xs_fmt("follower_del %s %s", actor));
return status;
}
-int follower_check(snac *snac, char *actor)
+int follower_check(snac *snac, const char *actor)
/* checks if someone is a follower */
{
- xs *fn = _follower_fn(snac, actor);
-
- return !!(mtime(fn) != 0.0);
+ return object_user_cache_in(snac, actor, "followers");
}
d_char *follower_list(snac *snac)
/* returns the list of followers */
{
- xs *spec = xs_fmt("%s/followers/" "*.json", snac->basedir);
- xs *glist = xs_glob(spec, 0, 0);
+ xs *list = object_user_cache_list(snac, "followers", XS_ALL);
+ d_char *fwers = xs_list_new();
char *p, *v;
- d_char *list = xs_list_new();
- /* iterate the list of files */
- p = glist;
+ /* resolve the list of md5 to be a list of actors */
+ p = list;
while (xs_list_iter(&p, &v)) {
- FILE *f;
+ xs *a_obj = NULL;
- /* load the follower data */
- if ((f = fopen(v, "r")) != NULL) {
- xs *j = xs_readall(f);
- fclose(f);
+ if (valid_status(object_get_by_md5(v, &a_obj, NULL))) {
+ char *actor = xs_dict_get(a_obj, "id");
- if (j != NULL) {
- xs *o = xs_json_loads(j);
-
- if (o != NULL)
- list = xs_list_append(list, o);
- }
+ if (!xs_is_null(actor))
+ fwers = xs_list_append(fwers, actor);
}
}
- return list;
+ return fwers;
}
+/** timeline **/
+
double timeline_mtime(snac *snac)
{
xs *fn = xs_fmt("%s/timeline", snac->basedir);