mirror of https://gitee.com/bigwinds/arangodb
fixed console
This commit is contained in:
parent
94c954b8fd
commit
b16d5e20ca
|
@ -111,18 +111,6 @@ using namespace triagens::arango;
|
||||||
/// @{
|
/// @{
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
/// @brief V8 startup loader
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
static JSLoader StartupLoaderJS;
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
/// @brief V8 action loader
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
static JSLoader ActionLoaderJS;
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief allowed client actions
|
/// @brief allowed client actions
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -317,10 +305,6 @@ ArangoServer::ArangoServer (int argc, char** argv)
|
||||||
_workingDirectory = _binaryPath + "/../tmp";
|
_workingDirectory = _binaryPath + "/../tmp";
|
||||||
_databasePath = _binaryPath + "/../var/arango";
|
_databasePath = _binaryPath + "/../var/arango";
|
||||||
|
|
||||||
_actionPathJS = _binaryPath + "/../share/arango/js/actions/system";
|
|
||||||
_startupModulesJS = _binaryPath + "/../share/arango/js/server/modules"
|
|
||||||
+ ";" + _binaryPath + "/../share/arango/js/common/modules";
|
|
||||||
|
|
||||||
#ifdef TRI_ENABLE_MRUBY
|
#ifdef TRI_ENABLE_MRUBY
|
||||||
_actionPathMR = _binaryPath + "/../share/arango/mr/actions/system";
|
_actionPathMR = _binaryPath + "/../share/arango/mr/actions/system";
|
||||||
_startupModulesMR = _binaryPath + "/../share/arango/mr/server/modules"
|
_startupModulesMR = _binaryPath + "/../share/arango/mr/server/modules"
|
||||||
|
@ -350,9 +334,6 @@ ArangoServer::ArangoServer (int argc, char** argv)
|
||||||
_workingDirectory = "/var/tmp";
|
_workingDirectory = "/var/tmp";
|
||||||
|
|
||||||
#ifdef _PKGDATADIR_
|
#ifdef _PKGDATADIR_
|
||||||
_actionPathJS = string(_PKGDATADIR_) + "/js/actions/system";
|
|
||||||
_startupModulesJS = string(_PKGDATADIR_) + "/js/server/modules"
|
|
||||||
+ ";" + string(_PKGDATADIR_) + "/js/common/modules";
|
|
||||||
|
|
||||||
#ifdef TRI_ENABLE_MRUBY
|
#ifdef TRI_ENABLE_MRUBY
|
||||||
_actionPathMR = string(_PKGDATADIR_) + "/mr/actions/system";
|
_actionPathMR = string(_PKGDATADIR_) + "/mr/actions/system";
|
||||||
|
@ -915,17 +896,7 @@ int ArangoServer::startupServer () {
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
int ArangoServer::executeShell (shell_operation_mode_e mode) {
|
int ArangoServer::executeShell (shell_operation_mode_e mode) {
|
||||||
#if 0
|
|
||||||
v8::Isolate* isolate;
|
|
||||||
v8::Persistent<v8::Context> context;
|
|
||||||
bool ok;
|
bool ok;
|
||||||
char const* files[] = { "common/bootstrap/modules.js",
|
|
||||||
"common/bootstrap/print.js",
|
|
||||||
"common/bootstrap/errors.js",
|
|
||||||
"server/ahuacatl.js",
|
|
||||||
"server/server.js"
|
|
||||||
};
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
// only simple logging
|
// only simple logging
|
||||||
TRI_ShutdownLogging();
|
TRI_ShutdownLogging();
|
||||||
|
@ -935,181 +906,167 @@ int ArangoServer::executeShell (shell_operation_mode_e mode) {
|
||||||
// open the database
|
// open the database
|
||||||
openDatabase();
|
openDatabase();
|
||||||
|
|
||||||
// enter a new isolate
|
// set-up V8 context
|
||||||
isolate = v8::Isolate::New();
|
_applicationV8->setVocbase(_vocbase);
|
||||||
isolate->Enter();
|
_applicationV8->setConcurrency(1);
|
||||||
|
_applicationV8->disableActions();
|
||||||
|
|
||||||
// global scope
|
ok = _applicationV8->prepare();
|
||||||
v8::HandleScope globalScope;
|
|
||||||
|
|
||||||
// create the context
|
if (! ok) {
|
||||||
context = v8::Context::New(0);
|
LOGGER_FATAL << "cannot initialize V8 enigne";
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
if (context.IsEmpty()) {
|
|
||||||
LOGGER_FATAL << "cannot initialize V8 engine";
|
|
||||||
TRI_FlushLogging();
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
context->Enter();
|
_applicationV8->start();
|
||||||
|
|
||||||
LOGGER_INFO << "using JavaScript modules path '" << _startupModulesJS << "'";
|
// enter V8 context
|
||||||
|
ApplicationV8::V8Context* context = _applicationV8->enterContext();
|
||||||
|
|
||||||
TRI_v8_global_t* v8g = TRI_InitV8VocBridge(context, _vocbase);
|
// .............................................................................
|
||||||
TRI_InitV8Queries(context);
|
// execute everything with a global scope
|
||||||
TRI_InitV8Conversions(context);
|
// .............................................................................
|
||||||
TRI_InitV8Utils(context, _startupModulesJS);
|
|
||||||
TRI_InitV8Shell(context);
|
|
||||||
|
|
||||||
// load all init files
|
{
|
||||||
for (i = 0; i < sizeof(files) / sizeof(files[0]); ++i) {
|
v8::HandleScope globalScope;
|
||||||
ok = StartupLoaderJS.loadScript(context, files[i]);
|
|
||||||
|
|
||||||
if (ok) {
|
// run the shell
|
||||||
LOGGER_TRACE << "loaded JavaScript file '" << files[i] << "'";
|
printf("ArangoDB JavaScript shell [V8 version %s, DB version %s]\n", v8::V8::GetVersion(), TRIAGENS_VERSION);
|
||||||
}
|
|
||||||
else {
|
|
||||||
LOGGER_FATAL << "cannot load JavaScript file '" << files[i] << "'";
|
|
||||||
TRI_FlushLogging();
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// run the shell
|
v8::Local<v8::String> name(v8::String::New("(arango)"));
|
||||||
printf("ArangoDB JavaScript shell [V8 version %s, DB version %s]\n", v8::V8::GetVersion(), TRIAGENS_VERSION);
|
v8::Context::Scope contextScope(context->_context);
|
||||||
|
|
||||||
v8::Local<v8::String> name(v8::String::New("(arango)"));
|
ok = true;
|
||||||
v8::Context::Scope contextScope(context);
|
|
||||||
|
|
||||||
ok = true;
|
switch (mode) {
|
||||||
|
|
||||||
switch (mode) {
|
// .............................................................................
|
||||||
|
// run all unit tests
|
||||||
// .............................................................................
|
// .............................................................................
|
||||||
// run all unit tests
|
|
||||||
// .............................................................................
|
|
||||||
|
|
||||||
case MODE_UNITTESTS: {
|
|
||||||
v8::HandleScope scope;
|
|
||||||
v8::TryCatch tryCatch;
|
|
||||||
|
|
||||||
// set-up unit tests array
|
|
||||||
v8::Handle<v8::Array> sysTestFiles = v8::Array::New();
|
|
||||||
|
|
||||||
for (size_t i = 0; i < _unitTests.size(); ++i) {
|
|
||||||
sysTestFiles->Set((uint32_t) i, v8::String::New(_unitTests[i].c_str()));
|
|
||||||
}
|
|
||||||
|
|
||||||
context->Global()->Set(v8::String::New("SYS_UNIT_TESTS"), sysTestFiles);
|
|
||||||
context->Global()->Set(v8::String::New("SYS_UNIT_TESTS_RESULT"), v8::True());
|
|
||||||
|
|
||||||
// run tests
|
|
||||||
char const* input = "require(\"jsunity\").runCommandLineTests();";
|
|
||||||
TRI_ExecuteJavaScriptString(context, v8::String::New(input), name, true);
|
|
||||||
|
|
||||||
if (tryCatch.HasCaught()) {
|
|
||||||
cout << TRI_StringifyV8Exception(&tryCatch);
|
|
||||||
ok = false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ok = TRI_ObjectToBoolean(context->Global()->Get(v8::String::New("SYS_UNIT_TESTS_RESULT")));
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// .............................................................................
|
|
||||||
// run jslint
|
|
||||||
// .............................................................................
|
|
||||||
|
|
||||||
case MODE_JSLINT: {
|
|
||||||
v8::HandleScope scope;
|
|
||||||
v8::TryCatch tryCatch;
|
|
||||||
|
|
||||||
// set-up tests files array
|
|
||||||
v8::Handle<v8::Array> sysTestFiles = v8::Array::New();
|
|
||||||
for (size_t i = 0; i < _jslint.size(); ++i) {
|
|
||||||
sysTestFiles->Set((uint32_t) i, v8::String::New(_jslint[i].c_str()));
|
|
||||||
}
|
|
||||||
|
|
||||||
context->Global()->Set(v8::String::New("SYS_UNIT_TESTS"), sysTestFiles);
|
|
||||||
context->Global()->Set(v8::String::New("SYS_UNIT_TESTS_RESULT"), v8::True());
|
|
||||||
|
|
||||||
char const* input = "require(\"jslint\").runCommandLineTests({ });";
|
|
||||||
TRI_ExecuteJavaScriptString(context, v8::String::New(input), name, true);
|
|
||||||
|
|
||||||
if (tryCatch.HasCaught()) {
|
|
||||||
cout << TRI_StringifyV8Exception(&tryCatch);
|
|
||||||
ok = false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ok = TRI_ObjectToBoolean(context->Global()->Get(v8::String::New("SYS_UNIT_TESTS_RESULT")));
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// .............................................................................
|
|
||||||
// run console
|
|
||||||
// .............................................................................
|
|
||||||
|
|
||||||
case MODE_CONSOLE: {
|
|
||||||
// run a shell
|
|
||||||
V8LineEditor* console = new V8LineEditor(context, ".arango");
|
|
||||||
|
|
||||||
console->open(true);
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
while(! v8::V8::IdleNotification()) {
|
|
||||||
}
|
|
||||||
|
|
||||||
char* input = console->prompt("arangod> ");
|
|
||||||
|
|
||||||
if (input == 0) {
|
|
||||||
printf("<ctrl-D>\nBye Bye! Auf Wiedersehen! До свидания! さようなら\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*input == '\0') {
|
|
||||||
TRI_FreeString(TRI_CORE_MEM_ZONE, input);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
console->addHistory(input);
|
|
||||||
|
|
||||||
|
case MODE_UNITTESTS: {
|
||||||
v8::HandleScope scope;
|
v8::HandleScope scope;
|
||||||
v8::TryCatch tryCatch;
|
v8::TryCatch tryCatch;
|
||||||
|
|
||||||
TRI_ExecuteJavaScriptString(context, v8::String::New(input), name, true);
|
// set-up unit tests array
|
||||||
TRI_FreeString(TRI_UNKNOWN_MEM_ZONE, input);
|
v8::Handle<v8::Array> sysTestFiles = v8::Array::New();
|
||||||
|
|
||||||
|
for (size_t i = 0; i < _unitTests.size(); ++i) {
|
||||||
|
sysTestFiles->Set((uint32_t) i, v8::String::New(_unitTests[i].c_str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
context->_context->Global()->Set(v8::String::New("SYS_UNIT_TESTS"), sysTestFiles);
|
||||||
|
context->_context->Global()->Set(v8::String::New("SYS_UNIT_TESTS_RESULT"), v8::True());
|
||||||
|
|
||||||
|
// run tests
|
||||||
|
char const* input = "require(\"jsunity\").runCommandLineTests();";
|
||||||
|
TRI_ExecuteJavaScriptString(context->_context, v8::String::New(input), name, true);
|
||||||
|
|
||||||
if (tryCatch.HasCaught()) {
|
if (tryCatch.HasCaught()) {
|
||||||
cout << TRI_StringifyV8Exception(&tryCatch);
|
cout << TRI_StringifyV8Exception(&tryCatch);
|
||||||
|
ok = false;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
ok = TRI_ObjectToBoolean(context->_context->Global()->Get(v8::String::New("SYS_UNIT_TESTS_RESULT")));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
console->close();
|
// .............................................................................
|
||||||
|
// run jslint
|
||||||
|
// .............................................................................
|
||||||
|
|
||||||
delete console;
|
case MODE_JSLINT: {
|
||||||
|
v8::HandleScope scope;
|
||||||
|
v8::TryCatch tryCatch;
|
||||||
|
|
||||||
break;
|
// set-up tests files array
|
||||||
|
v8::Handle<v8::Array> sysTestFiles = v8::Array::New();
|
||||||
|
|
||||||
|
for (size_t i = 0; i < _jslint.size(); ++i) {
|
||||||
|
sysTestFiles->Set((uint32_t) i, v8::String::New(_jslint[i].c_str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
context->_context->Global()->Set(v8::String::New("SYS_UNIT_TESTS"), sysTestFiles);
|
||||||
|
context->_context->Global()->Set(v8::String::New("SYS_UNIT_TESTS_RESULT"), v8::True());
|
||||||
|
|
||||||
|
char const* input = "require(\"jslint\").runCommandLineTests({ });";
|
||||||
|
TRI_ExecuteJavaScriptString(context->_context, v8::String::New(input), name, true);
|
||||||
|
|
||||||
|
if (tryCatch.HasCaught()) {
|
||||||
|
cout << TRI_StringifyV8Exception(&tryCatch);
|
||||||
|
ok = false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ok = TRI_ObjectToBoolean(context->_context->Global()->Get(v8::String::New("SYS_UNIT_TESTS_RESULT")));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// .............................................................................
|
||||||
|
// run console
|
||||||
|
// .............................................................................
|
||||||
|
|
||||||
|
case MODE_CONSOLE: {
|
||||||
|
// run a shell
|
||||||
|
V8LineEditor* console = new V8LineEditor(context->_context, ".arango");
|
||||||
|
|
||||||
|
console->open(true);
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
while(! v8::V8::IdleNotification()) {
|
||||||
|
}
|
||||||
|
|
||||||
|
char* input = console->prompt("arangod> ");
|
||||||
|
|
||||||
|
if (input == 0) {
|
||||||
|
printf("<ctrl-D>\nBye Bye! Auf Wiedersehen! До свидания! さようなら\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*input == '\0') {
|
||||||
|
TRI_FreeString(TRI_CORE_MEM_ZONE, input);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
console->addHistory(input);
|
||||||
|
|
||||||
|
v8::HandleScope scope;
|
||||||
|
v8::TryCatch tryCatch;
|
||||||
|
|
||||||
|
TRI_ExecuteJavaScriptString(context->_context, v8::String::New(input), name, true);
|
||||||
|
TRI_FreeString(TRI_UNKNOWN_MEM_ZONE, input);
|
||||||
|
|
||||||
|
if (tryCatch.HasCaught()) {
|
||||||
|
cout << TRI_StringifyV8Exception(&tryCatch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console->close();
|
||||||
|
|
||||||
|
delete console;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// and return from the context and isolate
|
|
||||||
context->Exit();
|
|
||||||
isolate->Exit();
|
|
||||||
|
|
||||||
if (v8g) {
|
// .............................................................................
|
||||||
delete v8g;
|
// and return from the context and isolate
|
||||||
}
|
// .............................................................................
|
||||||
|
|
||||||
|
_applicationV8->exitContext(context);
|
||||||
|
|
||||||
|
_applicationV8->beginShutdown();
|
||||||
|
_applicationV8->shutdown();
|
||||||
|
|
||||||
// close the database
|
// close the database
|
||||||
closeDatabase();
|
closeDatabase();
|
||||||
Random::shutdown();
|
Random::shutdown();
|
||||||
|
|
||||||
return ok ? EXIT_SUCCESS : EXIT_FAILURE;
|
return ok ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -298,6 +298,14 @@ void ApplicationV8::collectGarbage () {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief disables actions
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void ApplicationV8::disableActions () {
|
||||||
|
_actionPath.clear();
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @}
|
/// @}
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -356,9 +364,6 @@ bool ApplicationV8::prepare () {
|
||||||
|
|
||||||
_actionLoader.setDirectory(_actionPath);
|
_actionLoader.setDirectory(_actionPath);
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
LOGGER_INFO << "actions are disabled, empty system action path";
|
|
||||||
}
|
|
||||||
|
|
||||||
// setup instances
|
// setup instances
|
||||||
_contexts = new V8Context*[_nrInstances];
|
_contexts = new V8Context*[_nrInstances];
|
||||||
|
@ -472,7 +477,11 @@ bool ApplicationV8::prepareV8Instance (size_t i) {
|
||||||
|
|
||||||
TRI_InitV8VocBridge(context->_context, _vocbase);
|
TRI_InitV8VocBridge(context->_context, _vocbase);
|
||||||
TRI_InitV8Queries(context->_context);
|
TRI_InitV8Queries(context->_context);
|
||||||
TRI_InitV8Actions(context->_context, this);
|
|
||||||
|
if (! _actionPath.empty()) {
|
||||||
|
TRI_InitV8Actions(context->_context, this);
|
||||||
|
}
|
||||||
|
|
||||||
TRI_InitV8Conversions(context->_context);
|
TRI_InitV8Conversions(context->_context);
|
||||||
TRI_InitV8Utils(context->_context, _startupModules);
|
TRI_InitV8Utils(context->_context, _startupModules);
|
||||||
TRI_InitV8Shell(context->_context);
|
TRI_InitV8Shell(context->_context);
|
||||||
|
@ -493,10 +502,7 @@ bool ApplicationV8::prepareV8Instance (size_t i) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// load all actions
|
// load all actions
|
||||||
if (_actionPath.empty()) {
|
if (! _actionPath.empty()) {
|
||||||
LOGGER_WARNING << "no action path has been defined";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
bool ok = _actionLoader.executeAllScripts(context->_context);
|
bool ok = _actionLoader.executeAllScripts(context->_context);
|
||||||
|
|
||||||
if (! ok) {
|
if (! ok) {
|
||||||
|
|
|
@ -164,6 +164,12 @@ namespace triagens {
|
||||||
|
|
||||||
void collectGarbage ();
|
void collectGarbage ();
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief disables actions
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void disableActions ();
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @}
|
/// @}
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
Loading…
Reference in New Issue