diff options
Diffstat (limited to 'main.go')
| -rw-r--r-- | main.go | 68 |
1 files changed, 51 insertions, 17 deletions
@@ -20,10 +20,14 @@ import ( _ "github.com/mattn/go-sqlite3" ) +var debug bool + func main() { lAddr := flag.String("l", "127.0.0.1:3000", "Address HTTP-server will listen to") wrksNum := flag.Int("n", runtime.NumCPU(), "Number of HTTP-workers to start") + dbg := flag.Bool("D", false, "Debug mode") flag.Parse() + debug = *dbg if flag.NArg() == 0 { printUsage() @@ -31,7 +35,20 @@ func main() { luaArgv := flag.Args() mustExist(luaArgv[0]) + dbMux := sync.Mutex{} httpClient := &http.Client{} + dbPool := []*sql.DB{} + dbCur := 0 + dbGet := func() *sql.DB { + dbMux.Lock() + defer dbMux.Unlock() + dbCur = (dbCur + 1) % 300 + return dbPool[dbCur] + } + for i := 0; i < 300; i++ { + db, _ := sql.Open("sqlite3", "file:var/db.sqlite?_journal=WAL&_sync=NORMAL") + dbPool = append(dbPool, db) + } // queue for http messages for workers to handle msgs := make(chan *HTTPRequest, 4096) @@ -243,7 +260,7 @@ func main() { if err != nil { return luaErr(l, err) } - db := handle.Value().(*sql.DB) + db := dbGet() _, err = db.Exec(query, params...) if err != nil { return luaErr(l, err) @@ -259,7 +276,7 @@ func main() { return luaErr(l, err) } ares := []any{} - db := handle.Value().(*sql.DB) + db := dbGet() rows, err := db.Query(query, params...) if err != nil { return luaErr(l, err) @@ -295,7 +312,7 @@ func main() { if err != nil { return luaErr(l, err) } - db := handle.Value().(*sql.DB) + db := dbGet() rows, err := db.Query(query, params...) if err != nil { return luaErr(l, err) @@ -382,6 +399,21 @@ func main() { module["http"] = httpModule module["db"] = dbModule module["utf8"] = utf8Module + module["repl"] = func (l *Lua) int { + var repl LuaRef + err := l.Scan(&repl) + if err != nil { + return luaErr(l, err) + } + for _, wrk := range wrks { + if wrk.HasSameLua(l) { + wrk.repl = &repl + break + } + } + return luaOk(l, nil) + } + module["debug"] = debug wg := sync.WaitGroup{} wg.Add(*wrksNum) @@ -403,22 +435,24 @@ func main() { } wg.Wait() - // listen for evals from stdio - go func () { - reader := bufio.NewReader(os.Stdin) - for { - code, _ := reader.ReadString('\n') - if len(code) == 0 { - continue - } - for _, wrk := range wrks { - if err := wrk.Eval(code); err != nil { - log.Printf("error: %s\n", err) - break + // listen for commands from stdio + if debug { + go func () { + reader := bufio.NewReader(os.Stdin) + for { + code, _ := reader.ReadString('\n') + if len(code) == 0 { + continue + } + for _, wrk := range wrks { + if err := wrk.Eval(code); err != nil { + log.Printf("error: %s\n", err) + break + } } } - } - }() + }() + } if len(routes) > 0 { log.Printf("luna is running at %s...", *lAddr) |
