summaryrefslogtreecommitdiffstats
path: root/lem/postgres/queued.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lem/postgres/queued.lua')
-rw-r--r--[l---------]lem/postgres/queued.lua94
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: