Add some subscription (a.k.a. "follow") functionality
[blerg.git] / database / subscription.c
1 #include <sys/types.h>
2 #include <sys/stat.h>
3 #include <fcntl.h>
4 #include <stdio.h>
5 #include <string.h>
6 #include "subscription.h"
7 #include "stringbucket.h"
8 #include "config.h"
9
10 int subscription_add(const char *from, const char *to) {
11         char filename[512];
12         struct stringbucket * sb;
13
14         snprintf(filename, 512, "%s/%s/subscriptions", DATA_PATH, from);
15         sb = stringbucket_open(filename);
16         stringbucket_add(sb, to);
17         stringbucket_close(sb);
18
19         snprintf(filename, 512, "%s/%s/subscribers", DATA_PATH, to);
20         sb = stringbucket_open(filename);
21         stringbucket_add(sb, from);
22         stringbucket_close(sb);
23 }
24
25 int subscription_remove(const char *from, const char *to) {
26         char filename[512];
27         struct stringbucket * sb;
28
29         snprintf(filename, 512, "%s/%s/subscriptions", DATA_PATH, from);
30         sb = stringbucket_open(filename);
31         stringbucket_delete(sb, to);
32         stringbucket_close(sb);
33
34         snprintf(filename, 512, "%s/%s/subscribers", DATA_PATH, to);
35         sb = stringbucket_open(filename);
36         stringbucket_delete(sb, from);
37         stringbucket_close(sb);
38 }
39
40 void subscription_notify_add_item(char *to, void *stuff) {
41         char filename[512];
42
43         snprintf(filename, 512, "%s/%s/subscription_feed", DATA_PATH, to);
44         int fd = open(filename, O_WRONLY | O_APPEND | O_CREAT);
45         write(fd, stuff, sizeof(struct subscription_record));
46         close(fd);
47 }
48
49 int subscription_notify(const char *author, uint64_t record) {
50         char filename[512];
51         struct subscription_record r;
52
53         strncpy(r.author, author, 32);
54         r.record = record;
55
56         snprintf(filename, 512, "%s/%s/subscribers", DATA_PATH, author);
57         struct stringbucket * sb = stringbucket_open(filename);
58         stringbucket_iterate(sb, subscription_notify_add_item, &r);
59         stringbucket_close(sb);
60 }