mirror of https://gitee.com/bigwinds/arangodb
Merge remote-tracking branch 'origin/devel' into sharding
Conflicts: arangod/VocBase/document-collection.c arangosh/CMakeLists.txt js/apps/system/aardvark/test/karma/karma.conf.js
This commit is contained in:
commit
015ab56259
|
@ -1,6 +1,6 @@
|
||||||
language: c
|
language: c
|
||||||
before_script: "bash -c 'cd UnitTests/HttpInterface && gem install bundler && bundle'"
|
before_script: "bash -c Installation/travisCI/before_script.sh"
|
||||||
script: "make setup && ./configure --enable-relative --enable-all-in-one-libev --enable-all-in-one-v8 --enable-all-in-one-icu && make -j2 && make unittests-shell-server unittests-shell-server-ahuacatl unittests-http-server SKIP_RANGES=1 && echo 'done'"
|
script: "bash -c Installation/travisCI/script.sh"
|
||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
- master
|
- master
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
v1.5.0 (XXXX-XX-XX)
|
v1.5.0 (XXXX-XX-XX)
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
|
* added AQL SLICE function to extract slices from lists
|
||||||
|
|
||||||
|
* removed check-server binary
|
||||||
|
|
||||||
* made module loader more node compatible
|
* made module loader more node compatible
|
||||||
|
|
||||||
* the startup option `--javascript.package-path` for arangosh is now deprecated and does
|
* the startup option `--javascript.package-path` for arangosh is now deprecated and does
|
||||||
|
|
|
@ -37,7 +37,6 @@ set(BIN_ARANGOIMP arangoimp)
|
||||||
set(BIN_ARANGOIRB arangoirb)
|
set(BIN_ARANGOIRB arangoirb)
|
||||||
set(BIN_ARANGORESTORE arangorestore)
|
set(BIN_ARANGORESTORE arangorestore)
|
||||||
set(BIN_ARANGOSH arangosh)
|
set(BIN_ARANGOSH arangosh)
|
||||||
set(BIN_CHECK_SERVER check-server)
|
|
||||||
|
|
||||||
set(SCRIPT_ARANGO_DFDB arango-dfdb)
|
set(SCRIPT_ARANGO_DFDB arango-dfdb)
|
||||||
set(SCRIPT_FOXX_MANAGER foxx-manager)
|
set(SCRIPT_FOXX_MANAGER foxx-manager)
|
||||||
|
|
|
@ -1113,6 +1113,35 @@ AQL supports the following functions to operate on list values:
|
||||||
position only `true` or `false` are returned, depending on whether the sought element
|
position only `true` or `false` are returned, depending on whether the sought element
|
||||||
is contained in the list.
|
is contained in the list.
|
||||||
|
|
||||||
|
- @FN{SLICE(@FA{list}, @FA{start}, @FA{length})}: extracts a slice of the list specified
|
||||||
|
by @FA{list}. The extraction will start at list element with position @FA{start}.
|
||||||
|
Positions start at 0. Up to @FA{length} elements will be extracted. If @FA{length} is
|
||||||
|
not specified, all list elements starting at @FA{start} will be returned.
|
||||||
|
If @FA{start} is negative, it can be used to indicate positions from the end of the
|
||||||
|
list.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
SLICE([ 1, 2, 3, 4, 5 ], 0, 1)
|
||||||
|
|
||||||
|
will return `[ 1 ]`
|
||||||
|
|
||||||
|
SLICE([ 1, 2, 3, 4, 5 ], 1, 2)
|
||||||
|
|
||||||
|
will return `[ 2, 3 ]`
|
||||||
|
|
||||||
|
SLICE([ 1, 2, 3, 4, 5 ], 3)
|
||||||
|
|
||||||
|
will return `[ 4, 5 ]`
|
||||||
|
|
||||||
|
SLICE([ 1, 2, 3, 4, 5 ], 1, -1)
|
||||||
|
|
||||||
|
will return `[ 2, 3, 4 ]`
|
||||||
|
|
||||||
|
SLICE([ 1, 2, 3, 4, 5 ], 0, -2)
|
||||||
|
|
||||||
|
will return `[ 1, 2, 3 ]`
|
||||||
|
|
||||||
- @FN{UNIQUE(@FA{list})}: returns all unique elements in @FA{list}. To determine
|
- @FN{UNIQUE(@FA{list})}: returns all unique elements in @FA{list}. To determine
|
||||||
uniqueness, the function will use the comparison order defined in @ref AqlTypeOrder.
|
uniqueness, the function will use the comparison order defined in @ref AqlTypeOrder.
|
||||||
Calling this function might return the unique elements in any order.
|
Calling this function might return the unique elements in any order.
|
||||||
|
@ -1125,12 +1154,14 @@ AQL supports the following functions to operate on list values:
|
||||||
@LIT{UNION_DISTINCT} function or apply the @LIT{UNIQUE} on the result of @LIT{union}.
|
@LIT{UNION_DISTINCT} function or apply the @LIT{UNIQUE} on the result of @LIT{union}.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
RETURN UNION(
|
RETURN UNION(
|
||||||
[ 1, 2, 3 ],
|
[ 1, 2, 3 ],
|
||||||
[ 1, 2 ]
|
[ 1, 2 ]
|
||||||
)
|
)
|
||||||
|
|
||||||
will produce:
|
will produce:
|
||||||
|
|
||||||
[ [ 1, 2, 3, 1, 2 ] ]
|
[ [ 1, 2, 3, 1, 2 ] ]
|
||||||
|
|
||||||
with duplicate removal:
|
with duplicate removal:
|
||||||
|
@ -1143,6 +1174,7 @@ AQL supports the following functions to operate on list values:
|
||||||
)
|
)
|
||||||
|
|
||||||
will produce:
|
will produce:
|
||||||
|
|
||||||
[ [ 1, 2, 3 ] ]
|
[ [ 1, 2, 3 ] ]
|
||||||
|
|
||||||
- @FN{UNION_DISTINCT(@FA{list1, list2, ...})}: returns the union of distinct values of
|
- @FN{UNION_DISTINCT(@FA{list1, list2, ...})}: returns the union of distinct values of
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
d='UnitTests/HttpInterface'
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "$0: switching into ${d}"
|
||||||
|
cd "${d}" || exit 1
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "$0: installing bundler"
|
||||||
|
gem install bundler || exit 1
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "$0: executing bundle"
|
||||||
|
bundle || exit 1
|
|
@ -0,0 +1,29 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo '$0: setup make-system'
|
||||||
|
|
||||||
|
make setup || exit 1
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "$0: configuring ArangoDB"
|
||||||
|
|
||||||
|
./configure \
|
||||||
|
--enable-relative \
|
||||||
|
--enable-all-in-one-libev \
|
||||||
|
--enable-all-in-one-v8 \
|
||||||
|
--enable-all-in-one-icu \
|
||||||
|
|| exit 1
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "$0: compiling ArangoDB"
|
||||||
|
|
||||||
|
make -j2 || exit 1
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "$0: testing ArangoDB"
|
||||||
|
|
||||||
|
make unittests-shell-server unittests-shell-server-ahuacatl unittests-http-server SKIP_RANGES=1 || exit 1
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "$0: done"
|
|
@ -198,6 +198,12 @@ endif
|
||||||
sbin_PROGRAMS = \
|
sbin_PROGRAMS = \
|
||||||
bin/arangod
|
bin/arangod
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
### @brief helper programs
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
noinst_bin =
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
### @brief /sbin scripts
|
### @brief /sbin scripts
|
||||||
################################################################################
|
################################################################################
|
||||||
|
@ -208,8 +214,7 @@ bin_SCRIPTS =
|
||||||
### @brief uninstalled programs
|
### @brief uninstalled programs
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
noinst_PROGRAMS = \
|
noinst_PROGRAMS =
|
||||||
bin/check-server
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
### @brief /etc data
|
### @brief /etc data
|
||||||
|
|
|
@ -675,6 +675,8 @@ TRI_associative_pointer_t* TRI_CreateFunctionsAql (void) {
|
||||||
REGISTER_FUNCTION("STDDEV_SAMPLE", "STDDEV_SAMPLE", true, true, "l", NULL);
|
REGISTER_FUNCTION("STDDEV_SAMPLE", "STDDEV_SAMPLE", true, true, "l", NULL);
|
||||||
REGISTER_FUNCTION("STDDEV_POPULATION", "STDDEV_POPULATION", true, true, "l", NULL);
|
REGISTER_FUNCTION("STDDEV_POPULATION", "STDDEV_POPULATION", true, true, "l", NULL);
|
||||||
REGISTER_FUNCTION("UNIQUE", "UNIQUE", true, false, "l", NULL);
|
REGISTER_FUNCTION("UNIQUE", "UNIQUE", true, false, "l", NULL);
|
||||||
|
REGISTER_FUNCTION("SLICE", "SLICE", true, false, "l,n|n", NULL);
|
||||||
|
|
||||||
// note: REVERSE() can be applied on strings, too
|
// note: REVERSE() can be applied on strings, too
|
||||||
REGISTER_FUNCTION("REVERSE", "REVERSE", true, false, "ls", NULL);
|
REGISTER_FUNCTION("REVERSE", "REVERSE", true, false, "ls", NULL);
|
||||||
REGISTER_FUNCTION("FIRST", "FIRST", true, false, "l", NULL);
|
REGISTER_FUNCTION("FIRST", "FIRST", true, false, "l", NULL);
|
||||||
|
|
|
@ -230,28 +230,6 @@ install(
|
||||||
REGEX "^.*/common/tests$" EXCLUDE
|
REGEX "^.*/common/tests$" EXCLUDE
|
||||||
REGEX "^.*/client/tests$" EXCLUDE)
|
REGEX "^.*/client/tests$" EXCLUDE)
|
||||||
|
|
||||||
################################################################################
|
|
||||||
### @brief check-server
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
add_executable(
|
|
||||||
${BIN_CHECK_SERVER}
|
|
||||||
V8Client/V8ClientConnection.cpp
|
|
||||||
V8Client/check-server.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
target_link_libraries(
|
|
||||||
${BIN_CHECK_SERVER}
|
|
||||||
${LIB_ARANGO_V8}
|
|
||||||
${LIB_ARANGO_CLIENT}
|
|
||||||
${LIB_ARANGO}
|
|
||||||
${V8_LIBS}
|
|
||||||
${ICU_LIBS}
|
|
||||||
${ZLIB_LIBS}
|
|
||||||
${OPENSSL_LIBS}
|
|
||||||
${MSVC_LIBS}
|
|
||||||
)
|
|
||||||
|
|
||||||
## -----------------------------------------------------------------------------
|
## -----------------------------------------------------------------------------
|
||||||
## --SECTION-- END-OF-FILE
|
## --SECTION-- END-OF-FILE
|
||||||
## -----------------------------------------------------------------------------
|
## -----------------------------------------------------------------------------
|
||||||
|
|
|
@ -103,25 +103,6 @@ bin_arangosh_SOURCES = \
|
||||||
arangosh/V8Client/V8ClientConnection.cpp \
|
arangosh/V8Client/V8ClientConnection.cpp \
|
||||||
arangosh/V8Client/arangosh.cpp
|
arangosh/V8Client/arangosh.cpp
|
||||||
|
|
||||||
################################################################################
|
|
||||||
### @brief program "check-server"
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
bin_check_server_CPPFLAGS = \
|
|
||||||
-I@top_srcdir@/arangosh \
|
|
||||||
$(AM_CPPFLAGS)
|
|
||||||
|
|
||||||
bin_check_server_LDADD = \
|
|
||||||
lib/libarango_v8.a \
|
|
||||||
lib/libarango_client.a \
|
|
||||||
lib/libarango.a \
|
|
||||||
$(LIBS) \
|
|
||||||
@V8_LIBS@
|
|
||||||
|
|
||||||
bin_check_server_SOURCES = \
|
|
||||||
arangosh/V8Client/V8ClientConnection.cpp \
|
|
||||||
arangosh/V8Client/check-server.cpp
|
|
||||||
|
|
||||||
## -----------------------------------------------------------------------------
|
## -----------------------------------------------------------------------------
|
||||||
## --SECTION-- END-OF-FILE
|
## --SECTION-- END-OF-FILE
|
||||||
## -----------------------------------------------------------------------------
|
## -----------------------------------------------------------------------------
|
||||||
|
|
|
@ -1,233 +0,0 @@
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
/// @brief checks server is alive and answering requests
|
|
||||||
///
|
|
||||||
/// @file
|
|
||||||
///
|
|
||||||
/// DISCLAIMER
|
|
||||||
///
|
|
||||||
/// Copyright 2004-2013 triAGENS GmbH, Cologne, Germany
|
|
||||||
///
|
|
||||||
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
/// you may not use this file except in compliance with the License.
|
|
||||||
/// You may obtain a copy of the License at
|
|
||||||
///
|
|
||||||
/// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
///
|
|
||||||
/// Unless required by applicable law or agreed to in writing, software
|
|
||||||
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
/// See the License for the specific language governing permissions and
|
|
||||||
/// limitations under the License.
|
|
||||||
///
|
|
||||||
/// Copyright holder is triAGENS GmbH, Cologne, Germany
|
|
||||||
///
|
|
||||||
/// @author Dr. Frank Celler
|
|
||||||
/// @author Copyright 2013, triAGENS GmbH, Cologne, Germany
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include "BasicsC/common.h"
|
|
||||||
|
|
||||||
#include "ArangoShell/ArangoClient.h"
|
|
||||||
#include "BasicsC/init.h"
|
|
||||||
#include "BasicsC/logging.h"
|
|
||||||
#include "Rest/InitialiseRest.h"
|
|
||||||
#include "V8Client/V8ClientConnection.h"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace triagens::basics;
|
|
||||||
using namespace triagens::rest;
|
|
||||||
using namespace triagens::httpclient;
|
|
||||||
using namespace triagens::v8client;
|
|
||||||
using namespace triagens::arango;
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
// --SECTION-- private functions
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
/// @brief exit function
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
|
|
||||||
static void checkserverExitFunction (int exitCode, void* data) {
|
|
||||||
int res = 0;
|
|
||||||
|
|
||||||
// ...........................................................................
|
|
||||||
// TODO: need a terminate function for windows to be called and cleanup
|
|
||||||
// any windows specific stuff.
|
|
||||||
// ...........................................................................
|
|
||||||
|
|
||||||
res = finaliseWindows(TRI_WIN_FINAL_WSASTARTUP_FUNCTION_CALL, 0);
|
|
||||||
|
|
||||||
if (res != 0) {
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
exit(exitCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
static void checkserverExitFunction (int exitCode, void* data) {
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
/// @brief startup function
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
|
|
||||||
static void checkserverEntryFunction () {
|
|
||||||
int maxOpenFiles = 1024;
|
|
||||||
int res = 0;
|
|
||||||
|
|
||||||
// ...........................................................................
|
|
||||||
// Uncomment this to call this for extended debug information.
|
|
||||||
// If you familiar with valgrind ... then this is not like that, however
|
|
||||||
// you do get some similar functionality.
|
|
||||||
// ...........................................................................
|
|
||||||
//res = initialiseWindows(TRI_WIN_INITIAL_SET_DEBUG_FLAG, 0);
|
|
||||||
|
|
||||||
res = initialiseWindows(TRI_WIN_INITIAL_SET_INVALID_HANLE_HANDLER, 0);
|
|
||||||
|
|
||||||
if (res != 0) {
|
|
||||||
_exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
res = initialiseWindows(TRI_WIN_INITIAL_SET_MAX_STD_IO,(const char*)(&maxOpenFiles));
|
|
||||||
|
|
||||||
if (res != 0) {
|
|
||||||
_exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
res = initialiseWindows(TRI_WIN_INITIAL_WSASTARTUP_FUNCTION_CALL, 0);
|
|
||||||
|
|
||||||
if (res != 0) {
|
|
||||||
_exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
TRI_Application_Exit_SetExit(checkserverExitFunction);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
static void checkserverEntryFunction () {
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
/// @brief return a new client connection instance
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
static V8ClientConnection* CreateConnection (Endpoint* endpoint) {
|
|
||||||
return new V8ClientConnection(endpoint,
|
|
||||||
"_system", // database
|
|
||||||
"", // user
|
|
||||||
"", //
|
|
||||||
300, // request timeout
|
|
||||||
3, // connection timeout
|
|
||||||
3, // retries
|
|
||||||
false,
|
|
||||||
0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
// --SECTION-- public functions
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
/// @brief main
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
int main (int argc, char* argv[]) {
|
|
||||||
int ret = EXIT_SUCCESS;
|
|
||||||
|
|
||||||
checkserverEntryFunction();
|
|
||||||
|
|
||||||
TRIAGENS_C_INITIALISE(argc, argv);
|
|
||||||
TRIAGENS_REST_INITIALISE(argc, argv);
|
|
||||||
|
|
||||||
TRI_InitialiseLogging(false);
|
|
||||||
|
|
||||||
if (4 < argc || argc < 2) {
|
|
||||||
cerr << "usage: " << argv[0] << " <endpoint> [<retries> [start|stop]]" << endl;
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
int loop = 1;
|
|
||||||
bool start = true;
|
|
||||||
|
|
||||||
if (2 < argc) {
|
|
||||||
loop = StringUtils::int32(argv[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (3 < argc) {
|
|
||||||
if (strcmp(argv[3], "stop") == 0) {
|
|
||||||
start = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* endpointString = argv[1];
|
|
||||||
Endpoint* endpoint = Endpoint::clientFactory(endpointString);
|
|
||||||
|
|
||||||
if (endpoint != 0) {
|
|
||||||
bool connected = false;
|
|
||||||
bool waitFor = start;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
do {
|
|
||||||
V8ClientConnection* connection = CreateConnection(endpoint);
|
|
||||||
|
|
||||||
if (connection->isConnected() && connection->getLastHttpReturnCode() == HttpResponse::OK) {
|
|
||||||
cout << "version: " << connection->getVersion() << endl;
|
|
||||||
connected = true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
cout << "cannot connect to '" << endpointString << "'" << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
delete connection;
|
|
||||||
|
|
||||||
i++;
|
|
||||||
|
|
||||||
if (waitFor != connected && i < loop) {
|
|
||||||
sleep(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (waitFor != connected && i < loop);
|
|
||||||
|
|
||||||
if (connected != waitFor) {
|
|
||||||
if (start) {
|
|
||||||
cout << "server '" << endpointString << "' failed to start" << endl;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
cout << "server '" << endpointString << "' failed to stop" << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
cout << "cannot parse endpoint definition '" << endpointString << "'" << endl;
|
|
||||||
ret = EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
TRIAGENS_REST_SHUTDOWN;
|
|
||||||
|
|
||||||
checkserverExitFunction(ret, NULL);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
// --SECTION-- END-OF-FILE
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Local Variables:
|
|
||||||
// mode: outline-minor
|
|
||||||
// outline-regexp: "/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|/// @page\\|// --SECTION--\\|/// @\\}"
|
|
||||||
// End:
|
|
|
@ -76,6 +76,11 @@ var users = require("org/arangodb/users");
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
function get_api_user (req, res) {
|
function get_api_user (req, res) {
|
||||||
|
if (req.suffix.length === 0) {
|
||||||
|
actions.resultOk(req, res, actions.HTTP_OK, users.all());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (req.suffix.length !== 1) {
|
if (req.suffix.length !== 1) {
|
||||||
actions.resultBad(req, res, arangodb.ERROR_HTTP_BAD_PARAMETER);
|
actions.resultBad(req, res, arangodb.ERROR_HTTP_BAD_PARAMETER);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -202,3 +202,64 @@ li a [class^="icon_arangodb"], li a [class*=" icon_arangodb"] {
|
||||||
font-size: 23px;
|
font-size: 23px;
|
||||||
color: #736B68;
|
color: #736B68;
|
||||||
}
|
}
|
||||||
|
/*copy to scss*/
|
||||||
|
.fixedDropdown {
|
||||||
|
margin: 34px 0 0 0 !important;
|
||||||
|
border-radius: 0 !important;
|
||||||
|
width: 210px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fixedDropdown:after {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fixedDropdown .dropdown-item {
|
||||||
|
border-bottom: 1px solid rgba(0, 0, 0, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.fixedDropdown .dropdown-header {
|
||||||
|
border-bottom: 1px solid rgba(0, 0, 0, 0.2);
|
||||||
|
padding: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fixedDropdown a {
|
||||||
|
padding-left: 5px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fixedDropdown .notificationItemContent {
|
||||||
|
width: 170px;
|
||||||
|
float: left;
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fixedDropdown button {
|
||||||
|
float:right;
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.innerDropdownInnerUL {
|
||||||
|
min-height: 220px;
|
||||||
|
height: 220px !important;
|
||||||
|
width: 100%;
|
||||||
|
overflow-y: scroll;
|
||||||
|
overflow-x: hidden;
|
||||||
|
float: left;
|
||||||
|
border-bottom: 1px solid rgba(0, 0, 0, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.innerDropdownInnerUL li {
|
||||||
|
width: auto !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.innerDropdownInnerUL li:last-child {
|
||||||
|
color: red;
|
||||||
|
border-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fixedDropdown .notificationItem {
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notificationItem i {
|
||||||
|
float:left;
|
||||||
|
}
|
||||||
|
|
|
@ -61,3 +61,6 @@ body, input, textarea, .page-title span, .pingback a.url {
|
||||||
margin-right: 15px;
|
margin-right: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.fixedDropdown {
|
||||||
|
margin: 34px 0 0 !important;
|
||||||
|
}
|
||||||
|
|
|
@ -3,6 +3,10 @@
|
||||||
<div class="resizecontainer">
|
<div class="resizecontainer">
|
||||||
<div class="navlogo">
|
<div class="navlogo">
|
||||||
<a class="logo" href="#"><img src="img/logo_arangodb_white.png"/></a>
|
<a class="logo" href="#"><img src="img/logo_arangodb_white.png"/></a>
|
||||||
|
</div>
|
||||||
|
<div class="statmenu" id="statisticBar">
|
||||||
|
</div>
|
||||||
|
<div class="usermenu" id="userBar" style="float:right;">
|
||||||
</div>
|
</div>
|
||||||
<div class="navmenu" id="navigationBar">
|
<div class="navmenu" id="navigationBar">
|
||||||
</div>
|
</div>
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 982 B |
Binary file not shown.
After Width: | Height: | Size: 3.7 KiB |
Binary file not shown.
After Width: | Height: | Size: 3.8 KiB |
Binary file not shown.
After Width: | Height: | Size: 3.8 KiB |
|
@ -101,49 +101,12 @@
|
||||||
return returnVal;
|
return returnVal;
|
||||||
},
|
},
|
||||||
|
|
||||||
removeNotifications: function () {
|
arangoNotification: function (message) {
|
||||||
$.gritter.removeAll();
|
|
||||||
this.lastNotificationMessage = null;
|
|
||||||
},
|
},
|
||||||
arangoNotification: function (message, time) {
|
|
||||||
var returnVal = false;
|
|
||||||
$.gritter.add({
|
|
||||||
title: "Notice:",
|
|
||||||
text: message,
|
|
||||||
time: time || 3000,
|
|
||||||
before_open: function(){
|
|
||||||
returnVal = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.lastNotificationMessage = null;
|
|
||||||
|
|
||||||
return returnVal;
|
|
||||||
},
|
|
||||||
arangoError: function (message) {
|
arangoError: function (message) {
|
||||||
var returnVal = false;
|
|
||||||
$.gritter.add({
|
|
||||||
title: "Error:",
|
|
||||||
text: message,
|
|
||||||
sticky: true,
|
|
||||||
before_open: function(){
|
|
||||||
if (this.lastNotificationMessage === message) {
|
|
||||||
// prevent display the same message over & over
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if($('.gritter-item-wrapper').length === 3) {
|
|
||||||
// not more than 3 messages at once
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
this.lastNotificationMessage = message;
|
|
||||||
returnVal = true;
|
|
||||||
},
|
|
||||||
before_close: function(){
|
|
||||||
// reset last text when closing a specific message
|
|
||||||
this.lastNotificationMessage = null;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return returnVal;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
getRandomToken: function () {
|
getRandomToken: function () {
|
||||||
return Math.round(new Date().getTime());
|
return Math.round(new Date().getTime());
|
||||||
},
|
},
|
||||||
|
|
|
@ -11,7 +11,7 @@ window.ArangoUsers = Backbone.Collection.extend({
|
||||||
"testing": true
|
"testing": true
|
||||||
},
|
},
|
||||||
|
|
||||||
url: "../api/user",
|
url: "/_api/user",
|
||||||
|
|
||||||
initialize: function() {
|
initialize: function() {
|
||||||
//check cookies / local storage
|
//check cookies / local storage
|
||||||
|
|
|
@ -5,10 +5,12 @@
|
||||||
|
|
||||||
window.Notification = Backbone.Model.extend({
|
window.Notification = Backbone.Model.extend({
|
||||||
defaults: {
|
defaults: {
|
||||||
"title": "",
|
"title" : "",
|
||||||
"content": "",
|
"date" : 0,
|
||||||
"priority": "",
|
"content" : "",
|
||||||
"seen": false
|
"priority" : "",
|
||||||
|
"tags" : "",
|
||||||
|
"seen" : false
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -76,16 +76,11 @@
|
||||||
});
|
});
|
||||||
|
|
||||||
this.foxxList = new window.FoxxCollection();
|
this.foxxList = new window.FoxxCollection();
|
||||||
this.notificationList = new window.NotificationCollection();
|
|
||||||
|
|
||||||
this.footerView = new window.FooterView();
|
this.footerView = new window.FooterView();
|
||||||
this.naviView = new window.NavigationView();
|
this.naviView = new window.NavigationView();
|
||||||
// this.statView = new window.StatisticBarView();
|
|
||||||
// this.userBarView = new window.UserBarView();
|
|
||||||
this.footerView.render();
|
this.footerView.render();
|
||||||
this.naviView.render();
|
this.naviView.render();
|
||||||
// this.statView.render();
|
|
||||||
// this.userBarView.render();
|
|
||||||
this.graphView = new window.GraphView({
|
this.graphView = new window.GraphView({
|
||||||
graphs: this.graphs,
|
graphs: this.graphs,
|
||||||
collection: window.arangoCollectionsStore
|
collection: window.arangoCollectionsStore
|
||||||
|
|
|
@ -1,37 +1,40 @@
|
||||||
<small>
|
<% var appInfos = attributes.app.split(":"); %>
|
||||||
<div class="plain foxxElement">
|
<div class="iconSet">
|
||||||
<% var appInfos = attributes.app.split(":"); %>
|
<span class="icon_arangodb_settings2" alt="Edit collection properties" title="Edit collection properties"></span>
|
||||||
<h5 class="applicationName"><%= appInfos[1] %><%= attributes.isSystem ? " (system)" : "" %><%= appInfos[0] === "dev" ? " (dev)" : ""%></h5>
|
<span class="icon_arangodb_info" title="Show API documentation"></span>
|
||||||
<div class="pull-right">
|
</div>
|
||||||
<span class="icon_arangodb_info ICON" title="Show API documentation"></span>
|
|
||||||
</div>
|
|
||||||
<img src="foxxes/thumbnail/<%=attributes.app %>" alt="icon" class="foxxIcon"/>
|
|
||||||
<p class="foxxDescription">
|
|
||||||
<!--Description: <%=attributes.description %><br /> -->
|
|
||||||
<strong>Mount:</strong> <%=attributes.mount %><br />
|
|
||||||
<strong>Version:</strong> <%=appInfos[2] %><br />
|
|
||||||
<strong>Prefix:</strong> <%=attributes.options && attributes.options.collectionPrefix%><br />
|
|
||||||
|
|
||||||
<!--Git: <a href=<%=attributes.git %>>Repository</a>-->
|
<div class="plain">
|
||||||
</p>
|
<img src="foxxes/thumbnail/<%=attributes.app %>" height="50" width="50" alt="" class="icon">
|
||||||
<%if (attributes.development) {%>
|
<%if (attributes.development) {%>
|
||||||
<span class="badge badge-success loaded badge-foxx">
|
<span class="badge badge-success loaded">
|
||||||
<div class="cornered">
|
<div class="cornered">
|
||||||
development
|
development
|
||||||
</div>
|
</div>
|
||||||
</span>
|
</span>
|
||||||
<%} else if (attributes.active) {%>
|
<%} else if (attributes.active) {%>
|
||||||
<span class="badge badge-success loaded badge-foxx">
|
<span class="badge badge-success loaded">
|
||||||
<div class="cornered">
|
<div class="cornered">
|
||||||
active
|
active
|
||||||
</div>
|
</div>
|
||||||
</span>
|
</span>
|
||||||
<%} else {%>
|
<%} else {%>
|
||||||
<span class="badge badge-success unloaded badge-foxx">
|
<span class="badge badge-success unloaded">
|
||||||
<div class="cornered">
|
<div class="cornered">
|
||||||
inactive
|
inactive
|
||||||
</div>
|
</div>
|
||||||
</span>
|
</span>
|
||||||
<%}%>
|
<%}%>
|
||||||
</div>
|
<h5 class="collectionName"><%= appInfos[1] %><%= attributes.isSystem ? " (system)" : "" %><%= appInfos[0] === "dev" ? " (dev)" : ""%></h5>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<small>
|
||||||
|
Description: <%=attributes.description %><br />
|
||||||
|
<strong>Mount:</strong> <%=attributes.mount %><br />
|
||||||
|
<strong>Version:</strong> <%=appInfos[2] %><br />
|
||||||
|
<strong>Prefix:</strong> <%=attributes.options && attributes.options.collectionPrefix%><br />
|
||||||
|
|
||||||
|
Git: <a href=<%=attributes.git %>>Repository</a>
|
||||||
</small>
|
</small>
|
||||||
|
-->
|
||||||
|
|
|
@ -1,3 +1,19 @@
|
||||||
|
<div class="iconSet">
|
||||||
|
<span id="editCollection" class="icon_arangodb_settings2" alt="Edit collection properties" title="Edit collection properties"></span>
|
||||||
|
<% if(attributes.status === "loaded") { %>
|
||||||
|
<span class="icon_arangodb_info" title="Show collection properties"></span>
|
||||||
|
<%} else {%>
|
||||||
|
<span class="icon_arangodb_info disabled" alt="disabled"></span>
|
||||||
|
<%}%>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="plain">
|
||||||
|
<img src="<%= attributes.picture %>" height="50" width="50" alt="" class="icon">
|
||||||
|
<span class="badge badge-success <%= attributes.status %>"><div class="cornered"><%= attributes.status %></div></span>
|
||||||
|
<h5 class="collectionName"><%= attributes.name %><%= attributes.isSystem ? " (system)" : "" %></h5>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<small>
|
<small>
|
||||||
<div class="plain">
|
<div class="plain">
|
||||||
<h5 class="applicationName"><%= attributes.name %><%= attributes.isSystem ? " (system)" : "" %></h5>
|
<h5 class="applicationName"><%= attributes.name %><%= attributes.isSystem ? " (system)" : "" %></h5>
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
|
||||||
|
<% var i; for (i=0; i < notifications.length; i++) { %>
|
||||||
|
<li class="dropdown-item">
|
||||||
|
<div class="notificationItem">
|
||||||
|
<a class="notificationItemTitle"><%=notifications[i].attributes.title%></a>
|
||||||
|
<div class="notificationItemContent"><%=notifications[i].attributes.content%></div>
|
||||||
|
<i class="fa fa-times-circle-o"></i>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<% console.log(i); } %>
|
|
@ -1,5 +1,7 @@
|
||||||
<ul class="navlist" id="arangoCollectionUl">
|
<div class="navlogo">
|
||||||
<!-- <li class="statMenu"><a id="stat_cpu" class="tab" href="#dashboard"><img src="img/tmp_dashbord_activity_yellow.jpg"></a></li>
|
<a id="stat_cpu" href="#dashboard" style="padding-left: 5px">
|
||||||
<li class="statMenu"><a id="stat_hd" class="tab" href="#dashboard"><img src="img/tmp_dashbord_activity_green.jpg"></a></li>
|
<img src="img/tmp_dashbord_activity_yellow.jpg">
|
||||||
<li class="statMenu"><a id="stat_ram" class="tab" href="#dashboard"><img src="img/tmp_dashbord_activity_red.jpg"></a></li>-->
|
<img src="img/tmp_dashbord_activity_green.jpg">
|
||||||
</ul>
|
<img height="23"src="img/tmp_dashbord_activity_red.jpg">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
<ul class="navlist" id="userBarUl">
|
||||||
|
|
||||||
|
<div class="navlogo">
|
||||||
|
<a id="stat_hd" class="notificationButton">
|
||||||
|
<img src="img/tmpNotificationCounter.jpg">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<li class="dropdown">
|
||||||
|
<a href="#" class="tab" id="user" >
|
||||||
|
<img src="<%=img%>" id="userimage" height="23" width="23" /> <b class="caret"></b>
|
||||||
|
</a>
|
||||||
|
<ul class="user-dropdown-menu" id="user_dropdown">
|
||||||
|
<li class="dropdown-header"><%=prename%> <%=lastname%></li>
|
||||||
|
<li class="dropdown-item">
|
||||||
|
<a id="user" class="tab" href="#user">User profile</a>
|
||||||
|
</li>
|
||||||
|
<li class="dropdown-item">
|
||||||
|
<a id="user" class="tab" href="#user">User management</a>
|
||||||
|
</li>
|
||||||
|
<li class="dropdown-item">
|
||||||
|
<a id="user" class="tab" href="#user">Logout</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dropdown">
|
||||||
|
<ul class="user-dropdown-menu fixedDropdown" id="notification_menu">
|
||||||
|
<li class="dropdown-header"><a>Notifications</a></li>
|
||||||
|
<ul class="innerDropdownInnerUL">
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<button id="removeAllNotifications" class="btn btn-danger">Clear</button>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
|
@ -131,10 +131,6 @@
|
||||||
}
|
}
|
||||||
var changeResult = window.arangoCollectionsStore.changeCollection(collid, wfs, journalSize);
|
var changeResult = window.arangoCollectionsStore.changeCollection(collid, wfs, journalSize);
|
||||||
|
|
||||||
if (result === true) {
|
|
||||||
arangoHelper.arangoNotification("Collection renamed");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result !== true) {
|
if (result !== true) {
|
||||||
if (result !== undefined) {
|
if (result !== undefined) {
|
||||||
arangoHelper.arangoError("Collection error: " + result);
|
arangoHelper.arangoError("Collection error: " + result);
|
||||||
|
@ -168,14 +164,12 @@
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.hideModal();
|
this.hideModal();
|
||||||
arangoHelper.arangoNotification("Collection renamed");
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
arangoHelper.arangoError("Collection error: " + result2);
|
arangoHelper.arangoError("Collection error: " + result2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
//arangoHelper.arangoNotification("No changes.");
|
|
||||||
this.hideModal();
|
this.hideModal();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -209,10 +203,7 @@
|
||||||
var self = this;
|
var self = this;
|
||||||
var collName = self.myCollection.name;
|
var collName = self.myCollection.name;
|
||||||
var returnval = window.arangoCollectionsStore.deleteCollection(collName);
|
var returnval = window.arangoCollectionsStore.deleteCollection(collName);
|
||||||
if (returnval === true) {
|
if (returnval === false) {
|
||||||
arangoHelper.arangoNotification('Collection deleted successfully.');
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
arangoHelper.arangoError('Could not delete collection.');
|
arangoHelper.arangoError('Could not delete collection.');
|
||||||
}
|
}
|
||||||
self.hideModal();
|
self.hideModal();
|
||||||
|
|
|
@ -105,7 +105,6 @@
|
||||||
self.handleError(err.status, err.statusText, name);
|
self.handleError(err.status, err.statusText, name);
|
||||||
},
|
},
|
||||||
success: function(data) {
|
success: function(data) {
|
||||||
arangoHelper.arangoNotification("Database " + name + " created.");
|
|
||||||
self.hideModal();
|
self.hideModal();
|
||||||
self.updateDatabases();
|
self.updateDatabases();
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,10 +93,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
result = window.arangoDocumentStore.saveDocument(this.colid, this.docid, model);
|
result = window.arangoDocumentStore.saveDocument(this.colid, this.docid, model);
|
||||||
if (result === true) {
|
if (result === false) {
|
||||||
arangoHelper.arangoNotification('Document saved');
|
|
||||||
}
|
|
||||||
else if (result === false) {
|
|
||||||
arangoHelper.arangoError('Document error');
|
arangoHelper.arangoError('Document error');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -104,10 +101,7 @@
|
||||||
editor = ace.edit("sourceEditor");
|
editor = ace.edit("sourceEditor");
|
||||||
model = editor.getValue();
|
model = editor.getValue();
|
||||||
result = window.arangoDocumentStore.saveEdge(this.colid, this.docid, model);
|
result = window.arangoDocumentStore.saveEdge(this.colid, this.docid, model);
|
||||||
if (result === true) {
|
if (result === false) {
|
||||||
arangoHelper.arangoNotification('Edge saved');
|
|
||||||
}
|
|
||||||
else if (result === false) {
|
|
||||||
arangoHelper.arangoError('Edge error');
|
arangoHelper.arangoError('Edge error');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -350,7 +350,6 @@
|
||||||
//Success
|
//Success
|
||||||
if (result !== false) {
|
if (result !== false) {
|
||||||
window.location.hash = "collection/" + result;
|
window.location.hash = "collection/" + result;
|
||||||
arangoHelper.arangoNotification('Document created');
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//Error
|
//Error
|
||||||
|
@ -424,18 +423,16 @@
|
||||||
result = window.arangoDocumentStore.deleteDocument(this.colid, this.docid);
|
result = window.arangoDocumentStore.deleteDocument(this.colid, this.docid);
|
||||||
if (result === true) {
|
if (result === true) {
|
||||||
//on success
|
//on success
|
||||||
arangoHelper.arangoNotification('Document deleted');
|
|
||||||
deleted = true;
|
deleted = true;
|
||||||
}
|
}
|
||||||
else if (result === false) {
|
else if (result === false) {
|
||||||
arangoHelper.arangoError('Could not delete document');
|
arangoHelper.arangoError('Doc error');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (this.type === 'edge') {
|
else if (this.type === 'edge') {
|
||||||
result = window.arangoDocumentStore.deleteEdge(this.colid, this.docid);
|
result = window.arangoDocumentStore.deleteEdge(this.colid, this.docid);
|
||||||
if (result === true) {
|
if (result === true) {
|
||||||
//on success
|
//on success
|
||||||
arangoHelper.arangoNotification('Edge deleted');
|
|
||||||
deleted = true;
|
deleted = true;
|
||||||
}
|
}
|
||||||
else if (result === false) {
|
else if (result === false) {
|
||||||
|
|
|
@ -34,7 +34,6 @@
|
||||||
success: function(data) {
|
success: function(data) {
|
||||||
if (self.isOffline === true) {
|
if (self.isOffline === true) {
|
||||||
self.isOffline = false;
|
self.isOffline = false;
|
||||||
arangoHelper.removeNotifications();
|
|
||||||
if (!self.firstLogin) {
|
if (!self.firstLogin) {
|
||||||
window.setTimeout(function(){
|
window.setTimeout(function(){
|
||||||
arangoHelper.arangoNotification("Server connected");
|
arangoHelper.arangoNotification("Server connected");
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
window.FoxxActiveView = Backbone.View.extend({
|
window.FoxxActiveView = Backbone.View.extend({
|
||||||
tagName: 'li',
|
tagName: 'li',
|
||||||
className: "span3",
|
className: "tile",
|
||||||
template: templateEngine.createTemplate("foxxActiveView.ejs"),
|
template: templateEngine.createTemplate("foxxActiveView.ejs"),
|
||||||
|
|
||||||
events: {
|
events: {
|
||||||
|
|
|
@ -18,8 +18,8 @@
|
||||||
collection: window.arangoDatabase,
|
collection: window.arangoDatabase,
|
||||||
current: window.currentDB
|
current: window.currentDB
|
||||||
});
|
});
|
||||||
// this.userBarView = new window.UserBarView({});
|
this.userBarView = new window.UserBarView({});
|
||||||
// this.statisticBarView = new window.StatisticBarView({});
|
this.statisticBarView = new window.StatisticBarView({});
|
||||||
},
|
},
|
||||||
|
|
||||||
handleSelectDatabase: function () {
|
handleSelectDatabase: function () {
|
||||||
|
@ -34,8 +34,8 @@
|
||||||
isSystem: window.currentDB.get("isSystem")
|
isSystem: window.currentDB.get("isSystem")
|
||||||
}));
|
}));
|
||||||
this.dbSelectionView.render($("#dbSelect"));
|
this.dbSelectionView.render($("#dbSelect"));
|
||||||
// this.userBarView.render($("#userBar"));
|
this.userBarView.render($("#userBar"));
|
||||||
// this.statisticBarView.render($("#statisticBar"));
|
this.statisticBarView.render($("#statisticBar"));
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -85,7 +85,6 @@
|
||||||
if (returnobj.status === true) {
|
if (returnobj.status === true) {
|
||||||
self.hidden();
|
self.hidden();
|
||||||
$("#add-collection").modal('hide');
|
$("#add-collection").modal('hide');
|
||||||
arangoHelper.arangoNotification("Collection created");
|
|
||||||
|
|
||||||
window.App.navigate("collection/" + collName + "/documents/1", {trigger: true});
|
window.App.navigate("collection/" + collName + "/documents/1", {trigger: true});
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*jslint indent: 2, nomen: true, maxlen: 100, vars: true, white: true, plusplus: true */
|
||||||
|
/*global window, document, Backbone, EJS, SwaggerUi, hljs, $, arangoHelper, templateEngine */
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
window.notificationView = Backbone.View.extend({
|
||||||
|
el: '#content',
|
||||||
|
|
||||||
|
template: templateEngine.createTemplate("notificationView.ejs"),
|
||||||
|
|
||||||
|
events: {
|
||||||
|
},
|
||||||
|
|
||||||
|
initialize: function() {
|
||||||
|
//this.collection.fetch({async:false});
|
||||||
|
},
|
||||||
|
|
||||||
|
render: function(){
|
||||||
|
$(this.el).html(this.template.render({}));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}());
|
|
@ -13,7 +13,9 @@
|
||||||
template: templateEngine.createTemplate("statisticBarView.ejs"),
|
template: templateEngine.createTemplate("statisticBarView.ejs"),
|
||||||
|
|
||||||
render: function () {
|
render: function () {
|
||||||
$(this.el).html(this.template.render({isSystem: window.currentDB.get("isSystem")}));
|
$(this.el).html(this.template.render({
|
||||||
|
isSystem: window.currentDB.get("isSystem")
|
||||||
|
}));
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -4,18 +4,91 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
window.UserBarView = Backbone.View.extend({
|
window.UserBarView = Backbone.View.extend({
|
||||||
el: '#statisticBar',
|
|
||||||
|
|
||||||
events: {
|
events: {
|
||||||
|
"change #userBarSelect": "navigateBySelect",
|
||||||
|
"click .tab": "navigateByTab",
|
||||||
|
"mouseenter .dropdown": "showDropdown",
|
||||||
|
"mouseleave .dropdown": "hideDropdown",
|
||||||
|
"click .navlogo #stat_hd" : "toggleNotification"
|
||||||
},
|
},
|
||||||
|
|
||||||
|
initialize: function () {
|
||||||
|
this.notificationList = new window.NotificationCollection();
|
||||||
|
},
|
||||||
|
|
||||||
|
notificationItem: templateEngine.createTemplate("notificationItem.ejs"),
|
||||||
|
|
||||||
template: templateEngine.createTemplate("userBarView.ejs"),
|
template: templateEngine.createTemplate("userBarView.ejs"),
|
||||||
|
|
||||||
render: function() {
|
navigateBySelect: function () {
|
||||||
$(this.el).html(this.template.render(this.template.text));
|
var navigateTo = $("#arangoCollectionSelect").find("option:selected").val();
|
||||||
return this;
|
window.App.navigate(navigateTo, {trigger: true});
|
||||||
|
},
|
||||||
|
|
||||||
|
navigateByTab: function (e) {
|
||||||
|
var tab = e.target || e.srcElement;
|
||||||
|
tab = $(tab).closest("a");
|
||||||
|
var navigateTo = tab.attr("id");
|
||||||
|
if (navigateTo === "user") {
|
||||||
|
$("#user_dropdown").slideToggle(200);
|
||||||
|
e.preventDefault();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
window.App.navigate(navigateTo, {trigger: true});
|
||||||
|
e.preventDefault();
|
||||||
|
},
|
||||||
|
|
||||||
|
toggleNotification: function (e) {
|
||||||
|
$('#notification_menu').toggle();
|
||||||
|
},
|
||||||
|
|
||||||
|
showDropdown: function (e) {
|
||||||
|
var tab = e.target || e.srcElement;
|
||||||
|
var navigateTo = tab.id;
|
||||||
|
if (navigateTo === "user") {
|
||||||
|
$("#user_dropdown").show(200);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
hideDropdown: function (e) {
|
||||||
|
var tab = e.target || e.srcElement;
|
||||||
|
var navigateTo = tab.id;
|
||||||
|
if (navigateTo === "") {
|
||||||
|
tab = $(tab).closest(".user-dropdown-menu");
|
||||||
|
navigateTo = tab.attr("id");
|
||||||
|
}
|
||||||
|
if (navigateTo === "user" || navigateTo === "user_dropdown" || navigateTo === "userimage" ) {
|
||||||
|
$("#user_dropdown").hide();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
updateNotifications: function() {
|
||||||
|
this.renderNotifications();
|
||||||
|
},
|
||||||
|
|
||||||
|
renderNotifications: function() {
|
||||||
|
$('.innerDropdownInnerUL').html(this.notificationItem.render({
|
||||||
|
notifications : this.notificationList.models
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
render: function (el) {
|
||||||
|
this.$el = el;
|
||||||
|
this.$el.html(this.template.render({
|
||||||
|
img : "https://s.gravatar.com/avatar/9c53a795affc3c3c03801ffae90e2e11?s=80",
|
||||||
|
prename : "Floyd",
|
||||||
|
lastname : "Pepper",
|
||||||
|
notifications : this.notificationList.models
|
||||||
|
}));
|
||||||
|
|
||||||
|
this.renderNotifications();
|
||||||
|
|
||||||
|
this.delegateEvents();
|
||||||
|
this.updateNotifications();
|
||||||
|
return this.$el;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}());
|
}());
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*jslint indent: 2, nomen: true, maxlen: 100, vars: true, white: true, plusplus: true */
|
||||||
|
/*global window, document, Backbone, EJS, SwaggerUi, hljs, $, arangoHelper, templateEngine */
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
window.userManagementView = Backbone.View.extend({
|
||||||
|
el: '#content',
|
||||||
|
|
||||||
|
template: templateEngine.createTemplate("userManagementView.ejs"),
|
||||||
|
|
||||||
|
events: {
|
||||||
|
},
|
||||||
|
|
||||||
|
initialize: function() {
|
||||||
|
//this.collection.fetch({async:false});
|
||||||
|
},
|
||||||
|
|
||||||
|
render: function(){
|
||||||
|
$(this.el).html(this.template.render({}));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}());
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*jslint indent: 2, nomen: true, maxlen: 100, vars: true, white: true, plusplus: true */
|
||||||
|
/*global window, document, Backbone, EJS, SwaggerUi, hljs, $, arangoHelper, templateEngine */
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
window.userProfileView = Backbone.View.extend({
|
||||||
|
el: '#content',
|
||||||
|
|
||||||
|
template: templateEngine.createTemplate("userProfileView.ejs"),
|
||||||
|
|
||||||
|
events: {
|
||||||
|
},
|
||||||
|
|
||||||
|
initialize: function() {
|
||||||
|
//this.collection.fetch({async:false});
|
||||||
|
},
|
||||||
|
|
||||||
|
render: function(){
|
||||||
|
$(this.el).html(this.template.render({}));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}());
|
|
@ -22,3 +22,4 @@ $c_dark_grey: #999999;
|
||||||
|
|
||||||
$c_transp: transparent;
|
$c_transp: transparent;
|
||||||
$c_semi_transp: rgba(0, 0, 0, 0.2);
|
$c_semi_transp: rgba(0, 0, 0, 0.2);
|
||||||
|
$c_very_transp: rgba(0, 0, 0, 0.05);
|
||||||
|
|
|
@ -9,6 +9,8 @@ li.tile {
|
||||||
text-align:center;
|
text-align:center;
|
||||||
height:100px;
|
height:100px;
|
||||||
width: 230px;
|
width: 230px;
|
||||||
|
list-style: none;
|
||||||
|
background-color: $c_very_transp;
|
||||||
margin: {
|
margin: {
|
||||||
left: 6px;
|
left: 6px;
|
||||||
right: 6px;
|
right: 6px;
|
||||||
|
|
|
@ -189,6 +189,8 @@ li.tile {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
height: 100px;
|
height: 100px;
|
||||||
width: 230px;
|
width: 230px;
|
||||||
|
list-style: none;
|
||||||
|
background-color: rgba(0, 0, 0, 0.05);
|
||||||
margin-left: 6px;
|
margin-left: 6px;
|
||||||
margin-right: 6px;
|
margin-right: 6px;
|
||||||
margin-bottom: 13px;
|
margin-bottom: 13px;
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
<html lang="en" xmlns="http://www.w3.org/1999/html">
|
<html lang="en" xmlns="http://www.w3.org/1999/html">
|
||||||
<head>
|
<head>
|
||||||
<!-- ArangoDB web interface -->
|
<!-- ArangoDB web interface -->
|
||||||
|
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>ArangoDB Web Interface</title>
|
<title>ArangoDB Web Interface</title>
|
||||||
<meta name="description" content="ArangoDB Admin Web Interface">
|
<meta name="description" content="ArangoDB Admin Web Interface">
|
||||||
|
|
|
@ -126,6 +126,7 @@ module.exports = function(karma) {
|
||||||
'frontend/js/models/arangoStatistics.js',
|
'frontend/js/models/arangoStatistics.js',
|
||||||
'frontend/js/models/arangoStatisticsDescription.js',
|
'frontend/js/models/arangoStatisticsDescription.js',
|
||||||
'frontend/js/models/foxx.js',
|
'frontend/js/models/foxx.js',
|
||||||
|
'frontend/js/models/notification.js',
|
||||||
'frontend/js/models/graph.js',
|
'frontend/js/models/graph.js',
|
||||||
'frontend/js/models/clusterServer.js',
|
'frontend/js/models/clusterServer.js',
|
||||||
'frontend/js/models/clusterCoordinator.js',
|
'frontend/js/models/clusterCoordinator.js',
|
||||||
|
@ -149,6 +150,7 @@ module.exports = function(karma) {
|
||||||
'frontend/js/collections/clusterDatabases.js',
|
'frontend/js/collections/clusterDatabases.js',
|
||||||
'frontend/js/collections/clusterCollections.js',
|
'frontend/js/collections/clusterCollections.js',
|
||||||
'frontend/js/collections/clusterShards.js',
|
'frontend/js/collections/clusterShards.js',
|
||||||
|
'frontend/js/collections/notificationCollection.js',
|
||||||
|
|
||||||
// Views
|
// Views
|
||||||
'frontend/js/views/navigationView.js',
|
'frontend/js/views/navigationView.js',
|
||||||
|
|
|
@ -69,16 +69,4 @@ describe("Arango Helper", function() {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("arango gritter ", function() {
|
|
||||||
it("warn. notification", function() {
|
|
||||||
var dummy = arangoHelper.arangoNotification("test");
|
|
||||||
expect(dummy).toBe(true);
|
|
||||||
});
|
|
||||||
it("crit. notification", function() {
|
|
||||||
var dummy = arangoHelper.arangoError("test");
|
|
||||||
expect(dummy).toBe(true);
|
|
||||||
$.gritter.removeAll();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
var internal = require("internal"); // OK: time
|
var internal = require("internal"); // OK: time
|
||||||
var arangodb = require("org/arangodb");
|
var arangodb = require("org/arangodb");
|
||||||
var crypto = require("org/arangodb/crypto");
|
var crypto = require("org/arangodb/crypto");
|
||||||
|
var _ = require("underscore");
|
||||||
|
|
||||||
var db = arangodb.db;
|
var db = arangodb.db;
|
||||||
var ArangoError = arangodb.ArangoError;
|
var ArangoError = arangodb.ArangoError;
|
||||||
|
@ -439,6 +440,32 @@ exports.document = function (username) {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @fn JSF_allUser
|
||||||
|
/// @brief gets all existing users
|
||||||
|
///
|
||||||
|
/// @FUN{users.all()}
|
||||||
|
///
|
||||||
|
/// Fetches all existing ArangoDB users from the database.
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
exports.all = function () {
|
||||||
|
var cursor = getStorage().all();
|
||||||
|
var result = [ ];
|
||||||
|
|
||||||
|
while (cursor.hasNext()) {
|
||||||
|
var doc = cursor.next();
|
||||||
|
var user = {
|
||||||
|
user: doc.user,
|
||||||
|
active: doc.active,
|
||||||
|
extra: doc.extra || { }
|
||||||
|
};
|
||||||
|
result.push(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @fn JSF_reloadUsers
|
/// @fn JSF_reloadUsers
|
||||||
/// @brief reloads the user authentication data
|
/// @brief reloads the user authentication data
|
||||||
|
|
|
@ -2751,6 +2751,36 @@ function UNION_DISTINCT () {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief extract a slice from a list
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function SLICE (value, from, to) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
if (TYPEWEIGHT(value) !== TYPEWEIGHT_LIST) {
|
||||||
|
THROW(INTERNAL.errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH, "SLICE");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TYPEWEIGHT(from) !== TYPEWEIGHT_NUMBER) {
|
||||||
|
THROW(INTERNAL.errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH, "SLICE");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TYPEWEIGHT(to) === TYPEWEIGHT_NULL) {
|
||||||
|
to = undefined;
|
||||||
|
}
|
||||||
|
else if (TYPEWEIGHT(to) !== TYPEWEIGHT_NUMBER) {
|
||||||
|
THROW(INTERNAL.errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH, "SLICE");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (to >= 0) {
|
||||||
|
to += from;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return value.slice(from, to);
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief subtract lists from other lists
|
/// @brief subtract lists from other lists
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -4238,6 +4268,7 @@ exports.RANGE = RANGE;
|
||||||
exports.UNIQUE = UNIQUE;
|
exports.UNIQUE = UNIQUE;
|
||||||
exports.UNION = UNION;
|
exports.UNION = UNION;
|
||||||
exports.UNION_DISTINCT = UNION_DISTINCT;
|
exports.UNION_DISTINCT = UNION_DISTINCT;
|
||||||
|
exports.SLICE = SLICE;
|
||||||
exports.MINUS = MINUS;
|
exports.MINUS = MINUS;
|
||||||
exports.INTERSECTION = INTERSECTION;
|
exports.INTERSECTION = INTERSECTION;
|
||||||
exports.MAX = MAX;
|
exports.MAX = MAX;
|
||||||
|
|
|
@ -557,6 +557,74 @@ function ahuacatlFunctionsTestSuite () {
|
||||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN UNIQUE({ })");
|
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN UNIQUE({ })");
|
||||||
},
|
},
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test slice function
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
testSlice : function () {
|
||||||
|
var expected, actual;
|
||||||
|
|
||||||
|
actual = getQueryResults("RETURN SLICE([ ], 0, 1)");
|
||||||
|
assertEqual([ [ ] ], actual);
|
||||||
|
|
||||||
|
actual = getQueryResults("RETURN SLICE([ 1, 2, 3, 4, 5 ], 0, 1)");
|
||||||
|
assertEqual([ [ 1 ] ], actual);
|
||||||
|
|
||||||
|
actual = getQueryResults("RETURN SLICE([ 1, 2, 3, 4, 5 ], 0, 2)");
|
||||||
|
assertEqual([ [ 1, 2 ] ], actual);
|
||||||
|
|
||||||
|
actual = getQueryResults("RETURN SLICE([ 1, 2, 3, 4, 5 ], 1, 2)");
|
||||||
|
assertEqual([ [ 2, 3 ] ], actual);
|
||||||
|
|
||||||
|
actual = getQueryResults("RETURN SLICE([ 1, 2, 3, 4, 5 ], 0)");
|
||||||
|
assertEqual([ [ 1, 2, 3, 4, 5 ] ], actual);
|
||||||
|
|
||||||
|
actual = getQueryResults("RETURN SLICE([ 1, 2, 3, 4, 5 ], 3)");
|
||||||
|
assertEqual([ [ 4, 5 ] ], actual);
|
||||||
|
|
||||||
|
actual = getQueryResults("RETURN SLICE([ 1, 2, 3, 4, 5 ], 0, -1)");
|
||||||
|
assertEqual([ [ 1, 2, 3, 4 ] ], actual);
|
||||||
|
|
||||||
|
actual = getQueryResults("RETURN SLICE([ 1, 2, 3, 4, 5 ], 0, -2)");
|
||||||
|
assertEqual([ [ 1, 2, 3 ] ], actual);
|
||||||
|
|
||||||
|
actual = getQueryResults("RETURN SLICE([ 1, 2, 3, 4, 5 ], 2, -1)");
|
||||||
|
assertEqual([ [ 3, 4 ] ], actual);
|
||||||
|
|
||||||
|
actual = getQueryResults("RETURN SLICE([ 1, 2, 3, 4, 5 ], 10)");
|
||||||
|
assertEqual([ [ ] ], actual);
|
||||||
|
|
||||||
|
actual = getQueryResults("RETURN SLICE([ 1, 2, 3, 4, 5 ], 1000)");
|
||||||
|
assertEqual([ [ ] ], actual);
|
||||||
|
|
||||||
|
actual = getQueryResults("RETURN SLICE([ 1, 2, 3, 4, 5 ], -1000)");
|
||||||
|
assertEqual([ [ 1, 2, 3, 4, 5 ] ], actual);
|
||||||
|
|
||||||
|
actual = getQueryResults("RETURN SLICE([ 1, 2, 3, 4, 5 ], 1, -10)");
|
||||||
|
assertEqual([ [ ] ], actual);
|
||||||
|
},
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test slice function
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
testSliceInvalid : function () {
|
||||||
|
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN SLICE()");
|
||||||
|
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN SLICE(true)");
|
||||||
|
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN SLICE(1)");
|
||||||
|
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN SLICE('foo')");
|
||||||
|
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN SLICE({ })");
|
||||||
|
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN SLICE([ ])");
|
||||||
|
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN SLICE([ ], { })");
|
||||||
|
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN SLICE([ ], true)");
|
||||||
|
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN SLICE([ ], 'foo')");
|
||||||
|
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN SLICE([ ], [ ])");
|
||||||
|
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN SLICE([ ], { })");
|
||||||
|
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN SLICE([ ], 1, false)");
|
||||||
|
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN SLICE([ ], 1, 'foo')");
|
||||||
|
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code, "RETURN SLICE([ ], 1, [ ])");
|
||||||
|
},
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief test left function
|
/// @brief test left function
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
Loading…
Reference in New Issue