core/moduleapi.lua
changeset 9152 d03f21729b2c
parent 9045 734ba7080b35
child 9512 b57353f76c83
equal deleted inserted replaced
9151:a474c94d0b0a 9152:d03f21729b2c
   162 	end
   162 	end
   163 	self.dependencies[name] = true;
   163 	self.dependencies[name] = true;
   164 	return mod;
   164 	return mod;
   165 end
   165 end
   166 
   166 
   167 -- Returns one or more shared tables at the specified virtual paths
   167 local function get_shared_table_from_path(module, tables, path)
   168 -- Intentionally does not allow the table at a path to be _set_, it
   168 	if path:sub(1,1) ~= "/" then -- Prepend default components
       
   169 		local default_path_components = { module.host, module.name };
       
   170 		local n_components = select(2, path:gsub("/", "%1"));
       
   171 		path = (n_components<#default_path_components and "/" or "")
       
   172 			..t_concat(default_path_components, "/", 1, #default_path_components-n_components).."/"..path;
       
   173 	end
       
   174 	local shared = tables[path];
       
   175 	if not shared then
       
   176 		shared = {};
       
   177 		if path:match("%-cache$") then
       
   178 			setmetatable(shared, { __mode = "kv" });
       
   179 		end
       
   180 		tables[path] = shared;
       
   181 	end
       
   182 	return shared;
       
   183 end
       
   184 
       
   185 -- Returns a shared table at the specified virtual path
       
   186 -- Intentionally does not allow the table to be _set_, it
   169 -- is auto-created if it does not exist.
   187 -- is auto-created if it does not exist.
   170 function api:shared(...)
   188 function api:shared(path)
   171 	if not self.shared_data then self.shared_data = {}; end
   189 	if not self.shared_data then self.shared_data = {}; end
   172 	local paths = { n = select("#", ...), ... };
   190 	local shared = get_shared_table_from_path(self, shared_data, path);
   173 	local data_array = {};
   191 	self.shared_data[path] = shared;
   174 	local default_path_components = { self.host, self.name };
   192 	return shared;
   175 	for i = 1, paths.n do
       
   176 		local path = paths[i];
       
   177 		if path:sub(1,1) ~= "/" then -- Prepend default components
       
   178 			local n_components = select(2, path:gsub("/", "%1"));
       
   179 			path = (n_components<#default_path_components and "/" or "")
       
   180 				..t_concat(default_path_components, "/", 1, #default_path_components-n_components).."/"..path;
       
   181 		end
       
   182 		local shared = shared_data[path];
       
   183 		if not shared then
       
   184 			shared = {};
       
   185 			if path:match("%-cache$") then
       
   186 				setmetatable(shared, { __mode = "kv" });
       
   187 			end
       
   188 			shared_data[path] = shared;
       
   189 		end
       
   190 		t_insert(data_array, shared);
       
   191 		self.shared_data[path] = shared;
       
   192 	end
       
   193 	return unpack(data_array);
       
   194 end
   193 end
   195 
   194 
   196 function api:get_option(name, default_value)
   195 function api:get_option(name, default_value)
   197 	local config = require "core.configmanager";
   196 	local config = require "core.configmanager";
   198 	local value = config.get(self.host, name);
   197 	local value = config.get(self.host, name);