diff options
Diffstat (limited to 'main.go')
| -rw-r--r-- | main.go | 90 |
1 files changed, 48 insertions, 42 deletions
@@ -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) } |
