IMPORTANT: due to a drive failure, as of 13-Mar-2021, the Mercurial repository had to be re-mirrored, which changed every commit SHA. The old SHAs and trees are backed up in the vault branches. Please migrate to the new branches as soon as you can.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
prosody/plugins/storage/mod_storage.lua

83 lines
2.5 KiB

module:set_global();
local cache = { data = {} };
function cache:get(key) return self.data[key]; end
function cache:set(key, val) self.data[key] = val; return val; end
local _,DBI = pcall(require, "DBI");
function get_database(driver, db, ...)
local uri = "dbi:"..driver..":"..db;
return cache:get(uri) or cache:set(uri, (function(...)
module:log("debug", "Opening database: %s", uri);
prosody.unlock_globals();
local dbh = assert(DBI.Connect(...));
prosody.lock_globals();
dbh:autocommit(true)
return dbh;
end)(driver, db, ...));
end
local st = require "util.stanza";
local _parse_xml = module:require("xmlparse");
parse_xml_real = _parse_xml;
function parse_xml(str)
local s = _parse_xml(str);
if s and not s.gsub then
return st.preserialize(s);
end
end
function unparse_xml(s)
return tostring(st.deserialize(s));
end
local drivers = {};
--local driver = module:require("sqlbasic").new("SQLite3", "hello.sqlite");
local option_datastore = module:get_option("datastore");
local option_datastore_params = module:get_option("datastore_params") or {};
if option_datastore then
local driver = module:require(option_datastore).new(unpack(option_datastore_params));
table.insert(drivers, driver);
end
local datamanager = require "util.datamanager";
local olddm = {};
local dm = {};
for key,val in pairs(datamanager) do olddm[key] = val; end
do -- driver based on old datamanager
local dmd = {};
dmd.__index = dmd;
function dmd:open(host, datastore)
return setmetatable({ host = host, datastore = datastore }, dmd);
end
function dmd:get(user) return olddm.load(user, self.host, self.datastore); end
function dmd:set(user, data) return olddm.store(user, self.host, self.datastore, data); end
table.insert(drivers, dmd);
end
local function open(...)
for _,driver in pairs(drivers) do
local ds = driver:open(...);
if ds then return ds; end
end
end
local _data_path;
--function dm.set_data_path(path) _data_path = path; end
--function dm.add_callback(...) end
--function dm.remove_callback(...) end
--function dm.getpath(...) end
function dm.load(username, host, datastore)
local x = open(host, datastore);
return x:get(username);
end
function dm.store(username, host, datastore, data)
return open(host, datastore):set(username, data);
end
--function dm.list_append(...) return driver:list_append(...); end
--function dm.list_store(...) return driver:list_store(...); end
--function dm.list_load(...) return driver:list_load(...); end
for key,val in pairs(dm) do datamanager[key] = val; end