* luci/libs/uvl:
authorJo-Philipp Wich <jow@openwrt.org>
Fri, 5 Sep 2008 16:46:51 +0000 (16:46 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Fri, 5 Sep 2008 16:46:51 +0000 (16:46 +0000)
- implement bytecode loading in luci.uvl.read_scheme()
- add "uvlc" executable to byte-compile arbitary schemes
- add lib/uci/schema/bytecode/ directory

libs/uvl/luasrc/uvl.lua
libs/uvl/root/usr/bin/uvlc [new file with mode: 0755]

index 680581d220de8be09516bf33e64f9cf4a8f83fcd..1b430af10c358fed993ba5d1ccaf1ac37af4497c 100644 (file)
@@ -355,32 +355,43 @@ end
 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,file))
+               end      
        end
 end
 
diff --git a/libs/uvl/root/usr/bin/uvlc b/libs/uvl/root/usr/bin/uvlc
new file mode 100755 (executable)
index 0000000..c07cc54
--- /dev/null
@@ -0,0 +1,22 @@
+#!/usr/bin/lua
+
+
+if arg[1] then
+       require("luci.util")
+       require("luci.uvl")
+       require("luci.fs")
+
+       local uvl = luci.uvl.UVL()
+       local scheme, err = uvl:get_scheme( arg[1] )
+
+       if scheme then
+               luci.fs.writefile(
+                       "%s/bytecode/%s.lua" %{ uvl.schemedir, arg[1] },
+                       luci.util.get_bytecode(scheme)
+               )
+       else
+               print("Error:", err:string())
+       end
+else
+       print( "Usage: uvlc <scheme>" )
+end