Add mute support to perl lib
[blerg.git] / lib / perl / Blerg-Database / Database.xs
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4
5 #include "ppport.h"
6
7 #include "const-c.inc"
8
9 #include "database/database.h"
10 #include "database/blergref.h"
11 #include "database/tags.h"
12 #include "database/subscription.h"
13 #include "database/util.h"
14
15 MODULE = Blerg::Database                PACKAGE = Blerg::Database               
16
17 INCLUDE: const-xs.inc
18 PROTOTYPES: ENABLE
19
20 int exists(const char *name)
21     CODE:
22         RETVAL = blerg_exists(name);
23     OUTPUT:
24         RETVAL
25
26 struct blerg * _open(const char *name)
27     CODE:
28         RETVAL = blerg_open(name);
29     OUTPUT:
30         RETVAL
31
32 int _close(struct blerg *ptr)
33     CODE:
34         RETVAL = blerg_close(ptr);
35     OUTPUT:
36         RETVAL
37
38 int _store(struct blerg *ptr, const char *data, int length(data))
39     PROTOTYPE: $$
40     CODE:
41         RETVAL = blerg_store(ptr, data, XSauto_length_of_data);
42     OUTPUT:
43         RETVAL
44
45 const char * _fetch(struct blerg *ptr, int record)
46     INIT:
47         char *buf;
48         int buflen;
49         int n;
50     PPCODE:
51         n = blerg_fetch(ptr, record, &buf, &buflen);
52         if (!n) {
53             XSRETURN_UNDEF;
54         }
55         XPUSHs(sv_2mortal(newSVpvn(buf, buflen)));
56         free(buf);
57
58 const char * _get_record_count(struct blerg *ptr)
59     INIT:
60         uint64_t count;
61         char buf[21];
62         int n;
63     PPCODE:
64         count = blerg_get_record_count(ptr);
65         n = snprintf(buf, 21, "%llu", count);
66         XPUSHs(sv_2mortal(newSVpv(buf, n)));
67
68 time_t _get_timestamp(struct blerg *ptr, int record)
69     CODE:
70         RETVAL = blerg_get_timestamp(ptr, record);
71     OUTPUT:
72         RETVAL
73
74 int _set_subscription_mark(struct blerg *ptr)
75     CODE:
76         RETVAL = blerg_set_subscription_mark(ptr);
77     OUTPUT:
78         RETVAL
79
80 const char * _get_subscription_mark(struct blerg *ptr)
81     INIT:
82         uint64_t mark;
83         char buf[21];
84         int n;
85     PPCODE:
86         mark = blerg_get_subscription_mark(ptr);
87         n = snprintf(buf, 21, "%llu", mark);
88         XPUSHs(sv_2mortal(newSVpv(buf, n)));
89
90 int _set_mute(struct blerg *ptr, int v)
91     CODE:
92         RETVAL = blerg_set_mute(ptr, v);
93     OUTPUT:
94         RETVAL
95
96 int _get_mute(struct blerg *ptr)
97     CODE:
98         RETVAL = blerg_get_mute(ptr);
99     OUTPUT:
100         RETVAL
101
102 void _tag_list(const char *tag, const char *str_offset, int direction)
103     INIT:
104         HV * tmp;
105         struct blergref *list;
106         uint64_t offset;
107         char buf[21];
108         int count, i, n;
109     PPCODE:
110         offset = strtoull(str_offset, NULL, 0);
111         list = tag_list(tag, offset, &count, direction);
112         if (list == NULL) {
113             XSRETURN_UNDEF;
114         }
115
116         i = count - 1;
117         while (i >= 0) {
118             tmp = newHV();
119             hv_store(tmp, "author", 6, newSVpv(list[i].author, 0), 0);
120             n = snprintf(buf, 21, "%llu", list[i].record);
121             hv_store(tmp, "record", 6, newSVpv(buf, n), 0);
122             XPUSHs(sv_2mortal(newRV_noinc((SV*)tmp)));
123             i--;
124         }
125         free(list);