blob: 36b007cc73c8f18220ab87b12d3a8f444b83d66e [file] [log] [blame]
// 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