diff options
Diffstat (limited to 'lem/postgres/queued.lua')
-rw-r--r--[l---------] | lem/postgres/queued.lua | 94 |
1 files changed, 93 insertions, 1 deletions
diff --git a/lem/postgres/queued.lua b/lem/postgres/queued.lua index 94dfe13..2f597f4 120000..100644 --- a/lem/postgres/queued.lua +++ b/lem/postgres/queued.lua @@ -1 +1,93 @@ -../../queued.lua
\ No newline at end of file +-- +-- This file is part of lem-postgres. +-- Copyright 2011 Emil Renner Berthing +-- +-- 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 <http://www.gnu.org/licenses/>. +-- + +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 QConnection = {} +QConnection.__index = QConnection + +function QConnection:close() + local ok, err = self.conn:close() + for i = 1, self.n - 1 do + resume(self[i]) + self[i] = nil + end + return ok, err +end +QConnection.__gc = QConnection.close + +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 + +local Connection = postgres.Connection +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: |