summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go90
1 files changed, 48 insertions, 42 deletions
diff --git a/main.go b/main.go
index 93e7dad..3a031e2 100644
--- a/main.go
+++ b/main.go
@@ -34,14 +34,14 @@ func main() {
httpClient := &http.Client{}
// queue for http messages for workers to handle
- msgs := make(chan any, 4096)
+ msgs := make(chan *HTTPRequest, 4096)
mux := http.NewServeMux()
wrks := []*Worker{}
// track routes for mux to avoid registering the same route twice
routes := make(map[string]bool)
// track open dbs to close them on exit
dbs := []*sql.DB{}
- dbmu := sync.Mutex{}
+ mu := sync.Mutex{}
defer func() {
for _, db := range dbs {
if db == nil {
@@ -77,6 +77,7 @@ func main() {
if ok {
return luaOk(l, nil)
}
+ mu.Lock()
routes[route] = true
mux.HandleFunc(
route,
@@ -98,6 +99,7 @@ func main() {
)
},
)
+ mu.Unlock()
return luaOk(l, nil)
}
routeModule["static"] = func (l *Lua) int {
@@ -170,9 +172,9 @@ func main() {
if err != nil {
return luaErr(l, err)
}
- dbmu.Lock()
+ mu.Lock()
dbs = append(dbs, db)
- dbmu.Unlock()
+ mu.Unlock()
h := cgo.NewHandle(db)
return luaOk(l, int(h))
}
@@ -256,33 +258,33 @@ func main() {
if err != nil {
return luaErr(l, err)
}
+ ares := []any{}
db := handle.Value().(*sql.DB)
rows, err := db.Query(query, params...)
if err != nil {
return luaErr(l, err)
}
- var res [][]any
- cols, _ := rows.Columns()
- for rows.Next() {
- scans := make([]any, len(cols))
- for i, _ := range scans {
- scans[i] = &scans[i]
+ go func() {
+ var res [][]any
+ cols, _ := rows.Columns()
+ for rows.Next() {
+ scans := make([]any, len(cols))
+ for i, _ := range scans {
+ scans[i] = &scans[i]
+ }
+ var row []any
+ rows.Scan(scans...)
+ for _, v := range scans {
+ row = append(row, v)
+ }
+ res = append(res, row)
}
- var row []any
- rows.Scan(scans...)
- for _, v := range scans {
- row = append(row, v)
+ for _, v := range res {
+ ares = append(ares, v)
}
- res = append(res, row)
- }
- ares := []any{}
- for _, v := range res {
- ares = append(ares, v)
- }
- err = l.PushArray(ares)
- if err != nil {
- return luaErr(l, err)
- }
+ l.resume()
+ }()
+ l.yield()
return luaOk(l, ares)
}
dbModule["query*"] = func (l *Lua) int {
@@ -298,24 +300,28 @@ func main() {
if err != nil {
return luaErr(l, err)
}
- var res []map[string]any
- cols, _ := rows.Columns()
- for rows.Next() {
- scans := make([]any, len(cols))
- for i, _ := range scans {
- scans[i] = &scans[i]
+ ares := []any{}
+ go func() {
+ cols, _ := rows.Columns()
+ var res []map[string]any
+ for rows.Next() {
+ scans := make([]any, len(cols))
+ for i, _ := range scans {
+ scans[i] = &scans[i]
+ }
+ row := make(map[string]any)
+ rows.Scan(scans...)
+ for i, v := range scans {
+ row[cols[i]] = v
+ }
+ res = append(res, row)
}
- row := make(map[string]any)
- rows.Scan(scans...)
- for i, v := range scans {
- row[cols[i]] = v
+ for _, v := range res {
+ ares = append(ares, v)
}
- res = append(res, row)
- }
- ares := []any{}
- for _, v := range res {
- ares = append(ares, v)
- }
+ l.resume()
+ }()
+ l.yield()
return luaOk(l, ares)
}
dbModule["close"] = func (l *Lua) int {
@@ -329,14 +335,14 @@ func main() {
if err != nil {
return luaErr(l, err)
}
- dbmu.Lock()
+ mu.Lock()
for k, _db := range dbs {
if db == _db {
dbs[k] = nil
break
}
}
- dbmu.Unlock()
+ mu.Unlock()
handle.Delete()
return luaOk(l, nil)
}