From 82f9ef6f267b3fcbd0052ef809dbe6df5de5a925 Mon Sep 17 00:00:00 2001 From: Chip Black Date: Sat, 18 Dec 2010 14:33:49 -0600 Subject: [PATCH] Finish tagging implementation for hash tags --- Makefile | 15 ++++++++++++--- database.c | 36 +++++++++++++++++++++--------------- database.h | 1 + tags.c | 4 ++-- 4 files changed, 36 insertions(+), 20 deletions(-) diff --git a/Makefile b/Makefile index 0b99b0d..c0050db 100644 --- 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 $@ 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. diff --git a/database.h b/database.h index 69043e6..7c90308 100644 --- a/database.h +++ b/database.h @@ -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 --- 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)) { -- 2.25.1