--[[******************************************************************************]] --[[* Project ib_win_core *]] --[[* Copyright 2023 Incredibuild Software Ltd. *]] --[[* All rights reserved *]] --[[******************************************************************************]] local function collect_usage_entries(usageDB, initDB, timecursor) local missing = {} local times timecursor, times = unpack(redis.call('SCAN', timecursor)) for _, time in ipairs(times) do local valcursor = '0' repeat local vals valcursor, vals = unpack(redis.call('HSCAN', time, valcursor)) redis.call('SELECT', initDB) for i = 1, #vals, 2 do local key = string.sub(vals[i], 1, 32) local val = string.sub(vals[i], 33, 64) if redis.call('HEXISTS', key, val) then redis.call('HSET', key, val, time) else missing[vals[i]] = time end end redis.call('SELECT', usageDB) until valcursor == '0' end return timecursor, missing end local function clean(missing) for uuid, time in pairs(missing) do redis.call('HDEL', time, uuid) end end local function main(usageDB, initDB, timecursor) redis.call('SELECT', usageDB) if timecursor == '0' then redis.call('DEL', 0) end local missing = {} timecursor, missing = collect_usage_entries(usageDB, initDB, timecursor) clean(missing) return 'OK' .. "\n" .. timecursor end local ok, result = pcall(main, unpack(ARGV)) return result