-- -- This file is part of lem-postgres. -- Copyright 2011 Emil Renner Berthing -- Copyright 2020 Asbjørn Sloth Tønnesen -- -- lem-postgres is free software: you can redistribute it and/or -- modify it under the terms of the GNU General Public License as -- published by the Free Software Foundation, either version 3 of -- the License, or (at your option) any later version. -- -- lem-postgres is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with lem-postgres. If not, see . -- local utils = require 'lem.utils' local postgres = require 'lem.postgres' local remove = table.remove local thisthread, suspend, resume = utils.thisthread, utils.suspend, utils.resume local Connection = postgres.Connection local QConnection = {} QConnection.__index = QConnection function QConnection:set_notifier(cb) Connection.set_notifier(self.conn, cb) end local function cancel_all(t) for i = 1, t.n - 1 do resume(t[i]) t[i] = nil end end function QConnection:close() local ok, err = self.conn:close() cancel_all(self) return ok, err end function QConnection:__gc() cancel_all(self) self.conn = nil end local function lock(self) local n = self.n if n == 0 then self.n = 1 else self[n] = thisthread() self.n = n + 1 suspend() end return self.conn end QConnection.lock = lock local function unlock(self, ...) local n = self.n - 1 self.n = n if n > 0 then resume(remove(self, 1)) end return ... end QConnection.unlock = unlock local function wrap(method) return function(self, ...) return unlock(self, method(lock(self), ...)) end end QConnection.exec = wrap(Connection.exec) QConnection.prepare = wrap(Connection.prepare) QConnection.run = wrap(Connection.run) local qconnect do local setmetatable = setmetatable local connect = postgres.connect function qconnect(...) local conn, err = connect(...) if not conn then return nil, err end return setmetatable({ n = 0, conn = conn, }, QConnection) end end return { QConnection = QConnection, connect = qconnect, } -- vim: ts=2 sw=2 noet: