Properly initialize data_size for empty data segment
[blerg.git] / database / database.c
index c0ec591..52ebe8c 100644 (file)
 #include "util.h"
 #include "config.h"
 
+#define CHECK_VALID_BLERG(r)                               \
+       if (blerg == NULL) {                               \
+               fprintf(stderr, "Invalid struct blerg\n"); \
+               return r;                                  \
+       }
+
 uint64_t blerg_get_record_count(struct blerg *blerg) {
        uint64_t count;
        flock(blerg->meta_fd, LOCK_SH);
@@ -51,16 +57,16 @@ int blerg_remap_data(struct blerg *blerg) {
        if (blerg->data != NULL)
                munmap(blerg->data, blerg->data_size);
        fstat(blerg->data_fd, &st);
-       if (st.st_size == 0) {
+       blerg->data_size = st.st_size;
+       if (blerg->data_size == 0) {
                /* Can't map an empty data file. */
                return 1;
        }
-       blerg->data = (char *) mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, blerg->data_fd, 0);
+       blerg->data = (char *) mmap(NULL, blerg->data_size, PROT_READ, MAP_SHARED, blerg->data_fd, 0);
        if (blerg->data == MAP_FAILED) {
                perror("Could not remap data");
                return 0;
        }
-       blerg->data_size = st.st_size;
        return 1;
 }
 
@@ -218,6 +224,7 @@ open_failed_blerg_malloc:
 }
 
 int blerg_close(struct blerg *blerg) {
+       CHECK_VALID_BLERG(0)
        blerg_segment_close(blerg);
        munmap((void *)blerg->meta, sizeof(struct meta));
        close(blerg->meta_fd);
@@ -231,8 +238,10 @@ int blerg_store(struct blerg *blerg, const char *data, int len) {
        struct stat st;
        int n;
 
-       if (len > MAX_RECORD_SIZE) {
-               fprintf(stderr, "len > 64K\n");
+       CHECK_VALID_BLERG(-1)
+
+       if (len > MAX_RECORD_SIZE || len <= 0) {
+               fprintf(stderr, "len out of bounds\n");
                return -1;
        }
 
@@ -274,20 +283,23 @@ int blerg_store(struct blerg *blerg, const char *data, int len) {
        flock(blerg->data_fd, LOCK_UN);
        flock(blerg->index_fd, LOCK_UN);
 
-       /* Now do those dirty microblogging deeds */
-       tag_scan(blerg->name, data, len, record);
-       subscription_notify(blerg->name, record);
+       if (!blerg_get_mute(blerg)) {
+               /* Now do those dirty microblogging deeds */
+               tag_scan(blerg->name, data, len, record);
+               subscription_notify(blerg->name, record);
+       }
 
        return record;
 }
 
 int blerg_fetch(struct blerg *blerg, int record, char **data, int *length) {
-       if (record < 0) {
+       CHECK_VALID_BLERG(0)
+       if (record < 0 || record >= blerg_get_record_count(blerg)) {
                fprintf(stderr, "Invalid record\n");
                return 0;
        }
-       if (record >= blerg_get_record_count(blerg)) {
-               fprintf(stderr, "Invalid record\n");
+       if (data == NULL || length == NULL) {
+               fprintf(stderr, "data or length is null\n");
                return 0;
        }
 
@@ -329,11 +341,8 @@ int blerg_fetch(struct blerg *blerg, int record, char **data, int *length) {
 }
 
 time_t blerg_get_timestamp(struct blerg *blerg, int record) {
-       if (record < 0) {
-               fprintf(stderr, "Invalid record\n");
-               return 0;
-       }
-       if (record >= blerg_get_record_count(blerg)) {
+       CHECK_VALID_BLERG(0)
+       if (record < 0 || record >= blerg_get_record_count(blerg)) {
                fprintf(stderr, "Invalid record\n");
                return 0;
        }
@@ -352,9 +361,27 @@ time_t blerg_get_timestamp(struct blerg *blerg, int record) {
 }
 
 int blerg_set_subscription_mark(struct blerg *blerg) {
+       CHECK_VALID_BLERG(0)
        blerg->meta->subscription_mark = subscription_count_items(blerg->name);
+       return 1;
 }
 
 uint64_t blerg_get_subscription_mark(struct blerg *blerg) {
+       CHECK_VALID_BLERG(0)
        return blerg->meta->subscription_mark;
 }
+
+int blerg_set_mute(struct blerg *blerg, int v) {
+       CHECK_VALID_BLERG(0)
+       if (v) {
+               blerg->meta->status |= BLERGMETA_MUTED;
+       } else {
+               blerg->meta->status &= ~BLERGMETA_MUTED;
+       }
+       return 1;
+}
+
+int blerg_get_mute(struct blerg *blerg) {
+       CHECK_VALID_BLERG(0)
+       return (blerg->meta->status & BLERGMETA_MUTED) > 0;
+}