Mercurial > prosody-modules
comparison mod_storage_lmdb/mod_storage_lmdb.lua @ 1799:d2dd1db9ece6
mod_storage_lmdb: Rearrange module to allow using as a library
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Fri, 28 Aug 2015 00:34:43 +0200 |
| parents | 0a21b16b9075 |
| children | 669d1208221a |
comparison
equal
deleted
inserted
replaced
| 1798:3ae8c81a348b | 1799:d2dd1db9ece6 |
|---|---|
| 13 local path = require"util.paths"; | 13 local path = require"util.paths"; |
| 14 local serialization = require"util.serialization"; | 14 local serialization = require"util.serialization"; |
| 15 local serialize = serialization.serialize; | 15 local serialize = serialization.serialize; |
| 16 local deserialize = serialization.deserialize; | 16 local deserialize = serialization.deserialize; |
| 17 | 17 |
| 18 local base_path = path.resolve_relative_path(prosody.paths.data, module.host); | 18 local drivers = {}; |
| 19 lfs.mkdir(base_path); | 19 local provider = {}; |
| 20 | |
| 21 local env = lmdb.env_create(); | |
| 22 assert(env:set_maxdbs(module:get_option_number("lmdb_maxdbs", 20))); | |
| 23 local env_flags = 0; | |
| 24 for i, flag in ipairs(module:get_option_array("lmdb_flags", {})) do | |
| 25 env_flags = env_flags + assert(lmdb["MDB_"..flag:upper()], "No such flag "..flag); | |
| 26 end | |
| 27 env:open(base_path, env_flags, tonumber("640", 8)); | |
| 28 | 20 |
| 29 local keyval = {}; | 21 local keyval = {}; |
| 30 local keyval_mt = { __index = keyval, flags = lmdb.MDB_CREATE }; | 22 local keyval_mt = { __index = keyval, flags = lmdb.MDB_CREATE }; |
| 23 drivers.keyval = keyval_mt; | |
| 31 | 24 |
| 32 function keyval:set(user, value) | 25 function keyval:set(user, value) |
| 33 local t = self.env:txn_begin(nil, 0); | 26 local t = self.env:txn_begin(nil, 0); |
| 34 if type(value) == "table" and next(value) == nil then | 27 if type(value) == "table" and next(value) == nil then |
| 35 value = nil; | 28 value = nil; |
| 63 | 56 |
| 64 local drivers = { | 57 local drivers = { |
| 65 keyval = keyval_mt; | 58 keyval = keyval_mt; |
| 66 } | 59 } |
| 67 | 60 |
| 68 function open(_, store, typ) | 61 |
| 62 function provider:init(config) | |
| 63 if config.base_path then | |
| 64 lfs.mkdir(config.base_path); | |
| 65 end | |
| 66 local env = lmdb.env_create(); | |
| 67 env:set_maxdbs(config.maxdbs or 20); | |
| 68 local env_flags = 0; | |
| 69 if config.flags then | |
| 70 for flag in config.flags do | |
| 71 env_flags = env_flags + assert(lmdb["MDB_"..flag:upper()], "No such flag "..flag); | |
| 72 end | |
| 73 end | |
| 74 env:open(config.base_path or ".", env_flags, tonumber("640", 8)); | |
| 75 self.env = env; | |
| 76 end | |
| 77 | |
| 78 function provider:open(store, typ) | |
| 69 typ = typ or "keyval"; | 79 typ = typ or "keyval"; |
| 70 local driver_mt = drivers[typ]; | 80 local driver_mt = drivers[typ]; |
| 71 if not driver_mt then | 81 if not driver_mt then |
| 72 return nil, "unsupported-store"; | 82 return nil, "unsupported-store"; |
| 73 end | 83 end |
| 84 local env = self.env; | |
| 74 local t = env:txn_begin(nil, 0); | 85 local t = env:txn_begin(nil, 0); |
| 75 local db = t:dbi_open(store.."_"..typ, driver_mt.flags); | 86 local db = t:dbi_open(store.."_"..typ, driver_mt.flags); |
| 76 assert(t:commit()); | 87 local ok, err = t:commit(); |
| 88 if not ok then | |
| 89 module:log("error", "Could not open database %s_%s: %s", store, typ, tostring(err)); | |
| 90 return ok, err; | |
| 91 end | |
| 77 | 92 |
| 78 return setmetatable({ env = env, store = store, type = typ, db = db }, driver_mt); | 93 return setmetatable({ env = env, store = store, type = typ, db = db }, driver_mt); |
| 79 end | 94 end |
| 80 | 95 |
| 81 function module.unload() | 96 if prosody then |
| 82 env:sync(1); | 97 provider:init({ |
| 83 env:close(); | 98 base_path = path.resolve_relative_path(prosody.paths.data, module.host); |
| 99 flags = module:get_option_set("lmdb_flags", {}); | |
| 100 maxdbs = module:get_option_number("lmdb_maxdbs", 20); | |
| 101 }); | |
| 102 | |
| 103 function module.unload() | |
| 104 provider.env:sync(1); | |
| 105 provider.env:close(); | |
| 106 end | |
| 107 | |
| 108 module:provides("storage", provider); | |
| 109 else | |
| 110 return provider; | |
| 84 end | 111 end |
| 85 | |
| 86 module:provides("storage"); |
