Finish tagging implementation for hash tags
[blerg.git] / database.c
index ce03171..2da6530 100644 (file)
@@ -123,6 +123,8 @@ struct blerg *blerg_open(const char *name) {
                perror("Cannot allocate memory for blerg");
                goto open_failed_blerg_malloc;
        }
+       blerg->name = malloc(namelen + 1);
+       memcpy(blerg->name, name, namelen + 1);
        blerg->meta_fd = blerg->index_fd = blerg->data_fd = -1;
        blerg->meta = NULL;
        blerg->index = NULL;
@@ -168,6 +170,7 @@ open_failed_segment_switch:
 open_failed_meta_mmap:
        close(blerg->meta_fd);
 open_failed_meta_open:
+       free(blerg->name);
        free(blerg);
 open_failed_blerg_malloc:
        return NULL;
@@ -178,6 +181,7 @@ int blerg_close(struct blerg *blerg) {
        munmap((void *)blerg->meta, sizeof(struct meta));
        close(blerg->meta_fd);
        free(blerg->base_path);
+       free(blerg->name);
        free(blerg);
        return 1;
 }
@@ -191,15 +195,15 @@ int blerg_store(struct blerg *blerg, const char *data, int len) {
        flock(blerg->index_fd, LOCK_EX);
        flock(blerg->data_fd, LOCK_EX);
 
-       uint64_t rec = blerg_increment_record_count(blerg);
-       if (rec == -1) {
+       uint64_t record = blerg_increment_record_count(blerg);
+       if (record == -1) {
                printf("Could not find free record\n");
                return -1;
        }
-       int segment = rec / RECORDS_PER_SEGMENT;
+       int segment = record / RECORDS_PER_SEGMENT;
        if (segment != blerg->current_segment)
                blerg_segment_switch(blerg, segment);
-       rec = rec % RECORDS_PER_SEGMENT;
+       int seg_rec = record % RECORDS_PER_SEGMENT;
 
        // Get the position for the new data
        FILE *datafile = fdopen(dup(blerg->data_fd), "a");
@@ -218,34 +222,36 @@ int blerg_store(struct blerg *blerg, const char *data, int len) {
                }
                bytes += n;
        } while (bytes < len);
-       blerg->index[rec].flags = 0x0001;
-       blerg->index[rec].offset = curpos;
-       blerg->index[rec].length = len;
+       blerg->index[seg_rec].flags = 0x0001;
+       blerg->index[seg_rec].offset = curpos;
+       blerg->index[seg_rec].length = len;
+
+       tag_scan(blerg->name, data, len, record);
 
        flock(blerg->data_fd, LOCK_UN);
        flock(blerg->index_fd, LOCK_UN);
 
-       return segment * RECORDS_PER_SEGMENT + rec;
+       return record;
 }
 
-int blerg_fetch(struct blerg *blerg, int rec, char **data, int *length) {
-       if (rec < 0) {
+int blerg_fetch(struct blerg *blerg, int record, char **data, int *length) {
+       if (record < 0) {
                printf("Invalid record\n");
                return 0;
        }
 
-       int segment = rec / RECORDS_PER_SEGMENT;
+       int segment = record / RECORDS_PER_SEGMENT;
        if (segment != blerg->current_segment)
                blerg_segment_switch(blerg, segment);
-       rec = rec % RECORDS_PER_SEGMENT;
+       int seg_rec = record % RECORDS_PER_SEGMENT;
 
-       if ((blerg->index[rec].flags & 0x1) == 0) {
+       if ((blerg->index[seg_rec].flags & 0x1) == 0) {
                printf("Invalid record\n");
                return 0;
        }
 
-       int rec_offset = blerg->index[rec].offset;
-       int rec_length = blerg->index[rec].length;
+       int rec_offset = blerg->index[seg_rec].offset;
+       int rec_length = blerg->index[seg_rec].length;
        if (rec_offset >= blerg->data_size) {
                // We're accessing an out-of-bounds record in our mmap.
                // Recheck size and remap.