From: Jo-Philipp Wich <jow@openwrt.org>
Date: Fri, 5 Sep 2008 16:46:51 +0000 (+0000)
Subject: * luci/libs/uvl:
X-Git-Tag: 0.8.0~138
X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=3315203f2f3e9ff5a76e788e9873e84e171ae876;p=oweals%2Fluci.git

* luci/libs/uvl:
	- implement bytecode loading in luci.uvl.read_scheme()
	- add "uvlc" executable to byte-compile arbitary schemes
	- add lib/uci/schema/bytecode/ directory
---

diff --git a/libs/uvl/luasrc/uvl.lua b/libs/uvl/luasrc/uvl.lua
index 680581d22..1b430af10 100644
--- a/libs/uvl/luasrc/uvl.lua
+++ b/libs/uvl/luasrc/uvl.lua
@@ -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
index 000000000..c07cc54cc
--- /dev/null
+++ b/libs/uvl/root/usr/bin/uvlc
@@ -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