[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Some newbie questions
- From: Jamie Webb <j@...>
- Date: Fri, 25 Jun 2004 13:42:37 +0100
On Friday 25 June 2004 12:22, Boguslaw Brandys wrote:
> So, rather then include link to another script in script itself - You said
> I must rather load script in C using lua_loadfile and assign to variable.
> This is what I can't understand.
> Also this common script will contain a lot of shared functions (for
> example to draw report elements like tables,comments - particulary I want
> to generate reports using Lua to build report preview from simple chunks
> and data returned from SQL database).Could You give me an example how to
> load common script from buffer to Lua global variable available to ANY
> script loaded from remote SQL database after that ?
Are you creating a new lua_State for each script you load from the database?
If so, the simplest solution will be to bytecode-compile your common code
using luac, and then either just load it using dofile (the performance impact
of actually loading from a file repeatedly should be negligible thanks to the
filesystem cache), or load in the compiled script from C and use
luaL_loadbuffer.
A better approach is likely to be to reuse the same lua_State for each script.
Then you can load your common functions at the start and they will always be
available. If you need to avoid the scripts interfering with each other by
polluting the global table, you can use 'sandboxing'. There are subtleties
involved with doing that competely and securely, but the basic pattern is
quite simple. I'll show it in Lua, but it's easy to code the same thing in C.
-- 'code' is a string containing the source code for your script.
-- The common code is already loaded using dofile or similar.
function sandbox(code)
-- Load the code
local chunk = assert(loadstring(code))
-- Create an empty environment for it
local env = {}
-- Copy globals into the new environment as needed
local mt = {
-- Could just use __index = _G here, but this is faster:
__index = function(t, k)
local v = _G[k]
t[k] = v
return v
end
}
-- Set the environment of the loaded chunk
setfenv(chunk, setmetatable(env, mt))
-- And execute it
chunk()
end
-- Jamie Webb