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:
parent
530011be61
commit
adff364ee3
2 changed files with 36 additions and 10 deletions
|
@ -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
|
||||
})
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue