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); |