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