Module:VarsCacheMap

From EarthMC
Jump to navigation Jump to search

Documentation for this module may be created at Module:VarsCacheMap/doc

local util_vars = require('Module:VariablesLuaUtil')
local makeClass = require('Module:Class')
require('Module:LibraryUtil')
local cache = require('mw.ext.LuaCache')

local p = {}

local lang = mw.getLanguage('en')

local Cache = makeClass "Cache"
	
function Cache.prototype:constructor(attrs)
	checkType(1, attrs, 'table', true)
	attrs = attrs or {}
	
	self.prefix = attrs.prefix
	self.dataModule = attrs.dataModule
	
	return self
end

function Cache.prototype:makeKey(localKey)
	return self.prefix .. lang:lc(localKey)
end

-- localKey is the key found in the source data file
-- Modes: 0-Default 1-No Fallback (not loadData in any circumstanace)
function Cache.prototype:get(localKey, mode)
	mode = mode or 0
	local key = self:makeKey(localKey)
	
	-- Get from variable storage (page storage, fastest)
	local data = util_vars.getObject(key)
	if not data then
		-- Else get from cache (site storage, slower but still fast)
		data = cache.get(key)
		if not data and mode ~= 1 then
			-- Otherwise fallback to accessing data from `loadData`
			-- We shouldn't hit here ideally, but best to have a fallback
			-- Note: cache should be pre-populated to avoid falling back here, this is only meant as a backup
			data = mw.loadData('Module:'..self.dataModule)[localKey]
			-- update cache for future calls
			cache.set(key, data)
		end
		-- update vars for future calls
		util_vars.setObject(key, data)
	end
	return data
end

-- Note: this shouldn't be used inside normal modals, and should only be called by refresh scripts
function Cache.prototype:addAllDataToCache()
	local data = require('Module:'..self.dataModule) -- has to be a require to allow looping
	for key, val in pairs(data) do
		-- mw.log( self:makeKey(key) )
		cache.set(self:makeKey(key), val)
	end
end

-- Deletes all keys pertaining to this cache, to allow for a cleaner refresh
-- Note: this shouldn't be used inside normal modals, and should only be called by refresh scripts
function Cache.prototype:deleteCache()
	local data = require('Module:'..self.dataModule) -- has to be a require to allow looping
	for key, _ in pairs(data) do
		cache.delete(self:makeKey(key))
	end
end

function Cache.prototype:refreshCache()
	self:deleteCache()
	self:addAllDataToCache()
end

function p.create(attrs)
	return Cache(attrs)
end

return p