#include "database.h"
#include "config.h"
-#define RECORDS_PER_SEGMENT 65536
-
uint64_t blerg_get_record_count(struct blerg *blerg) {
uint64_t count;
flock(blerg->meta_fd, LOCK_SH);
if (blerg->data_fd != -1)
close(blerg->data_fd);
if (blerg->index != NULL)
- munmap((void *)blerg->index, sizeof(RECORDS_PER_SEGMENT * sizeof(struct record)));
+ munmap((void *)blerg->index, RECORDS_PER_SEGMENT * sizeof(struct record));
if (blerg->index_fd != -1)
close(blerg->index_fd);
}
open_failed_data_mmap:
close(blerg->data_fd);
open_failed_data_open:
- munmap((void *)blerg->index, sizeof(65536 * sizeof(struct record)));
+ munmap((void *)blerg->index, sizeof(RECORDS_PER_SEGMENT * sizeof(struct record)));
open_failed_index_mmap:
close(blerg->index_fd);
open_failed_index_open:
return 0;
}
+int blerg_exists(const char *name) {
+ int namelen = strlen(name);
+ char filename[512];
+
+ if (namelen > 32) {
+ perror("Name too long");
+ return 0;
+ }
+
+ snprintf(filename, 512, "%s/%s", DATA_PATH, name);
+ if (access(filename, F_OK) == -1)
+ return 0;
+ else
+ return 1;
+}
+
struct blerg *blerg_open(const char *name) {
int namelen = strlen(name);
char filename[512];
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;
open_failed_meta_mmap:
close(blerg->meta_fd);
open_failed_meta_open:
+ free(blerg->name);
free(blerg);
open_failed_blerg_malloc:
return NULL;
munmap((void *)blerg->meta, sizeof(struct meta));
close(blerg->meta_fd);
free(blerg->base_path);
+ free(blerg->name);
free(blerg);
return 1;
}
int blerg_store(struct blerg *blerg, const char *data, int len) {
- if (len > 65536) {
+ if (len > MAX_RECORD_SIZE) {
printf("len > 64K\n");
return -1;
}
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");
}
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.