Mercurial > prosody-modules
comparison mod_storage_lmdb/mod_storage_lmdb.lua @ 1983:f7fc5088b340
mod_storage_lmdb: Allow passing a transaction flag so we can run get operations in a read-only transaction
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 19 Dec 2015 00:34:55 +0100 |
| parents | bb0b2eae5563 |
| children | 2ed6f6eeeaba |
comparison
equal
deleted
inserted
replaced
| 1982:bb0b2eae5563 | 1983:f7fc5088b340 |
|---|---|
| 18 local path = require"util.paths"; | 18 local path = require"util.paths"; |
| 19 local serialization = require"util.serialization"; | 19 local serialization = require"util.serialization"; |
| 20 local serialize = serialization.serialize; | 20 local serialize = serialization.serialize; |
| 21 local deserialize = serialization.deserialize; | 21 local deserialize = serialization.deserialize; |
| 22 | 22 |
| 23 local function transaction(env, func, ...) | 23 local function transaction(env, flag, func, ...) |
| 24 local args, n_args = {...}, select("#", ...); | 24 local args, n_args = {...}, select("#", ...); |
| 25 local t = env:txn_begin(nil, 0); | 25 local t = env:txn_begin(nil, flag); |
| 26 local function f() return func(t, unpack(args, 1, n_args)); end | 26 local function f() return func(t, unpack(args, 1, n_args)); end |
| 27 local success, a, b, c = xpcall(f, traceback); | 27 local success, a, b, c = xpcall(f, traceback); |
| 28 if not success then | 28 if not success then |
| 29 io.stderr:write(a, "\n\n"); | 29 io.stderr:write(a, "\n\n"); |
| 30 t:abort(); | 30 t:abort(); |
| 64 value = nil; | 64 value = nil; |
| 65 end | 65 end |
| 66 if value ~= nil then | 66 if value ~= nil then |
| 67 value = serialize(value); | 67 value = serialize(value); |
| 68 end | 68 end |
| 69 return transaction(self.env, keyvalue_set, self.db, key, value); | 69 return transaction(self.env, 0, keyvalue_set, self.db, key, value); |
| 70 end | 70 end |
| 71 | 71 |
| 72 function keyval:get(key) | 72 function keyval:get(key) |
| 73 local ok, data = transaction(self.env, keyvalue_get, self.db, key); | 73 local ok, data = transaction(self.env, lmdb.MDB_RDONLY, keyvalue_get, self.db, key); |
| 74 if not ok then return ok, data; end | 74 if not ok then return ok, data; end |
| 75 return deserialize(data); | 75 return deserialize(data); |
| 76 end | 76 end |
| 77 | 77 |
| 78 function provider:init(config) | 78 function provider:init(config) |
