Comparison

plugins/mod_storage_sql.lua @ 11971:0b350909da24

mod_storage_sql: Return cached total where it makes sense This should skip the summary SQL query when not needed, ie when the cached value can be used directly.
author Kim Alvefur <zash@zash.se>
date Tue, 30 Nov 2021 16:26:01 +0100
parent 11970:f0e78fa8f24c
child 12574:18d33668c5fa
child 12592:d580e6a57cbb
comparison
equal deleted inserted replaced
11970:f0e78fa8f24c 11971:0b350909da24
426 query = query or {}; 426 query = query or {};
427 local user,store = username,self.store; 427 local user,store = username,self.store;
428 local cache_key = jid_join(username, host, self.store); 428 local cache_key = jid_join(username, host, self.store);
429 local total = archive_item_count_cache:get(cache_key); 429 local total = archive_item_count_cache:get(cache_key);
430 (total and item_count_cache_hit or item_count_cache_miss)(); 430 (total and item_count_cache_hit or item_count_cache_miss)();
431 if total ~= nil and query.limit == 0 and query.start == nil and query.with == nil and query["end"] == nil 431 if query.start == nil and query.with == nil and query["end"] == nil and query.key == nil and query.ids == nil then
432 and query.key == nil and query.ids == nil then 432 -- the query is for the whole archive, so a cached 'total' should be a
433 return noop, total; 433 -- relatively accurate response if that's all that is requested
434 if total ~= nil and query.limit == 0 then return noop, total; end
435 else
436 -- not usable, so refresh it later if needed
437 total = nil;
434 end 438 end
435 local ok, result, err = engine:transaction(function() 439 local ok, result, err = engine:transaction(function()
436 local sql_query = [[ 440 local sql_query = [[
437 SELECT "key", "type", "value", "when", "with" 441 SELECT "key", "type", "value", "when", "with"
438 FROM "prosodyarchive" 442 FROM "prosodyarchive"
443 local where = { "\"host\" = ?", "\"user\" = ?", "\"store\" = ?", }; 447 local where = { "\"host\" = ?", "\"user\" = ?", "\"store\" = ?", };
444 448
445 archive_where(query, args, where); 449 archive_where(query, args, where);
446 450
447 -- Total matching 451 -- Total matching
448 if query.total then 452 if query.total and not total then
453
449 local stats = engine:select("SELECT COUNT(*) FROM \"prosodyarchive\" WHERE " 454 local stats = engine:select("SELECT COUNT(*) FROM \"prosodyarchive\" WHERE "
450 .. t_concat(where, " AND "), unpack(args)); 455 .. t_concat(where, " AND "), unpack(args));
451 if stats then 456 if stats then
452 for row in stats do 457 for row in stats do
453 total = row[1]; 458 total = row[1];