package.path = './?.lua;/usr/local/share/lua/5.3/?.lua;/usr/local/share/lua/5.3/?/init.lua;/usr/local/lib/lua/5.3/?.lua;/usr/local/lib/lua/5.3/?/init.lua;/usr/share/lua/5.3/?.lua;/usr/share/lua/5.3/?/init.lua' package.cpath = './?.so;/usr/local/lib/lua/5.3/?.so;/usr/lib/x86_64-linux-gnu/lua/5.3/?.so;/usr/lib/lua/5.3/?.so;/usr/local/lib/lua/5.3/loadall.so' if ravi then print('Running under Ravi') ravi.auto(true, 1) collectgarbage("generational") end local cqueues = require"cqueues" local socket = require"cqueues.socket" local pgmoon = require 'pgmoon' local fifo = require 'fifo' local pool = fifo.new() for i=1,100 do local conn = pgmoon.new({host = "127.0.0.1", port = "5432", database = "db", user = "user", password = "pass", ssl=true, ssl_required=true, socket_type = "cqueues"}) if conn:connect() then pool:push(conn) end end local loop = cqueues.new() local httpd = function(srv) local count = 0 for con in srv:clients() do loop:wrap(function() local _, ip, port = con:peername() --print("%s:%d: connected", ip, port) local ok, why = pcall(function() con:setmode("tl", "tf") local get, why = con:read"*l" if not get then warn("%s:%d: no request (%s)", ip, port, errno.strerror(why)) return end local hdr = {} for h in con:lines"*h" do local f, b = string.match(h, "^([^:%s]+)%s*:%s*(.*)$") hdr[f] = b end con:read"*l" -- discard header/body break -- read from db local db = pool:pop() local query = "select users.* from users where id = 0" local result = db:query(query) local res = "username is " .. result[1].username pool:push(db) con:write"HTTP/1.0 200 OK\n" con:write"Connection: close\n" con:write("Content-Type: ", 'text/plain', "\n\n") con:write(res) local ok, why = con:flush() con:shutdown() end) con:close() end) end end if ravi then ravi.compile(httpd) end local srv = socket.listen(bind or "127.0.0.1", tonumber(port or 9090)) loop:wrap(httpd, srv) while not loop:empty() do local ok, err = loop:step() if not ok then error("loop.step: " .. err) end end