Fix 64-bit-ness in Database.xs
[blerg.git] / lib / perl / Blerg-Database / Database.xs
index a26e736..04406c8 100644 (file)
@@ -4,14 +4,28 @@
 
 #include "ppport.h"
 
-#include "const-c.inc"
-
+#include "config.h"
 #include "database/database.h"
 #include "database/blergref.h"
 #include "database/tags.h"
 #include "database/subscription.h"
 #include "database/util.h"
 
+#include "const-c.inc"
+
+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
@@ -35,19 +49,25 @@ int _close(struct blerg *ptr)
     OUTPUT:
         RETVAL
 
-int _store(struct blerg *ptr, const char *data, int length(data))
+const char * _store(struct blerg *ptr, const char *data, int length(data))
     PROTOTYPE: $$
-    CODE:
-        RETVAL = blerg_store(ptr, data, XSauto_length_of_data);
-    OUTPUT:
-        RETVAL
+    INIT:
+        uint64_t record;
+        char buf[21];
+        int n;
+    PPCODE:
+        record = blerg_store(ptr, data, XSauto_length_of_data);
+        n = snprintf(buf, 21, "%llu", record);
+        XPUSHs(sv_2mortal(newSVpv(buf, n)));
 
-const char * _fetch(struct blerg *ptr, int record)
+const char * _fetch(struct blerg *ptr, const char *str_record)
     INIT:
+        uint64_t record;
         char *buf;
         int buflen;
         int n;
     PPCODE:
+        record = strtoull(str_record, NULL, 0);
         n = blerg_fetch(ptr, record, &buf, &buflen);
         if (!n) {
             XSRETURN_UNDEF;
@@ -65,8 +85,11 @@ const char * _get_record_count(struct blerg *ptr)
         n = snprintf(buf, 21, "%llu", count);
         XPUSHs(sv_2mortal(newSVpv(buf, n)));
 
-time_t _get_timestamp(struct blerg *ptr, int record)
+time_t _get_timestamp(struct blerg *ptr, const char *str_record)
+    INIT:
+        uint64_t record;
     CODE:
+        record = strtoull(str_record, NULL, 0);
         RETVAL = blerg_get_timestamp(ptr, record);
     OUTPUT:
         RETVAL
@@ -99,13 +122,12 @@ int _get_mute(struct blerg *ptr)
     OUTPUT:
         RETVAL
 
-void _tag_list(const char *tag, const char *str_offset, int direction)
+void tag_list(const char *tag, const char *str_offset, int direction)
     INIT:
         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 +137,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)