mirror of https://github.com/bjc/prosody
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.
83 lines
2.5 KiB
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
|
|
|