2021-10-23 12:03:31 +00:00
|
|
|
#if !TESTS_BUILD
|
2020-09-17 22:26:14 +00:00
|
|
|
#include "Database.hpp"
|
|
|
|
#include <sstream>
|
2020-09-18 15:48:45 +00:00
|
|
|
#include "../angelscript/extensions/scriptarray/scriptarray.h"
|
2021-10-23 12:03:31 +00:00
|
|
|
#include "../angelscript/extensions/scriptstdstring/scriptstdstring.h"
|
|
|
|
#include "ASTypeDefParser/Parser.hpp"
|
2020-09-17 22:26:14 +00:00
|
|
|
|
|
|
|
Napi::Object Database::Init(Napi::Env env, Napi::Object exports) {
|
|
|
|
Napi::Function func =
|
|
|
|
DefineClass(env, "Database",
|
2021-10-23 12:03:31 +00:00
|
|
|
{InstanceMethod("reset", &Database::Reset), InstanceMethod("loadTypeDef", &Database::LoadTypeDef),
|
|
|
|
InstanceMethod("loadScript", &Database::LoadScript), InstanceMethod("build", &Database::Build),
|
|
|
|
InstanceMethod("messages", &Database::GetMessages),
|
2020-09-18 15:48:45 +00:00
|
|
|
InstanceMethod("setEngineProperty", &Database::SetEngineProperty)});
|
2020-09-17 22:26:14 +00:00
|
|
|
|
|
|
|
auto* constructor = new Napi::FunctionReference();
|
|
|
|
*constructor = Napi::Persistent(func);
|
|
|
|
|
|
|
|
env.SetInstanceData(constructor);
|
|
|
|
exports.Set("Database", func);
|
|
|
|
return exports;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Database::MessageCallback(const asSMessageInfo* msg) {
|
|
|
|
_messages.push_back(new Diagnostic(msg->section, msg->row, msg->col, msg->type, msg->message));
|
|
|
|
}
|
|
|
|
|
2021-10-23 12:03:31 +00:00
|
|
|
void Database::SetupEngine() {
|
2020-09-17 22:26:14 +00:00
|
|
|
_engine = asCreateScriptEngine();
|
2021-10-23 12:03:31 +00:00
|
|
|
_builder = {};
|
2020-09-17 22:26:14 +00:00
|
|
|
_engine->SetMessageCallback(asMETHOD(Database, MessageCallback), this, asCALL_THISCALL);
|
2021-10-23 12:03:31 +00:00
|
|
|
_engine->SetEngineProperty(asEP_DISALLOW_EMPTY_LIST_ELEMENTS, true);
|
|
|
|
_engine->SetEngineProperty(asEP_DISALLOW_VALUE_ASSIGN_FOR_REF_TYPE, false);
|
|
|
|
_engine->SetEngineProperty(asEP_ALLOW_UNSAFE_REFERENCES, true);
|
|
|
|
_engine->SetEngineProperty(asEP_ALWAYS_IMPL_DEFAULT_CONSTRUCT, true);
|
|
|
|
_engine->SetEngineProperty(asEP_AUTO_GARBAGE_COLLECT, false);
|
|
|
|
_engine->SetEngineProperty(asEP_REQUIRE_ENUM_SCOPE, true);
|
|
|
|
_engine->SetEngineProperty(asEP_PROPERTY_ACCESSOR_MODE, 2);
|
|
|
|
_engine->SetEngineProperty(asEP_COMPILER_WARNINGS, 2);
|
2020-09-18 15:48:45 +00:00
|
|
|
RegisterStdString(_engine);
|
|
|
|
RegisterScriptArray(_engine, true);
|
2021-10-23 12:03:31 +00:00
|
|
|
_builder.StartNewModule(_engine, "Module");
|
|
|
|
}
|
2020-09-18 15:48:45 +00:00
|
|
|
|
2021-10-23 12:03:31 +00:00
|
|
|
Database::Database(const Napi::CallbackInfo& info) : ObjectWrap(info) {
|
2020-09-17 22:26:14 +00:00
|
|
|
Reset(info);
|
|
|
|
}
|
|
|
|
|
2020-09-18 15:48:45 +00:00
|
|
|
void Database::SetEngineProperty(const Napi::CallbackInfo& info) {
|
|
|
|
auto property = info[0].As<Napi::Number>().Int32Value();
|
|
|
|
auto value = info[1].As<Napi::Number>().Int32Value();
|
|
|
|
|
|
|
|
_engine->SetEngineProperty(static_cast<asEEngineProp>(property), value);
|
|
|
|
}
|
|
|
|
|
2020-09-17 22:26:14 +00:00
|
|
|
void Database::Reset(const Napi::CallbackInfo&) {
|
2021-10-23 12:03:31 +00:00
|
|
|
std::lock_guard<std::mutex> lck(_lock);
|
|
|
|
if (_engine != nullptr){
|
|
|
|
_engine->DiscardModule("Module");
|
|
|
|
_engine->Release();
|
|
|
|
}
|
|
|
|
SetupEngine();
|
|
|
|
_result.Clear();
|
2020-09-17 22:26:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Database::LoadScript(const Napi::CallbackInfo& info) {
|
|
|
|
if (info.Length() < 2)
|
|
|
|
throw std::logic_error("Not enough arguments");
|
|
|
|
auto name = info[0].As<Napi::String>().Utf8Value();
|
|
|
|
auto script = info[1].As<Napi::String>().Utf8Value();
|
|
|
|
|
|
|
|
_builder.AddSectionFromMemory(name.c_str(), script.c_str());
|
|
|
|
}
|
2021-10-23 12:03:31 +00:00
|
|
|
|
|
|
|
void Database::LoadTypeDef(const Napi::CallbackInfo& info) {
|
|
|
|
if (info.Length() < 2)
|
|
|
|
throw std::logic_error("Not enough arguments");
|
|
|
|
auto name = info[0].As<Napi::String>().Utf8Value();
|
|
|
|
auto script = info[1].As<Napi::String>().Utf8Value();
|
|
|
|
|
|
|
|
ASTypeDefParser::Parser::ParseAndRegister(_result, script);
|
|
|
|
}
|
|
|
|
|
2020-09-17 22:26:14 +00:00
|
|
|
Napi::Value Database::Build(const Napi::CallbackInfo& info) {
|
2021-10-23 12:03:31 +00:00
|
|
|
std::lock_guard<std::mutex> lck(_lock);
|
2020-09-17 22:26:14 +00:00
|
|
|
_messages.clear();
|
2021-10-23 12:03:31 +00:00
|
|
|
_result.RegisterTypes(_engine);
|
|
|
|
_result.RegisterImplementation(_engine);
|
2020-09-17 22:26:14 +00:00
|
|
|
_builder.BuildModule();
|
|
|
|
return Napi::Number::New(info.Env(), 0);
|
|
|
|
}
|
|
|
|
Napi::Value Database::GetMessages(const Napi::CallbackInfo& info) {
|
|
|
|
auto messages = Napi::Array::New(info.Env());
|
|
|
|
for (auto msg : _messages) {
|
|
|
|
auto obj = Napi::Object::New(info.Env());
|
|
|
|
obj.Set("section", Napi::String::New(info.Env(), msg->GetSection()));
|
|
|
|
obj.Set("row", Napi::Number::New(info.Env(), msg->GetRow()));
|
|
|
|
obj.Set("col", Napi::Number::New(info.Env(), msg->GetCol()));
|
|
|
|
obj.Set("type", Napi::Number::New(info.Env(), msg->GetType()));
|
|
|
|
obj.Set("message", Napi::String::New(info.Env(), msg->GetMessage()));
|
|
|
|
messages[messages.Length()] = obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
return messages;
|
|
|
|
}
|
2021-10-23 12:03:31 +00:00
|
|
|
#endif
|