Redis
 sql >> डेटाबेस >  >> NoSQL >> Redis

स्क्रिप्ट ने वैश्विक चर बनाने का प्रयास किया

फ़ाइल scripting.c में स्रोत कोड देख रहे हैं

/* This function installs metamethods in the global table _G that prevent
 * the creation of globals accidentally.
 *
 * It should be the last to be called in the scripting engine initialization
 * sequence, because it may interact with creation of globals. */
void scriptingEnableGlobalsProtection(lua_State *lua) {
    char *s[32];
    sds code = sdsempty();
    int j = 0;

    /* strict.lua from: http://metalua.luaforge.net/src/lib/strict.lua.html.
     * Modified to be adapted to Redis. */
    s[j++]="local mt = {}\n";
    s[j++]="setmetatable(_G, mt)\n";
    s[j++]="mt.__newindex = function (t, n, v)\n";
    s[j++]="  if debug.getinfo(2) then\n";
    s[j++]="    local w = debug.getinfo(2, \"S\").what\n";
    s[j++]="    if w ~= \"main\" and w ~= \"C\" then\n";
    s[j++]="      error(\"Script attempted to create global variable '\"..tostring(n)..\"'\", 2)\n";
    s[j++]="    end\n";
    s[j++]="  end\n";
    s[j++]="  rawset(t, n, v)\n";
    s[j++]="end\n";
    s[j++]="mt.__index = function (t, n)\n";
    s[j++]="  if debug.getinfo(2) and debug.getinfo(2, \"S\").what ~= \"C\" then\n";
    s[j++]="    error(\"Script attempted to access unexisting global variable '\"..tostring(n)..\"'\", 2)\n";
    s[j++]="  end\n";
    s[j++]="  return rawget(t, n)\n";
    s[j++]="end\n";
    s[j++]=NULL;

    for (j = 0; s[j] != NULL; j++) code = sdscatlen(code,s[j],strlen(s[j]));
    luaL_loadbuffer(lua,code,sdslen(code),"@enable_strict_lua");
    lua_pcall(lua,0,0,0);
    sdsfree(code);
}

scriptingEnableGlobalsProtection . की दस्तावेज़-स्ट्रिंग इंगित करता है कि इरादा स्क्रिप्ट लेखकों को सामान्य गलती के बारे में सूचित करना है (local . का उपयोग नहीं करना) )

ऐसा लगता है कि यह सुरक्षा सुविधा नहीं है, इसलिए हमारे पास दो समाधान हैं:

कोई इस सुरक्षा को हटा सकता है:

local mt = setmetatable(_G, nil)
-- define global functions / variables
function alex() return 3.1415 end
-- return globals protection mechanizm
setmetatable(_G, mt)

या rawset . का उपयोग करें :

local function alex() return 3.1415 end
rawset(_G, "alex", alex)



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. विंडोज़ पर phpredis 7 64bit xampp

  2. Redis/NoSQL में अवधारणा बनाने में मदद चाहिए

  3. ओम / रेडिस में एक गतिशील क्षेत्र सेट करना

  4. प्रीडिस का उपयोग करके, एक बहुआयामी सहयोगी सरणी कैसे सेट करें (यानी स्टोर करें)?

  5. सॉर्ट किए गए सेट पर डीआईएफएफ कैसे प्राप्त करें