natsim

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

commit ec428f298d000983e9d00850c6ce4d59a65aef5a
parent 27076a4fa6b8a42e85386908136ae0058f6e0f6e
Author: Natasha Kerensikova <natgh@instinctive.eu>
Date:   Mon, 23 Jun 2025 18:00:37 +0000

Rowid of logged received messages is computed
Diffstat:
Mmain.go | 38++++++++++++++++++++++++++++++++++++--
1 file changed, 36 insertions(+), 2 deletions(-)

diff --git a/main.go b/main.go @@ -107,6 +107,7 @@ type NatsIM struct { irc *irc.Connection nc *nats.Conn db *sql.DB + ensureSubject *sql.Stmt insertReceived *sql.Stmt insertSent *sql.Stmt cmdQueue chan command @@ -195,6 +196,13 @@ func (natsim *NatsIM) Close() { natsim.nc = nil } + if natsim.ensureSubject != nil { + if err := natsim.ensureSubject.Close(); err != nil { + log.Println("Close ensureSubject:", err) + } + natsim.ensureSubject = nil + } + if natsim.insertReceived != nil { if err := natsim.insertReceived.Close(); err != nil { log.Println("Close insertReceived:", err) @@ -480,7 +488,13 @@ func (natsim *NatsIM) logInit() error { return errors.New("unsupported database version") } - natsim.insertReceived, err = natsim.db.Prepare("INSERT INTO received_view(timestamp,subject,reply_subject,data) VALUES (?,?,?,?);") + natsim.ensureSubject, err = natsim.db.Prepare("INSERT INTO subjects(name) SELECT ? WHERE NOT EXISTS (SELECT 1 FROM subjects WHERE name = ?);") + if err != nil { + log.Println("Prepare ensureSubject:", err) + return err + } + + natsim.insertReceived, err = natsim.db.Prepare("INSERT INTO received(timestamp,subject_id,reply_subject_id,data) VALUES (?, (SELECT id FROM subjects WHERE name = ?), (SELECT id FROM subjects WHERE name = ?), ?);") if err != nil { log.Println("Prepare insertReceived:", err) return err @@ -500,9 +514,29 @@ func (natsim *NatsIM) logReceived(msg *nats.Msg) { return } + if _, err := natsim.ensureSubject.Exec(msg.Subject, msg.Subject); err != nil { + natsim.ircSendError("ensureSubject.Exec", err) + return + } + + var reply sql.NullString + if msg.Reply != "" { + if _, err := natsim.ensureSubject.Exec(msg.Reply, msg.Reply); err != nil { + natsim.ircSendError("ensureReply.Exec", err) + return + } + reply = sql.NullString{String: msg.Reply, Valid: true} + } + t := float64(time.Now().UnixNano())/8.64e13 + 2440587.5 - if _, err := natsim.insertReceived.Exec(t, msg.Subject, msg.Reply, msg.Data); err != nil { + if r, err := natsim.insertReceived.Exec(t, msg.Subject, reply, msg.Data); err != nil { natsim.ircSendError("insertReceived.Exec", err) + } else if id, err := r.LastInsertId(); err != nil { + natsim.ircSendError("LastInsertId", err) + } else if id <= 0 { + natsim.ircSendf("LastInsertId returned invalid id %d", id) + } else { + log.Println("Inserted received id:", id) } }