1
0
Fork 0
mirror of https://github.com/Eggbertx/gochan.git synced 2025-08-25 09:36:24 -07:00

Make the db_scan_rows plugin function work

This commit is contained in:
Eggbertx 2023-04-27 08:57:13 -07:00
parent 530011be61
commit adff364ee3
2 changed files with 36 additions and 10 deletions

View file

@ -6,6 +6,7 @@ import (
"html/template"
"io"
"net/http"
"reflect"
"github.com/gochan-org/gochan/pkg/config"
"github.com/gochan-org/gochan/pkg/events"
@ -40,6 +41,20 @@ func ClosePlugins() {
}
}
type lvalueScanner struct {
val lua.LValue
state *lua.LState
}
func (lvs *lvalueScanner) Scan(src any) error {
typeof := reflect.TypeOf(src)
if typeof != nil && typeof.String() == "[]uint8" {
src = string(src.([]uint8))
}
lvs.val = luar.New(lvs.state, src)
return nil
}
func lvalueToInterface(l *lua.LState, v lua.LValue) interface{} {
lt := v.Type()
switch lt {
@ -50,7 +65,7 @@ func lvalueToInterface(l *lua.LState, v lua.LValue) interface{} {
case lua.LTNumber:
return lua.LVAsNumber(v)
case lua.LTString:
return v.String()
return lua.LVAsString(v)
case lua.LTUserData:
l.Push(v)
return l.CheckUserData(l.GetTop()).Value
@ -141,13 +156,24 @@ func registerLuaFunctions() {
lState.Register("db_scan_rows", func(l *lua.LState) int {
rows := l.CheckUserData(1).Value.(*sql.Rows)
table := l.CheckTable(2)
var val any
err := rows.Scan(&val)
var scanners []any
colNames, err := rows.Columns()
if err != nil {
l.Push(luar.New(l, err))
return 1
}
table.Append(luar.New(l, val))
for _ = range colNames {
scanners = append(scanners, &lvalueScanner{state: l})
}
if err = rows.Scan(scanners...); err != nil {
l.Push(luar.New(l, err))
return 1
}
for i, name := range colNames {
table.RawSetString(name, scanners[i].(*lvalueScanner).val)
}
l.Push(lua.LNil)
return 1
})

View file

@ -1,6 +1,6 @@
event_register({"db-initialized"}, function(tr)
print("Testing SELECT query from Lua plugin")
rows, err = db_query("SELECT message_raw FROM DBPREFIXposts where id = ?", {28})
rows, err = db_query("SELECT id, username FROM DBPREFIXstaff where id = ?", {1})
if(err ~= nil) then
print(err.Error(err))
return
@ -8,13 +8,13 @@ event_register({"db-initialized"}, function(tr)
print("rows.Next():")
while rows.Next(rows) do
message_raw = "This should be different after rows.Scan"
rows_table = {}
db_scan_rows(rows, rows_table)
print("Message: " .. message_raw)
for v in rows_table do
print(string.format("%q", v))
err = db_scan_rows(rows, rows_table)
if(err ~= nil) then
print(err.Error(err))
return
end
print(string.format("rows_table.id: %#v, rorws_table.username: %#v", rows_table.id, rows_table.username))
end
rows.Close(rows)
print("Done")