X-Git-Url: http://git.bytex64.net/?a=blobdiff_plain;f=database.c;h=2da6530678a1d96ae1c23c7afd146704d59b9a6a;hb=82f9ef6f267b3fcbd0052ef809dbe6df5de5a925;hp=ce031718f72bdf2f42dd9ff22c2e675868c1016a;hpb=dec3a4b3263428134fee45f65b569f76ca5b8060;p=blerg.git diff --git a/database.c b/database.c index ce03171..2da6530 100644 --- a/database.c +++ b/database.c @@ -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.