summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon Bergli Heier <snakebite@jvnv.net>2010-11-16 23:42:23 +0100
committerJon Bergli Heier <snakebite@jvnv.net>2010-11-16 23:42:23 +0100
commit517600329eaaa144d3c26b02bab75cd30e49dac9 (patch)
tree7f9afbae97554297ac39ebfcaf9cca241f9871a7
parent6a9af570e7288df584504c7167ba4c1f76cafced (diff)
Store words.
-rw-r--r--parsing.c15
-rw-r--r--pg.h2
-rw-r--r--pg.pgc67
-rw-r--r--word.c1
-rw-r--r--word.h1
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;
};