Finish tagging implementation for hash tags
authorChip Black <bytex64@bytex64.net>
Sat, 18 Dec 2010 20:33:49 +0000 (14:33 -0600)
committerChip Black <bytex64@bytex64.net>
Sat, 18 Dec 2010 20:33:49 +0000 (14:33 -0600)
Makefile
database.c
database.h
tags.c

index 0b99b0d..c0050db 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,16 +1,25 @@
 CFLAGS = -g
 LIBS =
 
-targets = blergtool
-blergtool_objects = blergtool.o database.o
+targets = blerg.a blergtool tag_test
+blerg_a_objects = database.o tags.o
+blergtool_objects = blergtool.o blerg.a
+
+tag_test_objects = tag_test.o tags.o
 
 all: $(targets)
 
 clean:
-       rm -f $(targets) $(blergtool_objects)
+       rm -f $(targets) $(blerg_a_objects) $(blergtool_objects)
+
+blerg.a: $(blerg_a_objects)
+       ar rcu $@ $(blerg_a_objects)
 
 blergtool: $(blergtool_objects)
        gcc $^ -o $@
 
+tag_test: $(tag_test_objects)
+       gcc $^ -o $@
+
 %.o: %.c
        gcc $(CFLAGS) $(LIBS) -c $< -o $@
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.
index 69043e6..7c90308 100644 (file)
@@ -17,6 +17,7 @@ struct blerg {
        int meta_fd;
        int index_fd;
        int data_fd;
+       char *name;
        char *base_path;
        struct meta *meta;
        struct record *index;
diff --git a/tags.c b/tags.c
index d5cc48a..96e7378 100644 (file)
--- a/tags.c
+++ b/tags.c
@@ -23,8 +23,8 @@ int tag_scan(const char *author, const char *data, int len, uint64_t record) {
 tag_scan_start:
                if (data[i] == '#') {
                        if (n_tags == MAX_TAGS) {
-                               fprintf(stderr, "Too many tags in message");
-                               continue;
+                               fprintf(stderr, "Too many tags in message\n");
+                               break;
                        }
                        int start = ++i;
                        while (i < len && TAG_CHAR(data[i]) && (i - start < MAX_TAG_LENGTH)) {