natsim

NATS ↔ Instant Messaging Bridge
git clone https://git.instinctive.eu/natsim.git
Log | Files | Refs | README | LICENSE

commit eb16862dc8ee4b436131b65742b0b05da03c625a
parent ec428f298d000983e9d00850c6ce4d59a65aef5a
Author: Natasha Kerensikova <natgh@instinctive.eu>
Date:   Tue, 24 Jun 2025 17:58:48 +0000

Received header are logged
Diffstat:
Minit.sql | 52+++++++++++++++++++++++++++++++++++++++++++++++++++-
Mmain.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) + } + } + } } }