diff options
Diffstat (limited to 'data.c')
| -rw-r--r-- | data.c | 81 |
1 files changed, 30 insertions, 51 deletions
| @@ -15,7 +15,7 @@ | |||
| 15 | #include <sys/file.h> | 15 | #include <sys/file.h> |
| 16 | #include <fcntl.h> | 16 | #include <fcntl.h> |
| 17 | 17 | ||
| 18 | double db_layout = 2.4; | 18 | double db_layout = 2.5; |
| 19 | 19 | ||
| 20 | 20 | ||
| 21 | int db_upgrade(d_char **error); | 21 | int 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 **/ | 644 | d_char *object_user_cache_list(snac *snac, const char *cachedir, int max) |
| 645 | 645 | /* returns the objects in a cache as a list */ | |
| 646 | d_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 | ||
| 653 | int 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); | 656 | int 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 | ||
| 675 | int follower_del(snac *snac, char *actor) | 667 | int 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 | ||
| 692 | int follower_check(snac *snac, char *actor) | 678 | int 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 | ||
| 701 | d_char *follower_list(snac *snac) | 685 | d_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 | |||
| 732 | double timeline_mtime(snac *snac) | 711 | double timeline_mtime(snac *snac) |
| 733 | { | 712 | { |
| 734 | xs *fn = xs_fmt("%s/timeline", snac->basedir); | 713 | xs *fn = xs_fmt("%s/timeline", snac->basedir); |