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 @@
15#include <sys/file.h> 15#include <sys/file.h>
16#include <fcntl.h> 16#include <fcntl.h>
17 17
18double db_layout = 2.4; 18double db_layout = 2.5;
19 19
20 20
21int db_upgrade(d_char **error); 21int db_upgrade(d_char **error);
@@ -641,94 +641,73 @@ int object_user_cache_in(snac *snac, const char *id, const char *cachedir)
641} 641}
642 642
643 643
644/** specialized functions **/ 644d_char *object_user_cache_list(snac *snac, const char *cachedir, int max)
645 645/* returns the objects in a cache as a list */
646d_char *_follower_fn(snac *snac, char *actor)
647{ 646{
648 xs *md5 = xs_md5_hex(actor, strlen(actor)); 647 xs *idx = xs_fmt("%s/%s.idx", snac->basedir, cachedir);
649 return xs_fmt("%s/followers/%s.json", snac->basedir, md5); 648 return index_list(idx, max);
650} 649}
651 650
652 651
653int follower_add(snac *snac, char *actor, char *msg) 652/** specialized functions **/
654/* adds a follower */
655{
656 int ret = 201; /* created */
657 xs *fn = _follower_fn(snac, actor);
658 FILE *f;
659 653
660 if ((f = fopen(fn, "w")) != NULL) { 654/** followers **/
661 xs *j = xs_json_dumps_pp(msg, 4);
662 655
663 fwrite(j, 1, strlen(j), f); 656int follower_add(snac *snac, const char *actor)
664 fclose(f); 657/* adds a follower */
665 } 658{
666 else 659 int status = object_user_cache_add(snac, actor, "followers");
667 ret = 500;
668 660
669 snac_debug(snac, 2, xs_fmt("follower_add %s %s", actor, fn)); 661 snac_debug(snac, 2, xs_fmt("follower_add %s %s", actor));
670 662
671 return ret; 663 return status;
672} 664}
673 665
674 666
675int follower_del(snac *snac, char *actor) 667int follower_del(snac *snac, const char *actor)
676/* deletes a follower */ 668/* deletes a follower */
677{ 669{
678 int status = 200; 670 int status = object_user_cache_del(snac, actor, "followers");
679 xs *fn = _follower_fn(snac, actor);
680
681 if (fn != NULL)
682 unlink(fn);
683 else
684 status = 404;
685 671
686 snac_debug(snac, 2, xs_fmt("follower_del %s %s", actor, fn)); 672 snac_debug(snac, 2, xs_fmt("follower_del %s %s", actor));
687 673
688 return status; 674 return status;
689} 675}
690 676
691 677
692int follower_check(snac *snac, char *actor) 678int follower_check(snac *snac, const char *actor)
693/* checks if someone is a follower */ 679/* checks if someone is a follower */
694{ 680{
695 xs *fn = _follower_fn(snac, actor); 681 return object_user_cache_in(snac, actor, "followers");
696
697 return !!(mtime(fn) != 0.0);
698} 682}
699 683
700 684
701d_char *follower_list(snac *snac) 685d_char *follower_list(snac *snac)
702/* returns the list of followers */ 686/* returns the list of followers */
703{ 687{
704 xs *spec = xs_fmt("%s/followers/" "*.json", snac->basedir); 688 xs *list = object_user_cache_list(snac, "followers", XS_ALL);
705 xs *glist = xs_glob(spec, 0, 0); 689 d_char *fwers = xs_list_new();
706 char *p, *v; 690 char *p, *v;
707 d_char *list = xs_list_new();
708 691
709 /* iterate the list of files */ 692 /* resolve the list of md5 to be a list of actors */
710 p = glist; 693 p = list;
711 while (xs_list_iter(&p, &v)) { 694 while (xs_list_iter(&p, &v)) {
712 FILE *f; 695 xs *a_obj = NULL;
713 696
714 /* load the follower data */ 697 if (valid_status(object_get_by_md5(v, &a_obj, NULL))) {
715 if ((f = fopen(v, "r")) != NULL) { 698 char *actor = xs_dict_get(a_obj, "id");
716 xs *j = xs_readall(f);
717 fclose(f);
718 699
719 if (j != NULL) { 700 if (!xs_is_null(actor))
720 xs *o = xs_json_loads(j); 701 fwers = xs_list_append(fwers, actor);
721
722 if (o != NULL)
723 list = xs_list_append(list, o);
724 }
725 } 702 }
726 } 703 }
727 704
728 return list; 705 return fwers;
729} 706}
730 707
731 708
709/** timeline **/
710
732double timeline_mtime(snac *snac) 711double timeline_mtime(snac *snac)
733{ 712{
734 xs *fn = xs_fmt("%s/timeline", snac->basedir); 713 xs *fn = xs_fmt("%s/timeline", snac->basedir);