From 517600329eaaa144d3c26b02bab75cd30e49dac9 Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Tue, 16 Nov 2010 23:42:23 +0100 Subject: Store words. --- parsing.c | 15 ++++++++++++++ pg.h | 2 ++ pg.pgc | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++------- word.c | 1 + word.h | 1 + 5 files changed, 79 insertions(+), 7 deletions(-) diff --git a/parsing.c b/parsing.c index 6759104..4dc03cd 100644 --- a/parsing.c +++ b/parsing.c @@ -336,6 +336,19 @@ static void save_users(int channel_id) { } } +static void save_words(int channel_id) { + for(int i = 0; i < WORDS_MAX; i++) { + struct word_t *word = &words[i]; + if(!word->name) + continue; + + while(word) { + pg_word_set(channel_id, word); + word = word->next; + } + } +} + void process() { /* Parsing stuff goes here. */ for(int chan_i = 0; chan_i < channel_get_count(); chan_i++) { @@ -344,6 +357,7 @@ void process() { struct channel_t *channel = channel_get(chan_i); int channel_id = pg_channel_get(channel); pg_users_get(channel_id); + pg_word_get(channel_id); printf("Channel %s\n", channel->name); struct channel_file_t *file = channel->files; while(file) { @@ -371,6 +385,7 @@ void process() { } save_users(channel_id); + save_words(channel_id); user_free(); word_free(); diff --git a/pg.h b/pg.h index 568ab6d..71a3b7e 100644 --- a/pg.h +++ b/pg.h @@ -3,6 +3,7 @@ #include "channel.h" #include "user.h" +#include "word.h" int pg_connect(const char *string); void pg_disconnect(); @@ -14,5 +15,6 @@ long pg_channel_file_get(int channel_id, struct channel_file_t *file); void pg_channel_file_set(int channel_id, struct channel_file_t *file, long pos); void pg_user_set(int channel_id, struct user_t *user); void pg_users_get(int channel_id); +void pg_words_set(int channel); #endif diff --git a/pg.pgc b/pg.pgc index 2eb2a37..2ca3dfd 100644 --- a/pg.pgc +++ b/pg.pgc @@ -90,9 +90,11 @@ int pg_init() { EXEC SQL CREATE TABLE word ( id serial, + channel_id integer, name varchar, count integer, - PRIMARY KEY (id) + PRIMARY KEY (id), + FOREIGN KEY (channel_id) REFERENCES channel (id) ); EXEC SQL COMMIT; @@ -265,22 +267,21 @@ EXEC SQL WHENEVER SQLERROR SQLPRINT; void pg_users_get(int channel) { EXEC SQL BEGIN DECLARE SECTION; int channel_id = channel; - char *nick; + VARCHAR nick[0x100]; int id = 0, words, characters, kicks, kicked, monolog_lines, monologs, seen_first, seen_last; EXEC SQL END DECLARE SECTION; - EXEC SQL DECLARE usercursor CURSOR FOR SELECT id, words, characters, kicks, kicked, monolog_lines, monologs, seen_first, seen_last + EXEC SQL DECLARE usercursor CURSOR FOR SELECT id, nick, words, characters, kicks, kicked, monolog_lines, monologs, seen_first, seen_last FROM users WHERE channel_id = :channel_id; EXEC SQL OPEN usercursor; EXEC SQL FETCH NEXT FROM usercursor INTO :id, :nick, :words, :characters, :kicks, :kicked, :monolog_lines, :monologs, :seen_first, :seen_last; - if(id == 0) + if(iserror()) goto pg_users_get_close; do { - printf("fetched user %s\n", nick); - struct user_t *user = user_get(nick); + struct user_t *user = user_get(nick.arr); user->id = id; user->words = words; user->characters = characters; @@ -291,11 +292,63 @@ void pg_users_get(int channel) { user->seen_first = seen_first; user->seen_last = seen_last; EXEC SQL FETCH NEXT FROM usercursor INTO :id, :nick, :words, :characters, :kicks, :kicked, :monolog_lines, :monologs, :seen_first, :seen_last; - } while(id > 0); + } while(!iserror()); pg_users_get_close: EXEC SQL CLOSE usercursor; } +EXEC SQL WHENEVER SQLERROR CONTINUE; +void pg_word_set(int channel, struct word_t *word) { + EXEC SQL BEGIN DECLARE SECTION; + int channel_id = channel, + id = word->id, + count = word->count; + const char *name = word->name; + EXEC SQL END DECLARE SECTION; + + EXEC SQL UPDATE word SET count = :count WHERE channel_id = :channel_id AND id = :id; + + int do_insert = iserror() && testerror("02000"); + if(iserror() && !do_insert) { + printerror(); + sqlprint(); + } + + EXEC SQL COMMIT; + + if(do_insert) { + EXEC SQL INSERT INTO word (channel_id, name, count) VALUES (:channel_id, :name, :count); + if(iserror()) sqlprint(); + EXEC SQL COMMIT; + } +} + +void pg_word_get(int channel) { + EXEC SQL BEGIN DECLARE SECTION; + int channel_id = channel, id = 0, count; + VARCHAR name[0x400]; + EXEC SQL END DECLARE SECTION; + + EXEC SQL DECLARE wordcursor CURSOR FOR SELECT id, name, count FROM word WHERE channel_id = :channel_id; + + EXEC SQL OPEN wordcursor; + + EXEC SQL FETCH NEXT FROM wordcursor INTO :id, :name, :count; + if(iserror()) + goto pg_word_get_close; + + do { + struct word_t *word = word_get(name.arr); + word->id = id; + word->count = count; + EXEC SQL FETCH NEXT FROM wordcursor INTO :id, :name, :count; + } while(iserror()); + +pg_word_get_close: + + EXEC SQL CLOSE wordcursor; +} + /* vim: set syn=c: */ diff --git a/word.c b/word.c index 1e8d56a..8d296df 100644 --- a/word.c +++ b/word.c @@ -28,6 +28,7 @@ struct word_t *word_get(char *name) { if(!word->name) { word->hash = hash; word->name = strdup(name); + word->id = 0; word->count = 0; word->next = NULL; } diff --git a/word.h b/word.h index adceefa..8b84ca2 100644 --- a/word.h +++ b/word.h @@ -6,6 +6,7 @@ struct word_t { unsigned long hash; char *name; + int id; unsigned long long count; struct word_t *next; }; -- cgit v1.2.3