mod_storage_sql: Look up archive IDs in separate queries (fixes #1325)

This is probably not good for performance.
vault/master
Kim Alvefur 7 years ago
parent 59b4972c34
commit 7e32666c2b
  1. 58
      plugins/mod_storage_sql.lua

@ -327,38 +327,36 @@ local function archive_where(query, args, where)
end
end
local function archive_where_id_range(query, args, where)
local args_len = #args
-- Before or after specific item, exclusive
local id_lookup_sql = [[
SELECT "sort_id"
FROM "prosodyarchive"
WHERE "key" = ? AND "host" = ? AND "user" = ? AND "store" = ?
LIMIT 1;
]];
if query.after then -- keys better be unique!
where[#where+1] = [[
"sort_id" > COALESCE(
(
SELECT "sort_id"
FROM "prosodyarchive"
WHERE "key" = ? AND "host" = ? AND "user" = ? AND "store" = ?
LIMIT 1
), 0)
]];
args[args_len+1], args[args_len+2], args[args_len+3], args[args_len+4] = query.after, args[1], args[2], args[3];
args_len = args_len + 4
local after_id = nil;
for row in engine:select(id_lookup_sql, query.after, host, user or "", store) do
after_id = row[1];
end
if not after_id then
return nil, "item-not-found";
end
where[#where+1] = '"sort_id" > ?';
args[#args+1] = after_id;
end
if query.before then
where[#where+1] = [[
"sort_id" < COALESCE(
(
SELECT "sort_id"
FROM "prosodyarchive"
WHERE "key" = ? AND "host" = ? AND "user" = ? AND "store" = ?
LIMIT 1
),
(
SELECT MAX("sort_id")+1
FROM "prosodyarchive"
)
)
]]
args[args_len+1], args[args_len+2], args[args_len+3], args[args_len+4] = query.before, args[1], args[2], args[3];
local before_id = nil;
for row in engine:select(id_lookup_sql, query.after, host, user or "", store) do
before_id = row[1];
end
if not before_id then
return nil, "item-not-found";
end
where[#where+1] = '"sort_id" < ?';
args[#args+1] = before_id;
end
return true;
end
function archive_store:find(username, query)
@ -398,7 +396,8 @@ function archive_store:find(username, query)
end
end
archive_where_id_range(query, args, where);
local ok, err = archive_where_id_range(query, args, where);
if not ok then return ok, err; end
if query.limit then
args[#args+1] = query.limit;
@ -466,7 +465,8 @@ function archive_store:delete(username, query)
table.remove(where, 2);
end
archive_where(query, args, where);
archive_where_id_range(query, args, where);
local ok, err = archive_where_id_range(query, args, where);
if not ok then return ok, err; end
if query.truncate == nil then
sql_query = sql_query:format(t_concat(where, " AND "));
else

Loading…
Cancel
Save