function UVL.read_scheme( self, scheme, alias )
local so = luci.uvl.scheme( self, scheme )
+ local bc = "%s/bytecode/%s.lua" %{ self.schemedir, scheme }
- local schemes = { }
- local files = luci.fs.glob(self.schemedir .. '/*/' .. scheme)
+ if not luci.fs.access(bc) then
+ local schemes = { }
+ local files = luci.fs.glob(self.schemedir .. '/*/' .. scheme)
- if files then
- for i, file in ipairs( files ) do
- if not luci.fs.access(file) then
- return so:error(ERR.SME_READ(so,file))
- end
+ if files then
+ for i, file in ipairs( files ) do
+ if not luci.fs.access(file) then
+ return false, so:error(ERR.SME_READ(so,file))
+ end
+
+ local uci = luci.model.uci.cursor( luci.fs.dirname(file), default_savedir )
- local uci = luci.model.uci.cursor( luci.fs.dirname(file), default_savedir )
+ local sd, err = uci:get_all( luci.fs.basename(file) )
- local sd, err = uci:get_all( luci.fs.basename(file) )
+ if not sd then
+ return false, ERR.UCILOAD(so, err)
+ end
- if not sd then
- return false, ERR.UCILOAD(so, err)
+ table.insert( schemes, sd )
end
- table.insert( schemes, sd )
+ local ok, err = self:_read_scheme_parts( so, schemes )
+ if ok and alias then self.packages[alias] = self.packages[scheme] end
+ return ok, err
+ else
+ return false, so:error(ERR.SME_FIND(so, self.schemedir))
end
-
- local ok, err = self:_read_scheme_parts( so, schemes )
- if ok and alias then self.packages[alias] = self.packages[scheme] end
- return ok, err
else
- return false, so:error(ERR.SME_FIND(so, self.schemedir))
+ local sc = loadfile(bc)
+ if sc then
+ self.packages[scheme] = sc()
+ return true
+ else
+ return false, so:error(ERR.SME_READ(so,bc))
+ end
end
end
local oo = so:option(r[3])
local eo = oo:enum(v.value)
- if t.type ~= "enum" then
+ if t.type ~= "enum" and t.type ~= "reference" then
return false, scheme:error(ERR.SME_EBADTYPE(eo))
end
uvlitem = luci.util.class()
function uvlitem.cid(self)
- return table.concat( self.cref, '.' )
+ if #self.cref == 1 then
+ return self.cref[1]
+ else
+ local r = { unpack(self.cref) }
+ local c = self.c
+ if c and c[r[2]] and c[r[2]]['.anonymous'] and c[r[2]]['.index'] then
+ r[2] = '@' .. c[r[2]]['.type'] ..
+ '[' .. tostring(c[r[2]]['.index']) .. ']'
+ end
+ return table.concat( r, '.' )
+ end
end
function uvlitem.sid(self)
--- Get the value of this option.
-- @return The associated configuration value
function option.value(self)
- local v = self:config()
+ local v = self:config() or self:scheme('default')
if v and self:scheme('multival') then
v = luci.util.split( v, "%s+", nil, true )
end