commit 07fec71

default  ·  2022-11-28 09:46:42 +0000 UTC
parent 9c136da
Upgraded followers to the new db.
5 files changed,  +84, -63
M data.c
M html.c
M snac.h
+3, -5
 1@@ -192,12 +192,10 @@ d_char *recipient_list(snac *snac, char *msg, int expand_public)
 2             if (expand_public && strcmp(v, public_address) == 0) {
 3                 /* iterate the followers and add them */
 4                 xs *fwers = follower_list(snac);
 5-                char *fw;
 6+                char *actor;
 7 
 8                 char *p = fwers;
 9-                while (xs_list_iter(&p, &fw)) {
10-                    char *actor = xs_dict_get(fw, "actor");
11-
12+                while (xs_list_iter(&p, &actor)) {
13                     if (xs_list_in(list, actor) == -1)
14                         list = xs_list_append(list, actor);
15                 }
16@@ -832,7 +830,7 @@ int process_message(snac *snac, char *msg, char *req)
17 
18         timeline_add(snac, xs_dict_get(f_msg, "id"), f_msg, NULL, NULL);
19 
20-        follower_add(snac, actor, f_msg);
21+        follower_add(snac, actor);
22 
23         snac_log(snac, xs_fmt("New follower %s", actor));
24         do_notify = 1;
M data.c
+30, -51
  1@@ -15,7 +15,7 @@
  2 #include <sys/file.h>
  3 #include <fcntl.h>
  4 
  5-double db_layout = 2.4;
  6+double db_layout = 2.5;
  7 
  8 
  9 int db_upgrade(d_char **error);
 10@@ -641,94 +641,73 @@ int object_user_cache_in(snac *snac, const char *id, const char *cachedir)
 11 }
 12 
 13 
 14-/** specialized functions **/
 15-
 16-d_char *_follower_fn(snac *snac, char *actor)
 17+d_char *object_user_cache_list(snac *snac, const char *cachedir, int max)
 18+/* returns the objects in a cache as a list */
 19 {
 20-    xs *md5 = xs_md5_hex(actor, strlen(actor));
 21-    return xs_fmt("%s/followers/%s.json", snac->basedir, md5);
 22+    xs *idx = xs_fmt("%s/%s.idx", snac->basedir, cachedir);
 23+    return index_list(idx, max);
 24 }
 25 
 26 
 27-int follower_add(snac *snac, char *actor, char *msg)
 28-/* adds a follower */
 29-{
 30-    int ret = 201; /* created */
 31-    xs *fn = _follower_fn(snac, actor);
 32-    FILE *f;
 33+/** specialized functions **/
 34 
 35-    if ((f = fopen(fn, "w")) != NULL) {
 36-        xs *j = xs_json_dumps_pp(msg, 4);
 37+/** followers **/
 38 
 39-        fwrite(j, 1, strlen(j), f);
 40-        fclose(f);
 41-    }
 42-    else
 43-        ret = 500;
 44+int follower_add(snac *snac, const char *actor)
 45+/* adds a follower */
 46+{
 47+    int status = object_user_cache_add(snac, actor, "followers");
 48 
 49-    snac_debug(snac, 2, xs_fmt("follower_add %s %s", actor, fn));
 50+    snac_debug(snac, 2, xs_fmt("follower_add %s %s", actor));
 51 
 52-    return ret;
 53+    return status;
 54 }
 55 
 56 
 57-int follower_del(snac *snac, char *actor)
 58+int follower_del(snac *snac, const char *actor)
 59 /* deletes a follower */
 60 {
 61-    int status = 200;
 62-    xs *fn = _follower_fn(snac, actor);
 63-
 64-    if (fn != NULL)
 65-        unlink(fn);
 66-    else
 67-        status = 404;
 68+    int status = object_user_cache_del(snac, actor, "followers");
 69 
 70-    snac_debug(snac, 2, xs_fmt("follower_del %s %s", actor, fn));
 71+    snac_debug(snac, 2, xs_fmt("follower_del %s %s", actor));
 72 
 73     return status;
 74 }
 75 
 76 
 77-int follower_check(snac *snac, char *actor)
 78+int follower_check(snac *snac, const char *actor)
 79 /* checks if someone is a follower */
 80 {
 81-    xs *fn = _follower_fn(snac, actor);
 82-
 83-    return !!(mtime(fn) != 0.0);
 84+    return object_user_cache_in(snac, actor, "followers");
 85 }
 86 
 87 
 88 d_char *follower_list(snac *snac)
 89 /* returns the list of followers */
 90 {
 91-    xs *spec = xs_fmt("%s/followers/" "*.json", snac->basedir);
 92-    xs *glist = xs_glob(spec, 0, 0);
 93+    xs *list      = object_user_cache_list(snac, "followers", XS_ALL);
 94+    d_char *fwers = xs_list_new();
 95     char *p, *v;
 96-    d_char *list = xs_list_new();
 97 
 98-    /* iterate the list of files */
 99-    p = glist;
100+    /* resolve the list of md5 to be a list of actors */
101+    p = list;
102     while (xs_list_iter(&p, &v)) {
103-        FILE *f;
104+        xs *a_obj = NULL;
105 
106-        /* load the follower data */
107-        if ((f = fopen(v, "r")) != NULL) {
108-            xs *j = xs_readall(f);
109-            fclose(f);
110+        if (valid_status(object_get_by_md5(v, &a_obj, NULL))) {
111+            char *actor = xs_dict_get(a_obj, "id");
112 
113-            if (j != NULL) {
114-                xs *o = xs_json_loads(j);
115-
116-                if (o != NULL)
117-                    list = xs_list_append(list, o);
118-            }
119+            if (!xs_is_null(actor))
120+                fwers = xs_list_append(fwers, actor);
121         }
122     }
123 
124-    return list;
125+    return fwers;
126 }
127 
128 
129+/** timeline **/
130+
131 double timeline_mtime(snac *snac)
132 {
133     xs *fn = xs_fmt("%s/timeline", snac->basedir);
M html.c
+3, -4
 1@@ -840,13 +840,12 @@ d_char *html_people_list(snac *snac, d_char *os, d_char *list, const char *heade
 2 {
 3     xs *s = xs_str_new(NULL);
 4     xs *h = xs_fmt("<h2>%s</h2>\n", header);
 5-    char *p, *v;
 6+    char *p, *actor_id;
 7 
 8     s = xs_str_cat(s, h);
 9 
10     p = list;
11-    while (xs_list_iter(&p, &v)) {
12-        char *actor_id = xs_dict_get(v, "actor");
13+    while (xs_list_iter(&p, &actor_id)) {
14         xs *md5 = xs_md5_hex(actor_id, strlen(actor_id));
15         xs *actor = NULL;
16 
17@@ -939,7 +938,7 @@ d_char *html_people(snac *snac)
18 
19     s = html_user_header(snac, s, 0);
20 
21-    s = html_people_list(snac, s, wing, L("People you follow"), "i");
22+//    s = html_people_list(snac, s, wing, L("People you follow"), "i");
23 
24     s = html_people_list(snac, s, wers, L("People that follows you"), "e");
25 
M snac.h
+3, -3
 1@@ -62,9 +62,9 @@ d_char *index_list_desc(const char *fn, int max);
 2 int object_del(const char *id);
 3 int object_del_if_unref(const char *id);
 4 
 5-int follower_add(snac *snac, char *actor, char *msg);
 6-int follower_del(snac *snac, char *actor);
 7-int follower_check(snac *snac, char *actor);
 8+int follower_add(snac *snac, const char *actor);
 9+int follower_del(snac *snac, const char *actor);
10+int follower_check(snac *snac, const char *actor);
11 d_char *follower_list(snac *snac);
12 
13 double timeline_mtime(snac *snac);
+45, -0
 1@@ -128,6 +128,51 @@ int db_upgrade(d_char **error)
 2 
 3             nf = 2.4;
 4         }
 5+        else
 6+        if (f < 2.5) {
 7+            /* upgrade followers */
 8+            xs *users = user_list();
 9+            char *p, *v;
10+
11+            xs_debug();
12+
13+            p = users;
14+            while (xs_list_iter(&p, &v)) {
15+                snac snac;
16+
17+                if (user_open(&snac, v)) {
18+                    xs *spec = xs_fmt("%s/followers/" "*.json", snac.basedir);
19+                    xs *dir  = xs_glob(spec, 0, 0);
20+                    char *p, *v;
21+
22+                    p = dir;
23+                    while (xs_list_iter(&p, &v)) {
24+                        FILE *f;
25+
26+                        if ((f = fopen(v, "r")) != NULL) {
27+                            xs *s = xs_readall(f);
28+                            xs *o = xs_json_loads(s);
29+                            fclose(f);
30+
31+                            char *type = xs_dict_get(o, "type");
32+
33+                            if (!xs_is_null(type) && strcmp(type, "Follow") == 0) {
34+                                unlink(v);
35+
36+                                char *actor = xs_dict_get(o, "actor");
37+
38+                                if (!xs_is_null(actor))
39+                                    follower_add(&snac, actor);
40+                            }
41+                        }
42+                    }
43+
44+                    user_free(&snac);
45+                }
46+            }
47+
48+            nf = 2.5;
49+        }
50 
51         if (f < nf) {
52             f          = nf;