commit eb16862dc8ee4b436131b65742b0b05da03c625a
parent ec428f298d000983e9d00850c6ce4d59a65aef5a
Author: Natasha Kerensikova <natgh@instinctive.eu>
Date: Tue, 24 Jun 2025 17:58:48 +0000
Received header are logged
Diffstat:
M | init.sql | | | 52 | +++++++++++++++++++++++++++++++++++++++++++++++++++- |
M | main.go | | | 22 | +++++++++++++++++++++- |
2 files changed, 72 insertions(+), 2 deletions(-)
diff --git a/init.sql b/init.sql
@@ -4,7 +4,8 @@ CREATE TABLE subjects
CREATE UNIQUE INDEX i_subjects ON subjects(name);
CREATE TABLE received
- (timestamp REAL NOT NULL,
+ (id INTEGER PRIMARY KEY AUTOINCREMENT,
+ timestamp REAL NOT NULL,
subject_id INTEGER NOT NULL,
data TEXT NOT NULL,
reply_subject_id INTEGER,
@@ -65,4 +66,53 @@ BEGIN
NEW.data);
END;
+CREATE TABLE header_keys
+ (id INTEGER PRIMARY KEY AUTOINCREMENT,
+ name TEXT NOT NULL);
+CREATE UNIQUE INDEX i_header_keys ON header_keys(name);
+
+CREATE TABLE headers
+ (id INTEGER PRIMARY KEY AUTOINCREMENT,
+ key_id INTEGER NOT NULL,
+ value TEXT NOT NULL,
+ FOREIGN KEY (key_id) REFERENCES header_keys (id));
+CREATE UNIQUE INDEX i_headers ON headers(key_id, value);
+
+CREATE VIEW headers_view (id,key,value)
+ AS SELECT headers.id,header_keys.name,value
+ FROM headers LEFT OUTER JOIN header_keys ON header_keys.id = key_id;
+
+CREATE TRIGGER insert_header INSTEAD OF INSERT ON headers_view
+BEGIN
+ INSERT INTO header_keys(name)
+ SELECT NEW.key WHERE NOT EXISTS
+ (SELECT 1 FROM header_keys WHERE name = NEW.key);
+ INSERT INTO headers(id,key_id,value)
+ VALUES (NEW.id,
+ (SELECT id FROM header_keys WHERE name = NEW.key),
+ NEW.value);
+END;
+
+CREATE TABLE received_headers
+ (msg_id INTEGER NOT NULL,
+ header_id INTEGER NOT NULL,
+ FOREIGN KEY (msg_id) REFERENCES received (id),
+ FOREIGN KEY (header_id) REFERENCES headers (id));
+
+CREATE VIEW received_headers_view (msg_id,key,value)
+ AS SELECT msg_id,header_keys.name,headers.value
+ FROM received_headers
+ LEFT OUTER JOIN headers ON headers.id = header_id
+ LEFT OUTER JOIN header_keys ON header_keys.id = headers.key_id;
+
+CREATE TRIGGER insert_received_header INSTEAD OF INSERT ON received_headers_view
+BEGIN
+ INSERT INTO headers_view(key,value)
+ SELECT NEW.key,NEW.value WHERE NOT EXISTS
+ (SELECT 1 FROM headers_view WHERE key = NEW.key AND value = NEW.value);
+ INSERT INTO received_headers(msg_id,header_id)
+ VALUES (NEW.msg_id,
+ (SELECT id FROM headers_view WHERE key = NEW.key AND value = NEW.value));
+END;
+
PRAGMA user_version = 1;
diff --git a/main.go b/main.go
@@ -109,6 +109,7 @@ type NatsIM struct {
db *sql.DB
ensureSubject *sql.Stmt
insertReceived *sql.Stmt
+ insertRHeader *sql.Stmt
insertSent *sql.Stmt
cmdQueue chan command
ircQueue chan string
@@ -210,6 +211,13 @@ func (natsim *NatsIM) Close() {
natsim.insertReceived = nil
}
+ if natsim.insertRHeader != nil {
+ if err := natsim.insertRHeader.Close(); err != nil {
+ log.Println("Close insertRHeader:", err)
+ }
+ natsim.insertRHeader = nil
+ }
+
if natsim.insertSent != nil {
if err := natsim.insertSent.Close(); err != nil {
log.Println("Close insertSent:", err)
@@ -500,6 +508,12 @@ func (natsim *NatsIM) logInit() error {
return err
}
+ natsim.insertRHeader, err = natsim.db.Prepare("INSERT INTO received_headers_view(msg_id,key,value) VALUES (?,?,?);")
+ if err != nil {
+ log.Println("Prepare insertRHeader:", err)
+ return err
+ }
+
natsim.insertSent, err = natsim.db.Prepare("INSERT INTO sent_view(timestamp,subject,data) VALUES (?,?,?);")
if err != nil {
log.Println("Prepare insertSent:", err)
@@ -536,7 +550,13 @@ func (natsim *NatsIM) logReceived(msg *nats.Msg) {
} else if id <= 0 {
natsim.ircSendf("LastInsertId returned invalid id %d", id)
} else {
- log.Println("Inserted received id:", id)
+ for key, values := range msg.Header {
+ for _, value := range values {
+ if _, err := natsim.insertRHeader.Exec(id, key, value); err != nil {
+ natsim.ircSendf("insertRHeader(%q, %q): %s", key, value, err)
+ }
+ }
+ }
}
}