ngx_int_t ngx_http_lua_cache_loadbuffer(lua_State *L, const u_char *src, size_t src_len, const u_char *cache_key, const char *name, char **err, unsigned enabled) { int rc; dd("XXX cache key: [%s]", cache_key); if (!enabled) { ngx_http_lua_clear_package_loaded(L); } if (ngx_http_lua_cache_load_code(L, (char *) cache_key) == NGX_OK) { /* code chunk loaded from cache, sp++ */ dd("Code cache hit! cache key='%s', stack top=%d, script='%.*s'", cache_key, lua_gettop(L), (int) src_len, src); return NGX_OK; } dd("Code cache missed! cache key='%s', stack top=%d, script='%.*s'", cache_key, lua_gettop(L), (int) src_len, src); /* load closure factory of inline script to the top of lua stack, sp++ */ rc = ngx_http_lua_clfactory_loadbuffer(L, (char *) src, src_len, name); if (rc != 0) { /* Oops! error occured when loading Lua script */ if (rc == LUA_ERRMEM) { *err = "memory allocation error"; } else { if (lua_isstring(L, -1)) { *err = (char *) lua_tostring(L, -1); } else { *err = "syntax error"; } } return NGX_ERROR; } /* store closure factory and gen new closure at the top of lua stack to * code cache */ rc = ngx_http_lua_cache_store_code(L, (char *) cache_key); if (rc != NGX_OK) { *err = "fail to generate new closure from the closure factory"; return NGX_ERROR; } return NGX_OK; }
ngx_int_t ngx_http_lua_cache_loadbuffer(lua_State *L, const u_char *buf, int buf_len, const char *name, char **err) { int rc; u_char *p; u_char cache_key[IL_TAG_LEN + 2*MD5_DIGEST_LENGTH + 1]; p = ngx_copy(cache_key, IL_TAG, IL_TAG_LEN); /* calculate digest of inline script */ p = ngx_http_lua_digest_hex(p, buf, buf_len); *p = '\0'; dd("XXX cache key: [%s]", cache_key); if (ngx_http_lua_cache_load_code(L, (char *) cache_key) == NGX_OK) { /* code chunk loaded from cache, sp++ */ dd("Code cache hit! cache key='%s', stack top=%d, script='%.*s'", cache_key, lua_gettop(L), buf_len, buf); return NGX_OK; } dd("Code cache missed! cache key='%s', stack top=%d, script='%.*s'", cache_key, lua_gettop(L), buf_len, buf); /* load closure factory of inline script to the top of lua stack, sp++ */ rc = ngx_http_lua_clfactory_loadbuffer(L, (char *) buf, buf_len, name); if (rc != 0) { /* Oops! error occured when loading Lua script */ if (rc == LUA_ERRMEM) { *err = "memory allocation error"; } else { if (lua_isstring(L, -1)) { *err = (char *) lua_tostring(L, -1); } else { *err = "syntax error"; } } return NGX_ERROR; } /* store closure factory and gen new closure at the top of lua stack to code cache */ rc = ngx_http_lua_cache_store_code(L, (char *) cache_key); if (rc != NGX_OK) { *err = "fail to genearte new closutre from the closutre factory"; return NGX_ERROR; } return NGX_OK; }
int ngx_http_lua_clfactory_loadstring(lua_State *l, const char *s) { return ngx_http_lua_clfactory_loadbuffer(l, s, strlen(s), s); }