local json = require "util.json";
local xml_parse = require "util.xml".parse;
local uuid = require "util.uuid";
-local resolve_relative_path = require "core.configmanager".resolve_relative_path;
+local resolve_relative_path = require "util.paths".resolve_relative_path;
local stanza_mt = require"util.stanza".stanza_mt;
local getmetatable = getmetatable;
--local dburi = db2uri(params);
engine = mod_sql:create_engine(params);
- engine:set_encoding();
-
if module:get_option("sql_manage_tables", true) then
-- Automatically create table, ignore failure (table probably already exists)
create_table();
keyval_store.__index = keyval_store;
function keyval_store:get(username)
user,store = username,self.store;
- return select(2, engine:transaction(keyval_store_get));
+ local ok, result = engine:transaction(keyval_store_get);
+ if not ok then return ok, result; end
+ return result;
end
function keyval_store:set(username, data)
user,store = username,self.store;
end
local archive_store = {}
+archive_store.caps = {
+ total = true;
+};
archive_store.__index = archive_store
-function archive_store:append(username, key, when, with, value)
- if value == nil then -- COMPAT early versions
- when, with, value, key = key, when, with, value
+function archive_store:append(username, key, value, when, with)
+ if type(when) ~= "number" then
+ value, when, with = when, with, value;
end
local user,store = username,self.store;
return engine:transaction(function()
local user,store = username,self.store;
local total;
local ok, result = engine:transaction(function()
- local sql_query = "SELECT `key`, `type`, `value`, `when` FROM `prosodyarchive` WHERE %s ORDER BY `sort_id` %s%s;";
+ local sql_query = "SELECT `key`, `type`, `value`, `when`, `with` FROM `prosodyarchive` WHERE %s ORDER BY `sort_id` %s%s;";
local args = { host, user or "", store, };
local where = { "`host` = ?", "`user` = ?", "`store` = ?", };
-- Total matching
if query.total then
- local stats = engine:select(sql_query:gsub("^(SELECT).-(FROM)", "%1 COUNT(*) %2"):format(t_concat(where, " AND "), "DESC", ""), unpack(args));
+ local stats = engine:select("SELECT COUNT(*) FROM `prosodyarchive` WHERE " .. t_concat(where, " AND "), unpack(args));
if stats then
local _total = stats()
total = _total and _total[1];
return function()
local row = result();
if row ~= nil then
- return row[1], deserialize(row[2], row[3]), row[4];
+ return row[1], deserialize(row[2], row[3]), row[4], row[5];
end
end, total;
end
local sql_query = "DELETE FROM `prosodyarchive` WHERE %s;";
local args = { host, user or "", store, };
local where = { "`host` = ?", "`user` = ?", "`store` = ?", };
+ if user == true then
+ table.remove(args, 2);
+ table.remove(where, 2);
+ end
archive_where(query, args, where);
archive_where_id_range(query, args, where);
sql_query = sql_query:format(t_concat(where, " AND "));