X-Git-Url: http://git.bytex64.net/?a=blobdiff_plain;f=lib%2Fperl%2FBlerg-Database%2FDatabase.xs;h=04406c8f5e41a27f689fc8adc2266c62b30f5f37;hb=260aec1f9de8f1c904d50d359dfb8964d58d37f2;hp=0d8086ff88b4a08c09d0e553f0a6f085e4d323e9;hpb=3d76b7537d7b50ca8ccf83d4ed8e2dc93a871ddb;p=blerg.git diff --git a/lib/perl/Blerg-Database/Database.xs b/lib/perl/Blerg-Database/Database.xs index 0d8086f..04406c8 100644 --- a/lib/perl/Blerg-Database/Database.xs +++ b/lib/perl/Blerg-Database/Database.xs @@ -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 @@ -87,13 +110,24 @@ const char * _get_subscription_mark(struct blerg *ptr) n = snprintf(buf, 21, "%llu", mark); XPUSHs(sv_2mortal(newSVpv(buf, n))); -void _tag_list(const char *tag, const char *str_offset, int direction) +int _set_mute(struct blerg *ptr, int v) + CODE: + RETVAL = blerg_set_mute(ptr, v); + OUTPUT: + RETVAL + +int _get_mute(struct blerg *ptr) + CODE: + RETVAL = blerg_get_mute(ptr); + OUTPUT: + RETVAL + +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); @@ -103,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)