Generalize status setting (mute, etc.)
[blerg.git] / lib / perl / Blerg-Database / Database.xs
index df1c463..e3614db 100644 (file)
@@ -10,6 +10,7 @@
 #include "database/tags.h"
 #include "database/subscription.h"
 #include "database/util.h"
+#include "common/auth.h"
 
 #include "const-c.inc"
 
@@ -31,6 +32,12 @@ MODULE = Blerg::Database             PACKAGE = Blerg::Database
 INCLUDE: const-xs.inc
 PROTOTYPES: ENABLE
 
+int init()
+    CODE:
+        RETVAL = blerg_init();
+    OUTPUT:
+        RETVAL
+
 int exists(const char *name)
     CODE:
         RETVAL = blerg_exists(name);
@@ -49,19 +56,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;
@@ -79,8 +92,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
@@ -101,15 +117,15 @@ const char * _get_subscription_mark(struct blerg *ptr)
         n = snprintf(buf, 21, "%llu", mark);
         XPUSHs(sv_2mortal(newSVpv(buf, n)));
 
-int _set_mute(struct blerg *ptr, int v)
+int _set_status(struct blerg *ptr, int status, int v)
     CODE:
-        RETVAL = blerg_set_mute(ptr, v);
+        RETVAL = blerg_set_status(ptr, status, v);
     OUTPUT:
         RETVAL
 
-int _get_mute(struct blerg *ptr)
+int _get_status(struct blerg *ptr, int status)
     CODE:
-        RETVAL = blerg_get_mute(ptr);
+        RETVAL = blerg_get_status(ptr, status);
     OUTPUT:
         RETVAL
 
@@ -121,9 +137,10 @@ void tag_list(const char *tag, const char *str_offset, int direction)
         int count, i;
     PPCODE:
         offset = strtoull(str_offset, NULL, 0);
+        count = 50;
         list = tag_list(tag, offset, &count, direction);
         if (list == NULL) {
-            XSRETURN_UNDEF;
+            XSRETURN_EMPTY;
         }
 
         i = count - 1;
@@ -135,16 +152,8 @@ void tag_list(const char *tag, const char *str_offset, int direction)
         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:
@@ -154,9 +163,10 @@ void _subscription_list(const char *author, const char *str_offset, int directio
         int count, i;
     PPCODE:
         offset = strtoull(str_offset, NULL, 0);
+        count = 50;
         list = subscription_list(author, offset, &count, direction);
         if (list == NULL) {
-            XSRETURN_UNDEF;
+            XSRETURN_EMPTY;
         }
 
         i = count - 1;
@@ -170,3 +180,23 @@ void _subscription_list(const char *author, const char *str_offset, int directio
 int valid_tag_name(const char *name)
 
 int valid_name(const char *name)
+
+int auth_set_password(const char *username, const char *password)
+
+int auth_check_password(const char *username, const char *password)
+
+char * auth_login(const char *username, const char *password)
+    INIT:
+        char *token;
+    PPCODE:
+        token = auth_login(username, password);
+        if (token != NULL) {
+            XPUSHs(sv_2mortal(newSVpv(token, TOKEN_SIZE * 2)));
+        } else {
+            XSRETURN_UNDEF;
+        }
+        free(token);
+
+int auth_logout(const char *username, const char *token)
+
+int auth_check_token(const char *username, const char *given_token)