#include <stdlib.h>
#include <string.h>
#include <stdio.h>
+#include <time.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
return count;
}
-// Returns last usable record
+/* Returns last usable record */
uint64_t blerg_increment_record_count(struct blerg *blerg) {
uint64_t count;
flock(blerg->meta_fd, LOCK_EX);
blerg_segment_close(blerg);
- // Load and map the index
+ /* Load and map the index */
snprintf(filename, 512, "%s/index%d", blerg->base_path, new_segment);
blerg->index_fd = open(filename, O_RDWR | O_CREAT, 0600);
if (blerg->index_fd == -1) {
goto open_failed_index_mmap;
}
- // Load data file
+ /* Load data file */
sprintf(filename, "%s/data%d", blerg->base_path, new_segment);
blerg->data_fd = open(filename, O_RDWR | O_APPEND | O_CREAT, 0600);
fstat(blerg->data_fd, &st);
blerg->index = NULL;
blerg->data = NULL;
- // Make the directory if it doesn't exist
+ /* Make the directory if it doesn't exist */
blerg->base_path = malloc(512);
snprintf(blerg->base_path, 512, "%s/%s", DATA_PATH, name);
if (access(blerg->base_path, F_OK) == -1)
mkdir(blerg->base_path, 0755);
- // Open and map metadata
+ /* Open and map metadata */
snprintf(filename, 512, "%s/meta", blerg->base_path);
blerg->meta_fd = open(filename, O_RDWR | O_CREAT, 0600);
if (blerg->meta_fd == -1) {
goto open_failed_meta_mmap;
}
- // Open and map index and data for the current segment
+ /* Open and map index and data for the current segment */
blerg->current_segment = blerg_get_record_count(blerg) / RECORDS_PER_SEGMENT;
if (!blerg_segment_switch(blerg, blerg->current_segment)) {
fprintf(stderr, "Could not switch segment\n");
blerg_segment_switch(blerg, segment);
int seg_rec = record % RECORDS_PER_SEGMENT;
- // Get the position for the new data
+ /* Get the position for the new data */
FILE *datafile = fdopen(dup(blerg->data_fd), "a");
fseek(datafile, 0, SEEK_END);
int curpos = ftell(datafile);
int n = write(blerg->data_fd, data + bytes, len);
if (n == -1) {
perror("Could not write data");
- // Truncate anything we may have written
+ /* Truncate anything we may have written */
ftruncate(blerg->data_fd, curpos);
return -1;
}
blerg->index[seg_rec].flags = 0x0001;
blerg->index[seg_rec].offset = curpos;
blerg->index[seg_rec].length = len;
+ blerg->index[seg_rec].timestamp = time(NULL);
tag_scan(blerg->name, data, len, record);
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.
+ /* We're accessing an out-of-bounds record in our mmap.
+ Recheck size and remap. */
struct stat st;
fstat(blerg->data_fd, &st);
blerg->data_size = st.st_size;
return 1;
}
+
+time_t blerg_get_timestamp(struct blerg *blerg, int record) {
+ if (record < 0) {
+ printf("Invalid record\n");
+ return 0;
+ }
+
+ int segment = record / RECORDS_PER_SEGMENT;
+ if (segment != blerg->current_segment)
+ blerg_segment_switch(blerg, segment);
+ int seg_rec = record % RECORDS_PER_SEGMENT;
+
+ if ((blerg->index[seg_rec].flags & 0x1) == 0) {
+ printf("Invalid record\n");
+ return 0;
+ }
+
+ return blerg->index[seg_rec].timestamp;
+}