commit 3c4f73c7eb6fded3c09839d7609bc0f9b55797a9
parent 0a8bcf3ccfdef779af12c60577021f202fc22809
Author: Natasha Kerensikova <natgh@instinctive.eu>
Date: Thu, 17 Apr 2025 18:53:53 +0000
`sqlogger` Lua object type
Diffstat:
1 file changed, 50 insertions(+), 0 deletions(-)
diff --git a/cmd/mqttagent-full/main.go b/cmd/mqttagent-full/main.go
@@ -20,6 +20,7 @@ import (
"database/sql"
"log"
"os"
+ "time"
_ "github.com/glebarez/go-sqlite"
luajson "github.com/layeh/gopher-json"
@@ -34,6 +35,11 @@ type fullMqttAgent struct {
func (agent *fullMqttAgent) Setup(L *lua.LState) {
luajson.Preload(L)
+ mt := L.NewTypeMetatable("sqlogger")
+ L.SetGlobal("sqlogger", mt)
+ L.SetField(mt, "new", L.NewFunction(luaSqloggerNew))
+ L.SetField(mt, "__index", L.SetFuncs(L.NewTable(), luaSqloggerMethods))
+
L.SetGlobal("sqlog", L.NewFunction(func(L *lua.LState) int {
arg := L.CheckString(1)
if logger, err := connect(arg); err != nil {
@@ -145,6 +151,50 @@ VALUES (?, (SELECT id FROM topics WHERE name = ?), ?);
return &sqlogger{db: db, insertTopic: s1, insertReceived: s2}, nil
}
+func checkSqlogger(L *lua.LState, index int) *sqlogger {
+ ud := L.CheckUserData(index)
+ if v, ok := ud.Value.(*sqlogger); ok {
+ return v
+ }
+ L.ArgError(index, "sqlogger expected")
+ return nil
+}
+
+func luaSqloggerNew(L *lua.LState) int {
+ arg := L.CheckString(1)
+ if logger, err := connect(arg); err != nil {
+ log.Println(err)
+ L.Push(lua.LNil)
+ L.Push(lua.LString(err.Error()))
+ return 2
+ } else {
+ ud := L.NewUserData()
+ ud.Value = logger
+ L.SetMetatable(ud, L.GetTypeMetatable("sqlogger"))
+ L.Push(ud)
+ return 1
+ }
+}
+
+func luaSqloggerReceived(L *lua.LState) int {
+ logger := checkSqlogger(L, 1)
+ message := L.CheckString(2)
+ topic := L.CheckString(3)
+ timestamp := L.OptNumber(4, lua.LNumber(time.Now().UnixMicro())*1.0e-6)
+
+ logger.Received(&mqttagent.MqttMessage{
+ Timestamp: float64(timestamp),
+ ClientId: -1,
+ Message: []byte(message),
+ Topic: []byte(topic),
+ })
+ return 0
+}
+
+var luaSqloggerMethods = map[string]lua.LGFunction{
+ "received": luaSqloggerReceived,
+}
+
func main() {
var agent fullMqttAgent