X-Git-Url: http://git.bytex64.net/?a=blobdiff_plain;f=database%2Fdatabase.c;h=52ebe8c7eeabca1c29be40d8b84b55bb29d2dace;hb=1b5012f54151382cddfe5ead3475f993ea947273;hp=c0ec591553b8ff0170ce0e6d4d71c59d82da345a;hpb=5b9a1c597b87485253a11339067b60d08534f8b0;p=blerg.git diff --git a/database/database.c b/database/database.c index c0ec591..52ebe8c 100644 --- a/database/database.c +++ b/database/database.c @@ -17,6 +17,12 @@ #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; +}