| // Copyright (c) 2016, Facebook, Inc. All rights reserved. |
| // This source code is licensed under both the GPLv2 (found in the |
| // COPYING file in the root directory) and Apache 2.0 License |
| // (found in the LICENSE.Apache file in the root directory). |
| |
| #pragma once |
| // lua headers |
| extern "C" { |
| #include <lauxlib.h> |
| #include <lua.h> |
| #include <lualib.h> |
| } |
| |
| #ifdef LUA |
| #include <string> |
| #include <vector> |
| |
| #include "rocksdb/utilities/lua/rocks_lua_custom_library.h" |
| |
| namespace rocksdb { |
| namespace lua { |
| class LuaStateWrapper { |
| public: |
| explicit LuaStateWrapper(const std::string& lua_script) { |
| lua_state_ = luaL_newstate(); |
| Init(lua_script, {}); |
| } |
| LuaStateWrapper( |
| const std::string& lua_script, |
| const std::vector<std::shared_ptr<RocksLuaCustomLibrary>>& libraries) { |
| lua_state_ = luaL_newstate(); |
| Init(lua_script, libraries); |
| } |
| lua_State* GetLuaState() const { return lua_state_; } |
| ~LuaStateWrapper() { lua_close(lua_state_); } |
| |
| private: |
| void Init( |
| const std::string& lua_script, |
| const std::vector<std::shared_ptr<RocksLuaCustomLibrary>>& libraries) { |
| if (lua_state_) { |
| luaL_openlibs(lua_state_); |
| for (const auto& library : libraries) { |
| luaL_openlib(lua_state_, library->Name(), library->Lib(), 0); |
| library->CustomSetup(lua_state_); |
| } |
| luaL_dostring(lua_state_, lua_script.c_str()); |
| } |
| } |
| |
| lua_State* lua_state_; |
| }; |
| } // namespace lua |
| } // namespace rocksdb |
| #endif // LUA |