Add subscription support to perl lib
[blerg.git] / lib / perl / Blerg-Database / Database.xs
index a26e736..9fc728f 100644 (file)
 #include "database/subscription.h"
 #include "database/util.h"
 
+HV * blergref_to_perl_hash(struct blergref *list) {
+        HV *tmp;
+        char buf[21];
+        int n;
+
+        tmp = newHV();
+        hv_store(tmp, "author", 6, newSVpv(list->author, 0), 0);
+        n = snprintf(buf, 21, "%llu", list->record);
+        hv_store(tmp, "record", 6, newSVpv(buf, n), 0);
+
+        return tmp;
+}
+
 MODULE = Blerg::Database               PACKAGE = Blerg::Database               
 
 INCLUDE: const-xs.inc
@@ -104,8 +117,7 @@ void _tag_list(const char *tag, const char *str_offset, int direction)
         HV * tmp;
         struct blergref *list;
         uint64_t offset;
-        char buf[21];
-        int count, i, n;
+        int count, i;
     PPCODE:
         offset = strtoull(str_offset, NULL, 0);
         list = tag_list(tag, offset, &count, direction);
@@ -115,11 +127,45 @@ void _tag_list(const char *tag, const char *str_offset, int direction)
 
         i = count - 1;
         while (i >= 0) {
-            tmp = newHV();
-            hv_store(tmp, "author", 6, newSVpv(list[i].author, 0), 0);
-            n = snprintf(buf, 21, "%llu", list[i].record);
-            hv_store(tmp, "record", 6, newSVpv(buf, n), 0);
+            tmp = blergref_to_perl_hash(&list[i]);
+            XPUSHs(sv_2mortal(newRV_noinc((SV*)tmp)));
+            i--;
+        }
+        free(list);
+
+int subscription_add(const char *from, const char *to)
+    CODE:
+        RETVAL = subscription_add(from, to);
+    OUTPUT:
+        RETVAL
+
+int subscription_remove(const char *from, const char *to)
+    CODE:
+        RETVAL = subscription_remove(from, to);
+    OUTPUT:
+        RETVAL
+
+void subscription_list(const char *author, const char *str_offset, int direction)
+    INIT:
+        HV *tmp;
+        struct blergref *list;
+        uint64_t offset;
+        int count, i;
+    PPCODE:
+        offset = strtoull(str_offset, NULL, 0);
+        list = subscription_list(author, offset, &count, direction);
+        if (list == NULL) {
+            XSRETURN_UNDEF;
+        }
+
+        i = count - 1;
+        while (i >= 0) {
+            tmp = blergref_to_perl_hash(&list[i]);
             XPUSHs(sv_2mortal(newRV_noinc((SV*)tmp)));
             i--;
         }
         free(list);
+
+int valid_tag_name(const char *name)
+
+int valid_name(const char *name)