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)