1
0
Fork 0

Merge branch 'devel' of https://github.com/arangodb/arangodb into devel

This commit is contained in:
Kaveh Vahedipour 2016-06-13 19:32:56 +02:00
commit 1709d66841
38 changed files with 1055 additions and 633 deletions

View File

@ -1,75 +1,75 @@
# -*- mode: CMAKE; -*-
# ------------------------------------------------------------------------------
# OPENSSL
# ------------------------------------------------------------------------------
find_package(OpenSSL REQUIRED)
if (OPENSSL_VERSION)
string(REPLACE "." ";" OPENSSL_VERSION_LIST ${OPENSSL_VERSION})
list(GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR)
list(GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR)
if ("${OPENSSL_VERSION_MAJOR}" GREATER 0 AND "${OPENSSL_VERSION_MINOR}" GREATER 0)
option(USE_OPENSSL_NO_SSL2
"do not use OPENSSL_NO_SSL2"
ON
)
else ()
option(USE_OPENSSL_NO_SSL2
"do not use OPENSSL_NO_SSL2"
OFF
)
endif ()
endif ()
set(OPENSSL_VERSION
"${OPENSSL_VERSION}"
CACHE INTERNAL
"OpenSSL: Version"
)
set(OPENSSL_INCLUDE_DIR
"${OPENSSL_INCLUDE_DIR}"
CACHE INTERNAL
"OpenSSL: Include Directory"
)
if (WIN32 AND NOT SSL_NUGET)
if (DEBUG)
set(OPENSSL_EXT "d")
else ()
set(OPENSSL_EXT "")
endif ()
if (NOT ${OPENSSL_LIB_DIR})
set(OPENSSL_LIB_DIR "${OPENSSL_ROOT_DIR}/lib/VC")
endif ()
message(STATUS "OPENSSL_LIB_DIR = ${OPENSSL_LIB_DIR}")
message(STATUS "OPENSSL_ROOT_DIR = ${OPENSSL_ROOT_DIR}")
set(OPENSSL_LIBRARIES
debug "${OPENSSL_LIB_DIR}/ssleay32MTd.lib;${OPENSSL_LIB_DIR}/libeay32MTd.lib"
optimized "${OPENSSL_LIB_DIR}/ssleay32MT.lib;${OPENSSL_LIB_DIR}/libeay32MT.lib"
CACHE INTERNAL
"OpenSSL: libraries"
)
else ()
set(OPENSSL_LIBRARIES
"${OPENSSL_LIBRARIES}"
CACHE INTERNAL
"OpenSSL: libraries"
)
endif ()
if (WIN32 AND SSL_NUGET)
#install (FILES ${LIB_EAY_DEBUG_DLL} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
#install (FILES ${SSL_EAY_DEBUG_DLL} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
set(OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/$(Configuration)/")
install (FILES "${LIB_EAY_RELEASE_DLL}"
RUNTIME DESTINATION "${OUTPUT_DIRECTORY}")
install (FILES "${SSL_EAY_RELEASE_DLL}"
RUNTIME DESTINATION "${OUTPUT_DIRECTORY}")
endif()
# -*- mode: CMAKE; -*-
# ------------------------------------------------------------------------------
# OPENSSL
# ------------------------------------------------------------------------------
find_package(OpenSSL REQUIRED)
if (OPENSSL_VERSION)
string(REPLACE "." ";" OPENSSL_VERSION_LIST ${OPENSSL_VERSION})
list(GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR)
list(GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR)
if ("${OPENSSL_VERSION_MAJOR}" GREATER 0 AND "${OPENSSL_VERSION_MINOR}" GREATER 0)
option(USE_OPENSSL_NO_SSL2
"do not use OPENSSL_NO_SSL2"
ON
)
else ()
option(USE_OPENSSL_NO_SSL2
"do not use OPENSSL_NO_SSL2"
OFF
)
endif ()
endif ()
set(OPENSSL_VERSION
"${OPENSSL_VERSION}"
CACHE INTERNAL
"OpenSSL: Version"
)
set(OPENSSL_INCLUDE_DIR
"${OPENSSL_INCLUDE_DIR}"
CACHE INTERNAL
"OpenSSL: Include Directory"
)
if (WIN32 AND NOT SSL_NUGET)
if (DEBUG)
set(OPENSSL_EXT "d")
else ()
set(OPENSSL_EXT "")
endif ()
if (NOT ${OPENSSL_LIB_DIR})
set(OPENSSL_LIB_DIR "${OPENSSL_ROOT_DIR}/lib/VC")
endif ()
message(STATUS "OPENSSL_LIB_DIR = ${OPENSSL_LIB_DIR}")
message(STATUS "OPENSSL_ROOT_DIR = ${OPENSSL_ROOT_DIR}")
set(OPENSSL_LIBRARIES
debug "${OPENSSL_LIB_DIR}/ssleay32MTd.lib;${OPENSSL_LIB_DIR}/libeay32MTd.lib"
optimized "${OPENSSL_LIB_DIR}/ssleay32MT.lib;${OPENSSL_LIB_DIR}/libeay32MT.lib"
CACHE INTERNAL
"OpenSSL: libraries"
)
else ()
set(OPENSSL_LIBRARIES
"${OPENSSL_LIBRARIES}"
CACHE INTERNAL
"OpenSSL: libraries"
)
endif ()
if (WIN32 AND SSL_NUGET)
#install (FILES ${LIB_EAY_DEBUG_DLL} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
#install (FILES ${SSL_EAY_DEBUG_DLL} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
#message("FILES ${SSL_EAY_RELEASE_DLL} RUNTIME DESTINATION ${OUTPUT_DIRECTORY}")
install (FILES "${LIB_EAY_RELEASE_DLL}"
DESTINATION "bin/")
install (FILES "${SSL_EAY_RELEASE_DLL}"
DESTINATION "bin/")
endif()

View File

@ -1,5 +1,17 @@
v3.0.0 (XXXX-XX-XX)
-------------------
v3.0.0-rc2 (2015-06-12)
-----------------------
* added option `--server.max-packet-size` for client tools
* renamed option `--server.ssl-protocol` to `--ssl.protocol` in client tools
(was already done for arangod, but overlooked for client tools)
* fix handling of `--ssl.protocol` value 5 (TLS v1.2) in client tools, which
claimed to support it but didn't
v3.0.0-rc1 (2015-06-10)
-----------------------
* forward ported V8 Comparator bugfix for inline heuristics from
https://github.com/v8/v8/commit/5ff7901e24c2c6029114567de5a08ed0f1494c81

View File

@ -119,6 +119,11 @@ configure_file(
## OPERATION SYSTEM
################################################################################
option(HOMEBREW
"whether to install for homebrew"
Off
)
if (WIN32)
set(WINDOWS TRUE)
set(MSBUILD TRUE)

View File

@ -29,7 +29,7 @@ arangosh> users.grantDatabase("admin@testapp", "testdb");
This grants the user access to the database *testdb*. `revokeDatabase`
will revoke the right.
!SECTION Comparision to ArangoDB 2
!SECTION Comparison to ArangoDB 2
ArangoDB 2 contained separate users per database. It was not possible
to give an user access to two or more databases. This proved

View File

@ -16,20 +16,17 @@ Unfortunately, the JavaScript libraries are just in the process of being
standardized. CommonJS has defined some important modules. ArangoDB implements
the following
* "console" is a well known logging facility to all the JavaScript developers.
- [console](Console.md) is a well known logging facility to all the JavaScript developers.
ArangoDB implements most of the [Console API](http://wiki.commonjs.org/wiki/Console),
with the exceptions of *profile* and *count*.
* "fs" provides a file system API for the manipulation of paths, directories,
- [fs](FileSystem.md) provides a file system API for the manipulation of paths, directories,
files, links, and the construction of file streams. ArangoDB implements
most [Filesystem/A](http://wiki.commonjs.org/wiki/Filesystem/A) functions.
* Modules are implemented according to
- Modules are implemented according to
[Modules/1.1.1](http://wiki.commonjs.org/wiki/Modules)
* Packages are implemented according to
[Packages/1.0](http://wiki.commonjs.org/wiki/Packages)
!SUBSECTION ArangoDB Specific Modules
A lot of the modules, however, are ArangoDB specific. These modules
@ -39,75 +36,76 @@ are described in the following chapters.
ArangoDB also supports some [node](http://www.nodejs.org) modules.
* ["assert"](http://nodejs.org/api/assert.html) implements
- [assert](http://nodejs.org/api/assert.html) implements
assertion and testing functions.
* ["buffer"](http://nodejs.org/api/buffer.html) implements
- [buffer](http://nodejs.org/api/buffer.html) implements
a binary data type for JavaScript.
* ["path"](http://nodejs.org/api/path.html) implements
- [path](http://nodejs.org/api/path.html) implements
functions dealing with filenames and paths.
* ["punycode"](http://nodejs.org/api/punycode.html) implements
- [punycode](http://nodejs.org/api/punycode.html) implements
conversion functions for
[punycode](http://en.wikipedia.org/wiki/Punycode) encoding.
* ["querystring"](http://nodejs.org/api/querystring.html)
- [querystring](http://nodejs.org/api/querystring.html)
provides utilities for dealing with query strings.
* ["stream"](http://nodejs.org/api/stream.html)
- [stream](http://nodejs.org/api/stream.html)
provides a streaming interface.
* ["url"](http://nodejs.org/api/url.html)
- [url](http://nodejs.org/api/url.html)
has utilities for URL resolution and parsing.
!SUBSECTION Bundled NPM Modules
The following [NPM modules](https://npmjs.org) are preinstalled.
* ["aqb"](https://github.com/arangodb/aqbjs)
- [aqb](https://github.com/arangodb/aqbjs)
is the ArangoDB Query Builder and can be used to construct
AQL queries with a chaining JavaScript API.
* ["error-stack-parser"](http://www.stacktracejs.com)
- [error-stack-parser](http://www.stacktracejs.com)
* ["expect.js"](https://github.com/Automattic/expect.js)
- [expect.js](https://github.com/Automattic/expect.js)
* ["extendible"](https://github.com/3rd-Eden/extendible)
- [extendible](https://github.com/3rd-Eden/extendible)
* ["foxx_generator"](https://github.com/moonglum/foxx_generator)
- [foxx_generator](https://github.com/moonglum/foxx_generator)
* ["http-errors"](https://github.com/jshttp/http-errors)
- [http-errors](https://github.com/jshttp/http-errors)
* ["i"](https://github.com/pksunkara/inflect)
- [i (inflect)](https://github.com/pksunkara/inflect)
* ["joi"](https://github.com/hapijs/joi)
- [joi](https://github.com/hapijs/joi)
is a validation library that is used throughout the Foxx framework.
* ["js-yaml"](https://github.com/nodeca/js-yaml)
- [js-yaml](https://github.com/nodeca/js-yaml)
* ["minimatch"](https://github.com/isaacs/minimatch)
- [minimatch](https://github.com/isaacs/minimatch)
* ["qs"](https://github.com/hapijs/qs)
- [qs](https://github.com/hapijs/qs)
provides utilities for dealing with query strings using a different format
than the **querystring** module.
* ["ramda"](http://ramdajs.com)
- [ramda](http://ramdajs.com)
* ["semver"](https://github.com/npm/node-semver)
- [semver](https://github.com/npm/node-semver)
* ["sinon"](http://sinonjs.org)
- [sinon](http://sinonjs.org)
* ["underscore"](http://underscorejs.org)
- [underscore](http://underscorejs.org)
!SUBSECTION Installing NPM Modules
You can install additional modules using `npm install`. Note the following limitations in ArangoDB's compatibility with node or browser modules:
You can install additional modules using `npm install`. Note the following
limitations in ArangoDB's compatibility with node or browser modules:
* modules must be implemented in pure JavaScript (no native extensions)
* modules must be strictly synchronous (e.g. no setTimeout or promises)
* only a subset of node's built-in modules are supported (see above)
* the same limitations apply to each module's dependencies
- modules must be implemented in pure JavaScript (no native extensions)
- modules must be strictly synchronous (e.g. no setTimeout or promises)
- only a subset of node's built-in modules are supported (see above)
- the same limitations apply to each module's dependencies
!SUBSECTION require
@ -123,10 +121,10 @@ Assume that your module file is *test1.js* and contains
```js
exports.func1 = function() {
print("1");
print("2");
};
exports.const1 = 1;
exports.const1 = 4;
```
Then you can use *require* to load the file and access the exports.
@ -136,10 +134,10 @@ unix> ./arangosh
arangosh> var test1 = require("test1");
arangosh> test1.const1;
1
4
arangosh> test1.func1();
1
2
```
*require* follows the specification
@ -193,14 +191,14 @@ require("com/example/extension")
then ArangoDB will try to locate the corresponding JavaScript as file as
follows
* There is a cache for the results of previous *require* calls. First of
- There is a cache for the results of previous *require* calls. First of
all ArangoDB checks if *com/example/extension* is already in the modules
cache. If it is, the export object for this module is returned. No further
JavaScript is executed.
* ArangoDB will then check, if there is a file called **com/example/extension.js** in the system search path. If such a file exists, it is executed in a new module context and the value of *exports* object is returned. This value is also stored in the module cache.
- ArangoDB will then check, if there is a file called **com/example/extension.js** in the system search path. If such a file exists, it is executed in a new module context and the value of *exports* object is returned. This value is also stored in the module cache.
* If no file can be found, ArangoDB will check if the collection *_modules*
- If no file can be found, ArangoDB will check if the collection *_modules*
contains a document of the form
```js

View File

@ -31,6 +31,12 @@ The following methods exists on the *_db* object:
* [db._drop(name)](../../DataModeling/Collections/DatabaseMethods.md#drop)
* [db._truncate(name)](../../DataModeling/Collections/DatabaseMethods.md#truncate)
*AQL*
* [db._createStatement(query)](../../../AQL/Invocation/WithArangosh.html#with-createstatement-arangostatement)
* [db._query(query)](../../../AQL/Invocation/WithArangosh.html#with-dbquery)
* [db._explain(query)](../../ReleaseNotes/NewFeatures28.md#miscellaneous-improvements)
*Document*
* [db._document(object)](../../DataModeling/Documents/DatabaseMethods.md#document)

View File

@ -209,7 +209,7 @@ const DOC_NOT_FOUND = errors.ERROR_ARANGO_DOCUMENT_NOT_FOUND.code;
router.post('/entries', function (req, res) {
const data = req.body;
const meta = foxxColl.save(req.body);
res.json(Object.assign(data, meta));
res.send(Object.assign(data, meta));
})
.body(joi.object().required(), 'Entry to store in the collection.')
.response(joi.object().required(), 'Entry stored in the collection.')
@ -219,7 +219,7 @@ router.post('/entries', function (req, res) {
router.get('/entries/:key', function (req, res) {
try {
const data = foxxColl.document(req.pathParams.key);
res.json(data)
res.send(data)
} catch (e) {
if (!e.isArangoError || e.errorNum !== DOC_NOT_FOUND) {
throw e;
@ -258,7 +258,7 @@ router.get('/entries', function (req, res) {
FOR entry IN ${foxxColl}
RETURN entry._key
`);
res.json(keys)
res.send(keys);
})
.response(joi.array().items(
joi.string().required()

View File

@ -1053,6 +1053,14 @@ and all client tools uses these APIs.
In order to connect to earlier versions of ArangoDB with the client tools, an older
version of the client tools needs to be kept installed.
!SUBSECTION Command-line options added
All client tools in 3.0 provide an option `--server.max-packet-size` for controlling
the maximum size of HTTP packets to be handled by the client tools. The default value
is 128 MB, as in previous versions of ArangoDB. In contrast to previous versions in
which the value was hard-coded, the option is now configurable. It can be increased to
make the client tools handle very large HTTP result messages sent by the server.
!SUBSECTION Command-line options changed
For all client tools, the option `--server.disable-authentication` was renamed to

View File

@ -173,12 +173,12 @@
* [db](Appendix/References/DBObject.md)
* [collection](Appendix/References/CollectionObject.md)
* [JavaScript Modules](Appendix/JavaScriptModules/README.md)
* ["console"](Appendix/JavaScriptModules/Console.md)
* ["fs"](Appendix/JavaScriptModules/FS.md)
* ["process"](Appendix/JavaScriptModules/Process.md)
* ["request"](Appendix/JavaScriptModules/Request.md)
* ["actions"](Appendix/JavaScriptModules/Actions.md)
* ["queries"](Appendix/JavaScriptModules/Queries.md)
* [console](Appendix/JavaScriptModules/Console.md)
* [fs](Appendix/JavaScriptModules/FileSystem.md)
* [process](Appendix/JavaScriptModules/Process.md)
* [request](Appendix/JavaScriptModules/Request.md)
* [actions](Appendix/JavaScriptModules/Actions.md)
* [queries](Appendix/JavaScriptModules/Queries.md)
* [Write-ahead log](Appendix/JavaScriptModules/WAL.md)
* [Task Management](Appendix/JavaScriptModules/Tasks.md)
* [Deprecated](Appendix/Deprecated/README.md)

View File

@ -0,0 +1,19 @@
shell> curl -X POST --data-binary @- --dump - http://localhost:8529/_api/user <<EOF
{
<span class="hljs-string">"user"</span> : <span class="hljs-string">"admin@example"</span>,
<span class="hljs-string">"password"</span> : <span class="hljs-string">"secure"</span>
}
EOF
HTTP/<span class="hljs-number">1.1</span> <span class="hljs-number">201</span> Created
content-type: application/json; charset=utf<span class="hljs-number">-8</span>
{
<span class="hljs-string">"user"</span> : <span class="hljs-string">"admin@example"</span>,
<span class="hljs-string">"active"</span> : <span class="hljs-literal">true</span>,
<span class="hljs-string">"extra"</span> : {
},
<span class="hljs-string">"changePassword"</span> : <span class="hljs-literal">false</span>,
<span class="hljs-string">"error"</span> : <span class="hljs-literal">false</span>,
<span class="hljs-string">"code"</span> : <span class="hljs-number">201</span>
}

View File

@ -0,0 +1,12 @@
shell> curl -X DELETE --data-binary @- --dump - http://localhost:8529/_api/user/admin@ourapp &lt;&lt;EOF
{
}
EOF
HTTP/<span class="hljs-number">1.1</span> <span class="hljs-number">202</span> Accepted
content-type: application/json; charset=utf<span class="hljs-number">-8</span>
{
<span class="hljs-string">"error"</span> : <span class="hljs-literal">false</span>,
<span class="hljs-string">"code"</span> : <span class="hljs-number">202</span>
}

View File

@ -0,0 +1,39 @@
shell> curl --dump - http://localhost:8529/_api/user
HTTP/<span class="hljs-number">1.1</span> <span class="hljs-number">200</span> OK
content-type: application/json; charset=utf<span class="hljs-number">-8</span>
{
<span class="hljs-string">"result"</span> : [
{
<span class="hljs-string">"user"</span> : <span class="hljs-string">"root"</span>,
<span class="hljs-string">"active"</span> : <span class="hljs-literal">true</span>,
<span class="hljs-string">"extra"</span> : {
},
<span class="hljs-string">"changePassword"</span> : <span class="hljs-literal">false</span>
},
{
<span class="hljs-string">"user"</span> : <span class="hljs-string">"admin@example"</span>,
<span class="hljs-string">"active"</span> : <span class="hljs-literal">true</span>,
<span class="hljs-string">"extra"</span> : {
},
<span class="hljs-string">"changePassword"</span> : <span class="hljs-literal">false</span>
},
{
<span class="hljs-string">"user"</span> : <span class="hljs-string">"admin"</span>,
<span class="hljs-string">"active"</span> : <span class="hljs-literal">true</span>,
<span class="hljs-string">"extra"</span> : {
},
<span class="hljs-string">"changePassword"</span> : <span class="hljs-literal">false</span>
},
{
<span class="hljs-string">"user"</span> : <span class="hljs-string">"tester"</span>,
<span class="hljs-string">"active"</span> : <span class="hljs-literal">false</span>,
<span class="hljs-string">"extra"</span> : {
},
<span class="hljs-string">"changePassword"</span> : <span class="hljs-literal">false</span>
}
],
<span class="hljs-string">"error"</span> : <span class="hljs-literal">false</span>,
<span class="hljs-string">"code"</span> : <span class="hljs-number">200</span>
}

View File

@ -0,0 +1,14 @@
shell> curl --dump - http://localhost:8529/_api/user/admin@theirapp
HTTP/<span class="hljs-number">1.1</span> <span class="hljs-number">200</span> OK
content-type: application/json; charset=utf<span class="hljs-number">-8</span>
{
<span class="hljs-string">"user"</span> : <span class="hljs-string">"admin@theirapp"</span>,
<span class="hljs-string">"active"</span> : <span class="hljs-literal">true</span>,
<span class="hljs-string">"extra"</span> : {
},
<span class="hljs-string">"changePassword"</span> : <span class="hljs-literal">false</span>,
<span class="hljs-string">"error"</span> : <span class="hljs-literal">false</span>,
<span class="hljs-string">"code"</span> : <span class="hljs-number">200</span>
}

View File

@ -0,0 +1,14 @@
shell> curl -X PUT --data-binary @- --dump - http://localhost:8529/_api/user/admin@secapp/database/_system &lt;&lt;EOF
{
<span class="hljs-string">"grant"</span> : <span class="hljs-string">"rw"</span>
}
EOF
HTTP/<span class="hljs-number">1.1</span> <span class="hljs-number">200</span> OK
content-type: application/json; charset=utf<span class="hljs-number">-8</span>
{
<span class="hljs-string">"_system"</span> : <span class="hljs-string">"rw"</span>,
<span class="hljs-string">"error"</span> : <span class="hljs-literal">false</span>,
<span class="hljs-string">"code"</span> : <span class="hljs-number">200</span>
}

View File

@ -0,0 +1,18 @@
shell> curl -X PUT --data-binary @- --dump - http://localhost:8529/_api/user/admin@myapp &lt;&lt;EOF
{
<span class="hljs-string">"password"</span> : <span class="hljs-string">"secure"</span>
}
EOF
HTTP/<span class="hljs-number">1.1</span> <span class="hljs-number">200</span> OK
content-type: application/json; charset=utf<span class="hljs-number">-8</span>
{
<span class="hljs-string">"user"</span> : <span class="hljs-string">"admin@myapp"</span>,
<span class="hljs-string">"active"</span> : <span class="hljs-literal">true</span>,
<span class="hljs-string">"extra"</span> : {
},
<span class="hljs-string">"changePassword"</span> : <span class="hljs-literal">false</span>,
<span class="hljs-string">"error"</span> : <span class="hljs-literal">false</span>,
<span class="hljs-string">"code"</span> : <span class="hljs-number">200</span>
}

View File

@ -0,0 +1,18 @@
shell> curl -X PATCH --data-binary @- --dump - http://localhost:8529/_api/user/admin@yourapp &lt;&lt;EOF
{
<span class="hljs-string">"password"</span> : <span class="hljs-string">"secure"</span>
}
EOF
HTTP/<span class="hljs-number">1.1</span> <span class="hljs-number">200</span> OK
content-type: application/json; charset=utf<span class="hljs-number">-8</span>
{
<span class="hljs-string">"user"</span> : <span class="hljs-string">"admin@yourapp"</span>,
<span class="hljs-string">"active"</span> : <span class="hljs-literal">true</span>,
<span class="hljs-string">"extra"</span> : {
},
<span class="hljs-string">"changePassword"</span> : <span class="hljs-literal">false</span>,
<span class="hljs-string">"error"</span> : <span class="hljs-literal">false</span>,
<span class="hljs-string">"code"</span> : <span class="hljs-number">200</span>
}

View File

@ -0,0 +1,42 @@
arangosh&gt; db.names.ensureIndex({ type: <span class="hljs-string">"persistent"</span>, fields: [ <span class="hljs-string">"first"</span> ] });
{
<span class="hljs-string">"id"</span> : <span class="hljs-string">"names/15880"</span>,
<span class="hljs-string">"type"</span> : <span class="hljs-string">"persistent"</span>,
<span class="hljs-string">"fields"</span> : [
<span class="hljs-string">"first"</span>
],
<span class="hljs-string">"unique"</span> : <span class="hljs-literal">false</span>,
<span class="hljs-string">"sparse"</span> : <span class="hljs-literal">false</span>,
<span class="hljs-string">"isNewlyCreated"</span> : <span class="hljs-literal">true</span>,
<span class="hljs-string">"code"</span> : <span class="hljs-number">201</span>
}
arangosh&gt; db.names.save({ <span class="hljs-string">"first"</span> : <span class="hljs-string">"Tim"</span> });
{
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"names/15883"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"15883"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"15883"</span>
}
arangosh&gt; db.names.save({ <span class="hljs-string">"first"</span> : <span class="hljs-string">"Tom"</span> });
{
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"names/15887"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"15887"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"15887"</span>
}
arangosh&gt; db.names.save({ <span class="hljs-string">"first"</span> : <span class="hljs-string">"John"</span> });
{
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"names/15890"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"15890"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"15890"</span>
}
arangosh&gt; db.names.save({ <span class="hljs-string">"first"</span> : <span class="hljs-string">"Tim"</span> });
{
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"names/15893"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"15893"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"15893"</span>
}
arangosh&gt; db.names.save({ <span class="hljs-string">"first"</span> : <span class="hljs-string">"Tom"</span> });
{
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"names/15896"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"15896"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"15896"</span>
}

View File

@ -0,0 +1,33 @@
arangosh&gt; db.ids.ensureIndex({ type: <span class="hljs-string">"persistent"</span>, fields: [ <span class="hljs-string">"name.first"</span>, <span class="hljs-string">"name.last"</span> ], unique: <span class="hljs-literal">true</span> });
{
<span class="hljs-string">"id"</span> : <span class="hljs-string">"ids/15941"</span>,
<span class="hljs-string">"type"</span> : <span class="hljs-string">"persistent"</span>,
<span class="hljs-string">"fields"</span> : [
<span class="hljs-string">"name.first"</span>,
<span class="hljs-string">"name.last"</span>
],
<span class="hljs-string">"unique"</span> : <span class="hljs-literal">true</span>,
<span class="hljs-string">"sparse"</span> : <span class="hljs-literal">false</span>,
<span class="hljs-string">"isNewlyCreated"</span> : <span class="hljs-literal">true</span>,
<span class="hljs-string">"code"</span> : <span class="hljs-number">201</span>
}
arangosh&gt; db.ids.save({ <span class="hljs-string">"name"</span> : { <span class="hljs-string">"first"</span> : <span class="hljs-string">"hans"</span>, <span class="hljs-string">"last"</span>: <span class="hljs-string">"hansen"</span> }});
{
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"ids/15944"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"15944"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"15944"</span>
}
arangosh&gt; db.ids.save({ <span class="hljs-string">"name"</span> : { <span class="hljs-string">"first"</span> : <span class="hljs-string">"jens"</span>, <span class="hljs-string">"last"</span>: <span class="hljs-string">"jensen"</span> }});
{
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"ids/15948"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"15948"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"15948"</span>
}
arangosh&gt; db.ids.save({ <span class="hljs-string">"name"</span> : { <span class="hljs-string">"first"</span> : <span class="hljs-string">"hans"</span>, <span class="hljs-string">"last"</span>: <span class="hljs-string">"jensen"</span> }});
{
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"ids/15951"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"15951"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"15951"</span>
}
arangosh&gt; db.ids.save({ <span class="hljs-string">"name"</span> : { <span class="hljs-string">"first"</span> : <span class="hljs-string">"hans"</span>, <span class="hljs-string">"last"</span>: <span class="hljs-string">"hansen"</span> }});
[ArangoError <span class="hljs-number">1210</span>: cannot create <span class="hljs-built_in">document</span>, unique constraint violated]

View File

@ -0,0 +1,32 @@
arangosh&gt; db.ids.ensureIndex({ type: <span class="hljs-string">"persistent"</span>, fields: [ <span class="hljs-string">"myId"</span> ], unique: <span class="hljs-literal">true</span> });
{
<span class="hljs-string">"id"</span> : <span class="hljs-string">"ids/15959"</span>,
<span class="hljs-string">"type"</span> : <span class="hljs-string">"persistent"</span>,
<span class="hljs-string">"fields"</span> : [
<span class="hljs-string">"myId"</span>
],
<span class="hljs-string">"unique"</span> : <span class="hljs-literal">true</span>,
<span class="hljs-string">"sparse"</span> : <span class="hljs-literal">false</span>,
<span class="hljs-string">"isNewlyCreated"</span> : <span class="hljs-literal">true</span>,
<span class="hljs-string">"code"</span> : <span class="hljs-number">201</span>
}
arangosh&gt; db.ids.save({ <span class="hljs-string">"myId"</span>: <span class="hljs-number">123</span> });
{
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"ids/15962"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"15962"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"15962"</span>
}
arangosh&gt; db.ids.save({ <span class="hljs-string">"myId"</span>: <span class="hljs-number">456</span> });
{
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"ids/15966"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"15966"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"15966"</span>
}
arangosh&gt; db.ids.save({ <span class="hljs-string">"myId"</span>: <span class="hljs-number">789</span> });
{
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"ids/15969"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"15969"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"15969"</span>
}
arangosh&gt; db.ids.save({ <span class="hljs-string">"myId"</span>: <span class="hljs-number">123</span> });
[ArangoError <span class="hljs-number">1210</span>: cannot create <span class="hljs-built_in">document</span>, unique constraint violated]

View File

@ -0,0 +1,33 @@
arangosh&gt; db.ids.ensureIndex({ type: <span class="hljs-string">"skiplist"</span>, fields: [ <span class="hljs-string">"name.first"</span>, <span class="hljs-string">"name.last"</span> ], unique: <span class="hljs-literal">true</span> });
{
<span class="hljs-string">"id"</span> : <span class="hljs-string">"ids/16013"</span>,
<span class="hljs-string">"type"</span> : <span class="hljs-string">"skiplist"</span>,
<span class="hljs-string">"fields"</span> : [
<span class="hljs-string">"name.first"</span>,
<span class="hljs-string">"name.last"</span>
],
<span class="hljs-string">"unique"</span> : <span class="hljs-literal">true</span>,
<span class="hljs-string">"sparse"</span> : <span class="hljs-literal">false</span>,
<span class="hljs-string">"isNewlyCreated"</span> : <span class="hljs-literal">true</span>,
<span class="hljs-string">"code"</span> : <span class="hljs-number">201</span>
}
arangosh&gt; db.ids.save({ <span class="hljs-string">"name"</span> : { <span class="hljs-string">"first"</span> : <span class="hljs-string">"hans"</span>, <span class="hljs-string">"last"</span>: <span class="hljs-string">"hansen"</span> }});
{
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"ids/16016"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"16016"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"16016"</span>
}
arangosh&gt; db.ids.save({ <span class="hljs-string">"name"</span> : { <span class="hljs-string">"first"</span> : <span class="hljs-string">"jens"</span>, <span class="hljs-string">"last"</span>: <span class="hljs-string">"jensen"</span> }});
{
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"ids/16020"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"16020"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"16020"</span>
}
arangosh&gt; db.ids.save({ <span class="hljs-string">"name"</span> : { <span class="hljs-string">"first"</span> : <span class="hljs-string">"hans"</span>, <span class="hljs-string">"last"</span>: <span class="hljs-string">"jensen"</span> }});
{
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"ids/16023"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"16023"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"16023"</span>
}
arangosh&gt; db.ids.save({ <span class="hljs-string">"name"</span> : { <span class="hljs-string">"first"</span> : <span class="hljs-string">"hans"</span>, <span class="hljs-string">"last"</span>: <span class="hljs-string">"hansen"</span> }});
[ArangoError <span class="hljs-number">1210</span>: cannot create <span class="hljs-built_in">document</span>, unique constraint violated]

View File

@ -21,6 +21,7 @@ def brTrim(text):
swagger = None
fileFilter = None
blockFilter = None
dokuBlocks = [{},{}]
thisVerb = {}
route = ''
@ -102,6 +103,15 @@ def getRestBodyParam():
rc += addText
return rc
def getRestDescription():
#print >>sys.stderr, "RESTDESCRIPTION"
if thisVerb['description']:
#print >> sys.stderr, thisVerb['description']
return thisVerb['description']
else:
#print >> sys.stderr, "ELSE"
return ""
def getRestReplyBodyParam(param):
rc = "\n**Reply Body**\n"
@ -115,31 +125,33 @@ def getRestReplyBodyParam(param):
SIMPL_REPL_DICT = {
"@RESTDESCRIPTION" : "",
"@RESTURLPARAMETERS" : "\n**Path Parameters**\n",
"@RESTQUERYPARAMETERS" : "\n**Query Parameters**\n",
"@RESTHEADERPARAMETERS" : "\n**Header Parameters**\n",
"@RESTRETURNCODES" : "\n**Return Codes**\n",
"@PARAMS" : "\n**Parameters**\n",
"@RESTPARAMS" : "",
"@RESTURLPARAMS" : "\n**Path Parameters**\n",
"@RESTQUERYPARAMS" : "\n**Query Parameters**\n",
"@RESTBODYPARAM" : getRestBodyParam,
"@RESTREPLYBODY" : getRestReplyBodyParam,
"@RESTQUERYPARAM" : "@RESTPARAM",
"@RESTURLPARAM" : "@RESTPARAM",
"@PARAM" : "@RESTPARAM",
"@RESTHEADERPARAM" : "@RESTPARAM",
"@EXAMPLES" : "\n**Examples**\n",
"@RESTPARAMETERS" : ""
"\\" : "\\\\",
"@RESTDESCRIPTION" : getRestDescription,
"@RESTURLPARAMETERS" : "\n**Path Parameters**\n",
"@RESTQUERYPARAMETERS" : "\n**Query Parameters**\n",
"@RESTHEADERPARAMETERS" : "\n**Header Parameters**\n",
"@RESTRETURNCODES" : "\n**Return Codes**\n",
"@PARAMS" : "\n**Parameters**\n",
"@RESTPARAMS" : "",
"@RESTURLPARAMS" : "\n**Path Parameters**\n",
"@RESTQUERYPARAMS" : "\n**Query Parameters**\n",
"@RESTBODYPARAM" : "", #getRestBodyParam,
"@RESTREPLYBODY" : getRestReplyBodyParam,
"@RESTQUERYPARAM" : "@RESTPARAM",
"@RESTURLPARAM" : "@RESTPARAM",
"@PARAM" : "@RESTPARAM",
"@RESTHEADERPARAM" : "@RESTPARAM",
"@EXAMPLES" : "\n**Examples**\n",
"@RESTPARAMETERS" : ""
}
SIMPLE_RX = re.compile(
r'''
\\| # the backslash...
@RESTDESCRIPTION| # -> <empty>
@RESTURLPARAMETERS| # -> \n**Path Parameters**\n
@RESTQUERYPARAMETERS| # -> \n**Query Parameters**\n
@RESTHEADERPARAMETERS| # -> \n**Header Parameters**\n
@RESTBODYPARAM| # -> call post body param
@RESTBODYPARAM| # empty now, comes with the post body -> call post body param
@RESTRETURNCODES| # -> \n**Return Codes**\n
@PARAMS| # -> \n**Parameters**\n
@RESTPARAMS| # -> <empty>
@ -157,7 +169,7 @@ r'''
def SimpleRepl(match):
m = match.group(0)
#print 'xxxxx ' + m
# print 'xxxxx [%s]' % m
try:
n = SIMPL_REPL_DICT[m]
if n == None:
@ -210,7 +222,7 @@ RX = [
# Error codes replace
(re.compile(r"(####)#+"), r""),
# (re.compile(r"- (\w+):\s*@LIT{(.+)}"), r"\n*\g<1>* - **\g<2>**:"),
(re.compile(r"(.+),(\d+),\"(.+)\",\"(.+)\""), r"\n*\g<2>* - **\g<3>**: \g<4>"),
(re.compile(r"(.+),(\d+),\"(.+)\",\"(.+)\""), r"\n- *\g<2>* - **\g<1>** - **\g<3>**: \n \g<4>"),
(re.compile(r"TODOSWAGGER.*"),r"")
]
@ -231,7 +243,7 @@ RX2 = [
match_RESTHEADER = re.compile(r"@RESTHEADER\{(.*)\}")
match_RESTRETURNCODE = re.compile(r"@RESTRETURNCODE\{(.*)\}")
have_RESTBODYPARAM = re.compile(r"@RESTBODYPARAM")
have_RESTBODYPARAM = re.compile(r"@RESTBODYPARAM|@RESTDESCRIPTION")
have_RESTREPLYBODY = re.compile(r"@RESTREPLYBODY")
have_RESTSTRUCT = re.compile(r"@RESTSTRUCT")
remove_MULTICR = re.compile(r'\n\n\n*')
@ -275,6 +287,7 @@ def replaceCode(lines, blockName):
foundRestBodyParam = False
foundRestReplyBodyParam = False
lineR = lines.split('\n')
#print lineR
l = len(lineR)
r = 0
while (r < l):
@ -283,10 +296,13 @@ def replaceCode(lines, blockName):
if foundRestBodyParam:
lineR[r] = ''
else:
lineR[r] = '@RESTBODYPARAM'
lineR[r] = '@RESTDESCRIPTION'
foundRestBodyParam = True
r+=1
while (len(lineR[r]) > 1):
while ((len(lineR[r]) > 0) and
((lineR[r][0] != '@') or
have_RESTBODYPARAM.search(lineR[r]))):
# print "xxx - %d %s" %(len(lineR[r]), lineR[r])
lineR[r] = ''
r+=1
@ -316,7 +332,8 @@ def replaceCode(lines, blockName):
r+=1
r+=1
lines = "\n".join(lineR)
#print "x" * 70
#print lines
lines = SIMPLE_RX.sub(SimpleRepl, lines)
for (oneRX, repl) in RX2:
@ -389,9 +406,10 @@ def findStartCode(fd,full_path):
#print textFile
match = re.findall(r'@startDocuBlock\s*(\w+)', textFile)
if match:
if match:
for find in match:
#print "8"*80
#print find
textFile = replaceText(textFile, full_path, find)
#print textFile
@ -407,10 +425,11 @@ def findStartCode(fd,full_path):
outFD.truncate()
outFD.write(textFile)
outFD.close()
#JSF_put_api_replication_synchronize
def replaceText(text, pathOfFile, searchText):
''' reads the mdpp and generates the md '''
#print '7'*80
global dokuBlocks
if not searchText in dokuBlocks[0]:
print >> sys.stderr, "Failed to locate the docublock '%s' for replacing it into the file '%s'\n have:" % (searchText, pathOfFile)
@ -418,7 +437,9 @@ def replaceText(text, pathOfFile, searchText):
print >> sys.stderr, '*' * 80
print >> sys.stderr, text
exit(1)
#print '7'*80
#print dokuBlocks[0][searchText]
#print '7'*80
rc= re.sub("@startDocuBlock\s+"+ searchText + "(?:\s+|$)", dokuBlocks[0][searchText], text)
return rc
@ -495,10 +516,24 @@ def loadDokuBlocks():
#if state == STATE_SEARCH_START:
# print dokuBlocks[thisBlockType].keys()
if blockFilter != None:
remainBlocks= {}
print "filtering blocks"
for oneBlock in dokuBlocks[0]:
if blockFilter.match(oneBlock) != None:
print "found block %s" % oneBlock
#print dokuBlocks[0][oneBlock]
remainBlocks[oneBlock] = dokuBlocks[0][oneBlock]
dokuBlocks[0] = remainBlocks
for oneBlock in dokuBlocks[0]:
try:
#print "processing %s" % oneBlock
dokuBlocks[0][oneBlock] = replaceCode(dokuBlocks[0][oneBlock], oneBlock)
#print "6"*80
#print dokuBlocks[0][oneBlock]
#print "6"*80
except:
print >>sys.stderr, "while parsing :\n" + oneBlock
raise
@ -521,6 +556,9 @@ if __name__ == '__main__':
if len(sys.argv) > 4 and sys.argv[4].strip() != '':
print "filtering " + sys.argv[4]
fileFilter = re.compile(sys.argv[4])
if len(sys.argv) > 5 and sys.argv[5].strip() != '':
print "filtering Docublocks: " + sys.argv[5]
blockFilter = re.compile(sys.argv[5])
f=open(swaggerJson, 'rU')
swagger= json.load(f)
f.close()

View File

@ -955,6 +955,10 @@ static void JS_GetCoordinators(
TRI_V8_TRY_CATCH_BEGIN(isolate);
v8::HandleScope scope(isolate);
if (!ServerState::instance()->isRunningInCluster()) {
TRI_V8_THROW_EXCEPTION_INTERNAL("ArangoDB is not running in cluster mode");
}
if (args.Length() != 0) {
TRI_V8_THROW_EXCEPTION_USAGE("getCoordinators()");
}

View File

@ -113,6 +113,10 @@ void UpgradeFeature::start() {
// and force shutdown
if (_upgrade || init->isInitDatabase() || init->restoreAdmin()) {
if (init->isInitDatabase()) {
*_result = EXIT_SUCCESS;
}
server()->beginShutdown();
}
}
@ -172,6 +176,8 @@ void UpgradeFeature::changeAdminPassword(std::string const& defaultPassword) {
// and return from the context
LOG(TRACE) << "finished to restore admin user";
*_result = EXIT_SUCCESS;
}
void UpgradeFeature::upgradeDatabase(std::string const& defaultPassword) {

View File

@ -1043,7 +1043,7 @@ static void JS_WarningAql(v8::FunctionCallbackInfo<v8::Value> const& args) {
// note: we may not have a query if the AQL functions are called without
// a query, e.g. during tests
int code = static_cast<int>(TRI_ObjectToInt64(args[0]));
std::string const&& message = TRI_ObjectToString(args[1]);
std::string const message = TRI_ObjectToString(args[1]);
auto query = static_cast<arangodb::aql::Query*>(v8g->_query);
query->registerWarning(code, message.c_str());

View File

@ -46,8 +46,8 @@ ClientFeature::ClientFeature(application_features::ApplicationServer* server,
_password(""),
_connectionTimeout(connectionTimeout),
_requestTimeout(requestTimeout),
_maxPacketSize(128 * 1024 * 1024),
_sslProtocol(4),
_section("server"),
_retries(DEFAULT_RETRIES),
_warn(false) {
setOptional(true);
@ -56,79 +56,88 @@ ClientFeature::ClientFeature(application_features::ApplicationServer* server,
}
void ClientFeature::collectOptions(std::shared_ptr<ProgramOptions> options) {
options->addSection(_section, "Configure a connection to the server");
options->addSection("server", "Configure a connection to the server");
options->addOption("--" + _section + ".database",
options->addOption("--server.database",
"database name to use when connecting",
new StringParameter(&_databaseName));
options->addOption("--" + _section + ".authentication",
options->addOption("--server.authentication",
"require authentication when connecting",
new BooleanParameter(&_authentication));
options->addOption("--" + _section + ".username",
options->addOption("--server.username",
"username to use when connecting",
new StringParameter(&_username));
options->addOption(
"--" + _section + ".endpoint",
"--server.endpoint",
"endpoint to connect to, use 'none' to start without a server",
new StringParameter(&_endpoint));
options->addOption("--" + _section + ".password",
"password to use when connection. If not specified and "
options->addOption("--server.password",
"password to use when connecting. If not specified and "
"authentication is required, the user will be prompted "
"for a password.",
"for a password",
new StringParameter(&_password));
options->addOption("--" + _section + ".connection-timeout",
options->addOption("--server.connection-timeout",
"connection timeout in seconds",
new DoubleParameter(&_connectionTimeout));
options->addOption("--" + _section + ".request-timeout",
options->addOption("--server.request-timeout",
"request timeout in seconds",
new DoubleParameter(&_requestTimeout));
options->addOption("--server.max-packet-size",
"maximum packet size (in bytes) for client/server communication",
new UInt64Parameter(&_maxPacketSize));
std::unordered_set<uint64_t> sslProtocols = {1, 2, 3, 4};
std::unordered_set<uint64_t> sslProtocols = {1, 2, 3, 4, 5};
options->addOption("--" + _section + ".ssl-protocol",
"1 = SSLv2, 2 = SSLv23, 3 = SSLv3, 4 = TLSv1",
options->addSection("ssl", "Configure SSL communication");
options->addOption("--ssl.protocol",
"ssl protocol (1 = SSLv2, 2 = SSLv23, 3 = SSLv3, 4 = "
"TLSv1, 5 = TLSV1.2 (recommended)",
new DiscreteValuesParameter<UInt64Parameter>(
&_sslProtocol, sslProtocols));
}
void ClientFeature::validateOptions(std::shared_ptr<ProgramOptions> options) {
// if a username is specified explicitly, assume authentication is desired
if (options->processingResult().touched(_section + ".username")) {
if (options->processingResult().touched("server.username")) {
_authentication = true;
}
// check timeouts
if (_connectionTimeout < 0.0) {
LOG(FATAL) << "invalid value for --" << _section
<< ".connect-timeout, must be >= 0";
LOG(FATAL) << "invalid value for --server.connect-timeout, must be >= 0";
FATAL_ERROR_EXIT();
} else if (_connectionTimeout == 0.0) {
_connectionTimeout = LONG_TIMEOUT;
}
if (_requestTimeout < 0.0) {
LOG(FATAL) << "invalid value for --" << _section
<< ".request-timeout, must be positive";
LOG(FATAL) << "invalid value for --server.request-timeout, must be positive";
FATAL_ERROR_EXIT();
} else if (_requestTimeout == 0.0) {
_requestTimeout = LONG_TIMEOUT;
}
if (_maxPacketSize < 1 * 1024 * 1024) {
LOG(FATAL) << "invalid value for --server.max-packet-size, must be at least 1 MB";
FATAL_ERROR_EXIT();
}
// username must be non-empty
if (_username.empty()) {
LOG(FATAL) << "no value specified for --" << _section << ".username";
LOG(FATAL) << "no value specified for --server.username";
FATAL_ERROR_EXIT();
}
// ask for a password
if (_authentication &&
!options->processingResult().touched(_section + ".password")) {
!options->processingResult().touched("server.password")) {
usleep(10 * 1000);
try {
@ -145,6 +154,8 @@ void ClientFeature::validateOptions(std::shared_ptr<ProgramOptions> options) {
std::cout << "Please specify a password: " << std::flush;
std::getline(std::cin, _password);
}
SimpleHttpClient::setMaxPacketSize(_maxPacketSize);
}
std::unique_ptr<GeneralClientConnection> ClientFeature::createConnection() {

View File

@ -62,6 +62,7 @@ class ClientFeature final : public application_features::ApplicationFeature,
void setPassword(std::string const& value) { _password = value; }
double connectionTimeout() const { return _connectionTimeout; }
double requestTimeout() const { return _requestTimeout; }
uint64_t maxPacketSize() const { return _maxPacketSize; }
uint64_t sslProtocol() const { return _sslProtocol; }
public:
@ -89,10 +90,10 @@ class ClientFeature final : public application_features::ApplicationFeature,
std::string _password;
double _connectionTimeout;
double _requestTimeout;
uint64_t _maxPacketSize;
uint64_t _sslProtocol;
private:
std::string _section;
size_t _retries;
bool _warn;
};

View File

@ -1,426 +1,432 @@
include(GNUInstallDirs)
# etc -------------------------------
set(ETCDIR "" CACHE path "System configuration directory (defaults to prefix/etc)")
# /etc -------------------------------
if (ETCDIR STREQUAL "")
set(ETCDIR_NATIVE "${CMAKE_INSTALL_PREFIX}/etc/arangodb3")
set(ETCDIR_INSTALL "etc/arangodb3")
else ()
set(ETCDIR_NATIVE "${ETCDIR}/arangodb3")
set(ETCDIR_INSTALL "${ETCDIR}/arangodb3")
endif ()
# MS stuff ---------------------------
if (MSVC)
file(TO_NATIVE_PATH "${ETCDIR_INSTALL}" ETCDIR_INSTALL)
STRING(REGEX REPLACE "\\\\" "\\\\\\\\" ETCDIR_ESCAPED "${ETCDIR_INSTALL}")
else ()
file(TO_NATIVE_PATH "${ETCDIR_NATIVE}" ETCDIR_NATIVE)
STRING(REGEX REPLACE "\\\\" "\\\\\\\\" ETCDIR_ESCAPED "${ETCDIR_NATIVE}")
endif ()
add_definitions("-D_SYSCONFDIR_=\"${ETCDIR_ESCAPED}\"")
# /var
set(VARDIR ""
CACHE path
"System configuration directory (defaults to prefix/var/arangodb3)"
)
if (VARDIR STREQUAL "")
set(VARDIR_NATIVE "${CMAKE_INSTALL_PREFIX}/var")
set(VARDIR_INSTALL "var")
else ()
set(VARDIR_NATIVE "${VARDIR}")
set(VARDIR_INSTALL "${VARDIR}")
endif ()
file(TO_NATIVE_PATH "${VARDIR_NATIVE}" VARDIR_NATIVE)
# database directory
FILE(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/var/lib/arangodb3")
# apps
FILE(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/var/lib/arangodb3-apps")
# logs
FILE(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/var/log/arangodb")
# package
set(TRI_PKGDATADIR "${CMAKE_INSTALL_PREFIX}/share/arangodb3")
# resources
set(TRI_RESOURCEDIR "resources")
# sbinaries
if (MSVC)
set(ARANGODB_INSTALL_SBIN "bin")
set(TRI_SBINDIR "${CMAKE_INSTALL_PREFIX}/bin")
else ()
set(ARANGODB_INSTALL_SBIN "sbin")
set(TRI_SBINDIR "${CMAKE_INSTALL_PREFIX}/sbin")
endif ()
# MS Windows -------------------------------------------------------------------
if (MSVC)
# icon paths
file(TO_NATIVE_PATH
"${TRI_RESOURCEDIR}/Icons/arangodb.ico"
RELATIVE_ARANGO_ICON
)
file(TO_NATIVE_PATH
"${PROJECT_SOURCE_DIR}/Installation/Windows/Icons/arangodb.bmp"
ARANGO_IMG
)
file(TO_NATIVE_PATH
"${PROJECT_SOURCE_DIR}/Installation/Windows/Icons/arangodb.ico"
ARANGO_ICON
)
STRING(REGEX REPLACE "\\\\" "\\\\\\\\" ARANGO_IMG "${ARANGO_IMG}")
STRING(REGEX REPLACE "\\\\" "\\\\\\\\" ARANGO_ICON "${ARANGO_ICON}")
STRING(REGEX REPLACE "\\\\" "\\\\\\\\" RELATIVE_ARANGO_ICON "${RELATIVE_ARANGO_ICON}")
# versioning
set(CMAKE_MODULE_PATH
${CMAKE_MODULE_PATH}
${PROJECT_SOURCE_DIR}/Installation/Windows/version
)
include("${PROJECT_SOURCE_DIR}/Installation/Windows/version/generate_product_version.cmake")
endif ()
################################################################################
## INSTALL
################################################################################
# Global macros ----------------------------------------------------------------
macro (generate_root_config name)
FILE(READ ${PROJECT_SOURCE_DIR}/etc/arangodb3/${name}.conf.in FileContent)
STRING(REPLACE "@PKGDATADIR@" "@ROOTDIR@/share/arangodb3"
FileContent "${FileContent}")
STRING(REPLACE "@LOCALSTATEDIR@" "@ROOTDIR@/var"
FileContent "${FileContent}")
STRING(REPLACE "@SBINDIR@" "@ROOTDIR@/bin"
FileContent "${FileContent}")
STRING(REPLACE "@LIBEXECDIR@/arangodb3" "@ROOTDIR@/bin"
FileContent "${FileContent}")
STRING(REPLACE "@SYSCONFDIR@" "@ROOTDIR@/etc/arangodb3"
FileContent "${FileContent}")
if (MSVC)
STRING(REPLACE "@PROGRAM_SUFFIX@" ".exe"
FileContent "${FileContent}")
STRING(REGEX REPLACE "[\r\n]file =" "\n# file ="
FileContent "${FileContent}")
endif ()
FILE(WRITE ${PROJECT_BINARY_DIR}/etc/arangodb3/${name}.conf "${FileContent}")
endmacro ()
# generates config file using the configured paths ----------------------------
macro (generate_path_config name)
FILE(READ ${PROJECT_SOURCE_DIR}/etc/arangodb3/${name}.conf.in FileContent)
STRING(REPLACE "@PKGDATADIR@" "${TRI_PKGDATADIR}"
FileContent "${FileContent}")
STRING(REPLACE "@LOCALSTATEDIR@" "${VARDIR_NATIVE}"
FileContent "${FileContent}")
FILE(WRITE ${PROJECT_BINARY_DIR}/etc/arangodb3/${name}.conf "${FileContent}")
endmacro ()
# installs a config file -------------------------------------------------------
macro (install_config name)
if (MSVC OR DARWIN)
generate_root_config(${name})
else ()
generate_path_config(${name})
endif ()
install(
FILES ${PROJECT_BINARY_DIR}/etc/arangodb3/${name}.conf
DESTINATION ${ETCDIR_INSTALL})
endmacro ()
# installs a readme file converting EOL ----------------------------------------
macro (install_readme input where output)
FILE(READ ${PROJECT_SOURCE_DIR}/${input} FileContent)
STRING(REPLACE "\r" "" FileContent "${FileContent}")
if (MSVC)
STRING(REPLACE "\n" "\r\n" FileContent "${FileContent}")
endif ()
FILE(WRITE ${PROJECT_BINARY_DIR}/${output} "${FileContent}")
install(
FILES ${PROJECT_BINARY_DIR}/${output}
DESTINATION ${where})
endmacro ()
# installs a link to an executable ---------------------------------------------
macro (install_command_alias name where alias)
if (MSVC)
add_custom_command(
TARGET ${name}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${name}>
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$(Configuration)/${alias}.exe)
install(
PROGRAMS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$(Configuration)/${alias}.exe
DESTINATION ${where})
else ()
add_custom_command(
TARGET ${name}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E create_symlink ${name}
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${alias})
install(
PROGRAMS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${alias}
DESTINATION ${where})
endif ()
endmacro ()
# sub directories --------------------------------------------------------------
#if(BUILD_STATIC_EXECUTABLES)
# set(CMAKE_EXE_LINKER_FLAGS -static)
# set(CMAKE_FIND_LIBRARY_SUFFIXES .a)
# set(CMAKE_EXE_LINK_DYNAMIC_C_FLAGS) # remove -Wl,-Bdynamic
# set(CMAKE_EXE_LINK_DYNAMIC_CXX_FLAGS)
# set(CMAKE_SHARED_LIBRARY_C_FLAGS) # remove -fPIC
# set(CMAKE_SHARED_LIBRARY_CXX_FLAGS)
# set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS) # remove -rdynamic
# set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS)
# # Maybe this works as well, haven't tried yet.
# # set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS FALSE)
#else(BUILD_STATIC_EXECUTABLES)
# # Set RPATH to use for installed targets; append linker search path
# set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LOFAR_LIBDIR}")
# set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
#endif(BUILD_STATIC_EXECUTABLES)
#--------------------------------------------------------------------------------
#get_cmake_property(_variableNames VARIABLES)
#foreach (_variableName ${_variableNames})
# message(STATUS "${_variableName}=${${_variableName}}")
#endforeach ()
#--------------------------------------------------------------------------------
# install ----------------------------------------------------------------------
install(DIRECTORY ${PROJECT_SOURCE_DIR}/Documentation/man/
DESTINATION share/man)
if (MSVC)
install_readme(README . README.txt)
install_readme(README.md . README.md)
install_readme(README.windows . README.windows.txt)
endif ()
if (MSVC)
install_readme(LICENSE . LICENSE.txt)
install_readme(LICENSES-OTHER-COMPONENTS.md . LICENSES-OTHER-COMPONENTS.md)
else ()
install_readme(README share/doc/arangodb3 README)
install_readme(README.md share/doc/arangodb3 README.md)
install_readme(LICENSE share/doc/arangodb3 LICENSE)
install_readme(LICENSES-OTHER-COMPONENTS.md share/doc/arangodb3 LICENSES-OTHER-COMPONENTS.md)
endif ()
# Build package ----------------------------------------------------------------
if (NOT(MSVC))
set(CPACK_SET_DESTDIR ON)
endif()
find_program(DH_INSTALLINIT dh_installinit)
find_program(FAKEROOT fakeroot)
if (DH_INSTALLINIT AND FAKEROOT)
add_custom_target(prepare_debian)
SET(DEBIAN_CONTROL_EXTRA_BASENAMES
postinst
preinst
postrm
prerm
)
SET(DEBIAN_WORK_DIR "${PROJECT_BINARY_DIR}/debian-work")
add_custom_command(TARGET prepare_debian POST_BUILD
COMMAND ${CMAKE_COMMAND} -E
remove_directory "${DEBIAN_WORK_DIR}"
)
foreach (_DEBIAN_CONTROL_EXTRA_BASENAME ${DEBIAN_CONTROL_EXTRA_BASENAMES})
SET(RELATIVE_NAME "debian/${_DEBIAN_CONTROL_EXTRA_BASENAME}")
SET(SRCFILE "${PROJECT_SOURCE_DIR}/Installation/${RELATIVE_NAME}")
SET(DESTFILE "${DEBIAN_WORK_DIR}/${RELATIVE_NAME}")
list(APPEND DEBIAN_CONTROL_EXTRA_SRC "${SRCFILE}")
list(APPEND DEBIAN_CONTROL_EXTRA_DEST "${DESTFILE}")
add_custom_command(TARGET prepare_debian POST_BUILD
COMMAND ${CMAKE_COMMAND} -E
copy ${SRCFILE} ${DESTFILE})
endforeach()
add_custom_command(TARGET prepare_debian POST_BUILD
COMMAND ${CMAKE_COMMAND} -E
copy "${PROJECT_SOURCE_DIR}/Installation/debian/control" "${DEBIAN_WORK_DIR}/debian/control"
)
add_custom_command(TARGET prepare_debian POST_BUILD
COMMAND ${CMAKE_COMMAND} -E
copy "${PROJECT_SOURCE_DIR}/Installation/debian/compat" "${DEBIAN_WORK_DIR}/debian/compat"
)
add_custom_command(TARGET prepare_debian POST_BUILD
COMMAND fakeroot "${DH_INSTALLINIT}" -o 2>/dev/null
WORKING_DIRECTORY ${DEBIAN_WORK_DIR}
)
add_custom_command(TARGET prepare_debian POST_BUILD
COMMAND fakeroot dh_installdeb
WORKING_DIRECTORY ${DEBIAN_WORK_DIR}
)
endif()
# General
set(CPACK_PACKAGE_NAME "arangodb3")
set(CPACK_PACKAGE_VENDOR "ArangoDB GmbH")
set(CPACK_PACKAGE_CONTACT "info@arangodb.com")
set(CPACK_PACKAGE_VERSION "${ARANGODB_VERSION}")
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
set(CPACK_STRIP_FILES "ON")
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64")
set(CPACK_DEBIAN_PACKAGE_SECTION "database")
set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "a multi-purpose NoSQL database
A distributed free and open-source database with a flexible data model for documents,
graphs, and key-values. Build high performance applications using a convenient
SQL-like query language or JavaScript extensions.
.
Copyright: 2014-2016 by ArangoDB GmbH
Copyright: 2012-2013 by triAGENS GmbH
ArangoDB Software
www.arangodb.com
")
SET(CPACK_DEBIAN_PACKAGE_CONFLICTS "arangodb")
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
set(CPACK_DEBIAN_COMPRESSION_TYPE "xz")
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://www.arangodb.com/")
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${PROJECT_BINARY_DIR}/debian-work/debian/${CPACK_PACKAGE_NAME}/DEBIAN/postinst;${PROJECT_BINARY_DIR}/debian-work/debian/${CPACK_PACKAGE_NAME}/DEBIAN/preinst;${PROJECT_BINARY_DIR}/debian-work/debian/${CPACK_PACKAGE_NAME}/DEBIAN/postrm;${PROJECT_BINARY_DIR}/debian-work/debian/${CPACK_PACKAGE_NAME}/DEBIAN/prerm;")
set(CPACK_BUNDLE_NAME "${CPACK_PACKAGE_NAME}")
configure_file("${PROJECT_SOURCE_DIR}/Installation/MacOSX/Bundle/Info.plist.in" "${CMAKE_CURRENT_BINARY_DIR}/Info.plist")
set(CPACK_BUNDLE_PLIST "${CMAKE_CURRENT_BINARY_DIR}/Info.plist")
set(CPACK_BUNDLE_ICON "${PROJECT_SOURCE_DIR}/Installation/MacOSX/Bundle/icon.icns")
set(CPACK_BUNDLE_STARTUP_COMMAND "${PROJECT_SOURCE_DIR}/Installation/MacOSX/Bundle/arangodb-cli.sh")
# MS installer
if (MSVC)
set(CPACK_PACKAGE_NAME "ArangoDB")
set(CPACK_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Installation/Windows/Templates")
set(CPACK_PLUGIN_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Installation/Windows/Plugins")
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL 1)
set(BITS 64)
if (CMAKE_CL_64)
SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64")
SET(BITS 64)
else ()
SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES")
SET(BITS 32)
endif ()
message(STATUS "ARANGO_IMG: ${ARANGO_IMG}")
message(STATUS "ARANGO_ICON: ${ARANGO_ICON}")
message(STATUS "RELATIVE_ARANGO_ICON: ${RELATIVE_ARANGO_ICON}")
install(
DIRECTORY "${PROJECT_SOURCE_DIR}/Installation/Windows/Icons"
DESTINATION ${TRI_RESOURCEDIR})
set(CPACK_NSIS_DEFINES "
!define BITS ${BITS}
!define TRI_FRIENDLY_SVC_NAME '${ARANGODB_FRIENDLY_STRING}'
!define TRI_AARDVARK_URL 'http://127.0.0.1:8529'
")
set(CPACK_PACKAGE_ICON ${ARANGO_ICON})
set(CPACK_NSIS_MODIFY_PATH ON)
set(CPACK_NSIS_MUI_ICON ${ARANGO_ICON})
set(CPACK_NSIS_MUI_UNIICON ${ARANGO_ICON})
set(CPACK_NSIS_INSTALLED_ICON_NAME ${RELATIVE_ARANGO_ICON})
set(CPACK_NSIS_DISPLAY_NAME, ${ARANGODB_DISPLAY_NAME})
set(CPACK_NSIS_HELP_LINK ${ARANGODB_HELP_LINK})
set(CPACK_NSIS_URL_INFO_ABOUT ${ARANGODB_URL_INFO_ABOUT})
set(CPACK_NSIS_CONTACT ${ARANGODB_CONTACT})
endif ()
configure_file("${CMAKE_SOURCE_DIR}/Installation/cmake/CMakeCPackOptions.cmake.in"
"${CMAKE_BINARY_DIR}/CMakeCPackOptions.cmake" @ONLY)
set(CPACK_PROJECT_CONFIG_FILE "${CMAKE_BINARY_DIR}/CMakeCPackOptions.cmake")
if (NOT(MSVC))
# components
install(
FILES ${PROJECT_SOURCE_DIR}/Installation/debian/arangodb.init
PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
DESTINATION ${ETCDIR}/init.d
RENAME arangodb3
COMPONENT debian-extras
)
endif()
# Custom targets ----------------------------------------------------------------
# love
add_custom_target (love
COMMENT "ArangoDB loves you."
COMMAND ""
)
# Finally: user cpack
include(CPack)
################################################################################
### @brief install client-side JavaScript files
################################################################################
install(
DIRECTORY ${PROJECT_SOURCE_DIR}/js/common ${PROJECT_SOURCE_DIR}/js/client
DESTINATION share/arangodb3/js
FILES_MATCHING PATTERN "*.js"
REGEX "^.*/common/test-data$" EXCLUDE
REGEX "^.*/common/tests$" EXCLUDE
REGEX "^.*/client/tests$" EXCLUDE)
################################################################################
### @brief install server-side JavaScript files
################################################################################
install(
DIRECTORY ${PROJECT_SOURCE_DIR}/js/actions ${PROJECT_SOURCE_DIR}/js/apps ${PROJECT_SOURCE_DIR}/js/contrib ${PROJECT_SOURCE_DIR}/js/node ${PROJECT_SOURCE_DIR}/js/server
DESTINATION share/arangodb3/js
REGEX "^.*/server/tests$" EXCLUDE
REGEX "^.*/aardvark/APP/node_modules$" EXCLUDE
)
################################################################################
### @brief install log directory
################################################################################
install(
DIRECTORY ${PROJECT_BINARY_DIR}/var/log/arangodb
DESTINATION ${VARDIR_INSTALL}/log)
################################################################################
### @brief install database directory
################################################################################
install(
DIRECTORY ${PROJECT_BINARY_DIR}/var/lib/arangodb3
DESTINATION ${VARDIR_INSTALL}/lib)
################################################################################
### @brief install apps directory
################################################################################
install(
DIRECTORY ${PROJECT_BINARY_DIR}/var/lib/arangodb3-apps
DESTINATION ${VARDIR_INSTALL}/lib)
include(GNUInstallDirs)
# install the visual studio runtime:
if (MSVC)
include(InstallRequiredSystemLibraries)
INSTALL(FILES ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION bin COMPONENT Libraries)
endif()
# etc -------------------------------
set(ETCDIR "" CACHE path "System configuration directory (defaults to prefix/etc)")
# /etc -------------------------------
if (ETCDIR STREQUAL "")
set(ETCDIR_NATIVE "${CMAKE_INSTALL_PREFIX}/etc/arangodb3")
set(ETCDIR_INSTALL "etc/arangodb3")
else ()
set(ETCDIR_NATIVE "${ETCDIR}/arangodb3")
set(ETCDIR_INSTALL "${ETCDIR}/arangodb3")
endif ()
# MS stuff ---------------------------
if (MSVC)
file(TO_NATIVE_PATH "${ETCDIR_INSTALL}" ETCDIR_INSTALL)
STRING(REGEX REPLACE "\\\\" "\\\\\\\\" ETCDIR_ESCAPED "${ETCDIR_INSTALL}")
else ()
file(TO_NATIVE_PATH "${ETCDIR_NATIVE}" ETCDIR_NATIVE)
STRING(REGEX REPLACE "\\\\" "\\\\\\\\" ETCDIR_ESCAPED "${ETCDIR_NATIVE}")
endif ()
add_definitions("-D_SYSCONFDIR_=\"${ETCDIR_ESCAPED}\"")
# /var
set(VARDIR ""
CACHE path
"System configuration directory (defaults to prefix/var/arangodb3)"
)
if (VARDIR STREQUAL "")
set(VARDIR_NATIVE "${CMAKE_INSTALL_PREFIX}/var")
set(VARDIR_INSTALL "var")
else ()
set(VARDIR_NATIVE "${VARDIR}")
set(VARDIR_INSTALL "${VARDIR}")
endif ()
file(TO_NATIVE_PATH "${VARDIR_NATIVE}" VARDIR_NATIVE)
# database directory
FILE(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/var/lib/arangodb3")
# apps
FILE(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/var/lib/arangodb3-apps")
# logs
FILE(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/var/log/arangodb")
# package
set(TRI_PKGDATADIR "${CMAKE_INSTALL_PREFIX}/share/arangodb3")
# resources
set(TRI_RESOURCEDIR "resources")
# sbinaries
if (MSVC)
set(ARANGODB_INSTALL_SBIN "bin")
set(TRI_SBINDIR "${CMAKE_INSTALL_PREFIX}/bin")
else ()
set(ARANGODB_INSTALL_SBIN "sbin")
set(TRI_SBINDIR "${CMAKE_INSTALL_PREFIX}/sbin")
endif ()
# MS Windows -------------------------------------------------------------------
if (MSVC)
# icon paths
file(TO_NATIVE_PATH
"${TRI_RESOURCEDIR}/Icons/arangodb.ico"
RELATIVE_ARANGO_ICON
)
file(TO_NATIVE_PATH
"${PROJECT_SOURCE_DIR}/Installation/Windows/Icons/arangodb.bmp"
ARANGO_IMG
)
file(TO_NATIVE_PATH
"${PROJECT_SOURCE_DIR}/Installation/Windows/Icons/arangodb.ico"
ARANGO_ICON
)
STRING(REGEX REPLACE "\\\\" "\\\\\\\\" ARANGO_IMG "${ARANGO_IMG}")
STRING(REGEX REPLACE "\\\\" "\\\\\\\\" ARANGO_ICON "${ARANGO_ICON}")
STRING(REGEX REPLACE "\\\\" "\\\\\\\\" RELATIVE_ARANGO_ICON "${RELATIVE_ARANGO_ICON}")
# versioning
set(CMAKE_MODULE_PATH
${CMAKE_MODULE_PATH}
${PROJECT_SOURCE_DIR}/Installation/Windows/version
)
include("${PROJECT_SOURCE_DIR}/Installation/Windows/version/generate_product_version.cmake")
endif ()
################################################################################
## INSTALL
################################################################################
# Global macros ----------------------------------------------------------------
macro (generate_root_config name)
FILE(READ ${PROJECT_SOURCE_DIR}/etc/arangodb3/${name}.conf.in FileContent)
STRING(REPLACE "@PKGDATADIR@" "@ROOTDIR@/share/arangodb3"
FileContent "${FileContent}")
STRING(REPLACE "@LOCALSTATEDIR@" "@ROOTDIR@/var"
FileContent "${FileContent}")
STRING(REPLACE "@SBINDIR@" "@ROOTDIR@/bin"
FileContent "${FileContent}")
STRING(REPLACE "@LIBEXECDIR@/arangodb3" "@ROOTDIR@/bin"
FileContent "${FileContent}")
STRING(REPLACE "@SYSCONFDIR@" "@ROOTDIR@/etc/arangodb3"
FileContent "${FileContent}")
if (MSVC)
STRING(REPLACE "@PROGRAM_SUFFIX@" ".exe"
FileContent "${FileContent}")
STRING(REGEX REPLACE "[\r\n]file =" "\n# file ="
FileContent "${FileContent}")
endif ()
FILE(WRITE ${PROJECT_BINARY_DIR}/etc/arangodb3/${name}.conf "${FileContent}")
endmacro ()
# generates config file using the configured paths ----------------------------
macro (generate_path_config name)
FILE(READ ${PROJECT_SOURCE_DIR}/etc/arangodb3/${name}.conf.in FileContent)
STRING(REPLACE "@PKGDATADIR@" "${TRI_PKGDATADIR}"
FileContent "${FileContent}")
STRING(REPLACE "@LOCALSTATEDIR@" "${VARDIR_NATIVE}"
FileContent "${FileContent}")
FILE(WRITE ${PROJECT_BINARY_DIR}/etc/arangodb3/${name}.conf "${FileContent}")
endmacro ()
# installs a config file -------------------------------------------------------
macro (install_config name)
if (MSVC OR (DARWIN AND NOT HOMEBREW))
generate_root_config(${name})
else ()
generate_path_config(${name})
endif ()
install(
FILES ${PROJECT_BINARY_DIR}/etc/arangodb3/${name}.conf
DESTINATION ${ETCDIR_INSTALL})
endmacro ()
# installs a readme file converting EOL ----------------------------------------
macro (install_readme input where output)
FILE(READ ${PROJECT_SOURCE_DIR}/${input} FileContent)
STRING(REPLACE "\r" "" FileContent "${FileContent}")
if (MSVC)
STRING(REPLACE "\n" "\r\n" FileContent "${FileContent}")
endif ()
FILE(WRITE ${PROJECT_BINARY_DIR}/${output} "${FileContent}")
install(
FILES ${PROJECT_BINARY_DIR}/${output}
DESTINATION ${where})
endmacro ()
# installs a link to an executable ---------------------------------------------
macro (install_command_alias name where alias)
if (MSVC)
add_custom_command(
TARGET ${name}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${name}>
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIGURATION>/${alias}.exe)
install(
PROGRAMS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIGURATION>/${alias}.exe
DESTINATION ${where})
else ()
add_custom_command(
TARGET ${name}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E create_symlink ${name}
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${alias})
install(
PROGRAMS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${alias}
DESTINATION ${where})
endif ()
endmacro ()
# sub directories --------------------------------------------------------------
#if(BUILD_STATIC_EXECUTABLES)
# set(CMAKE_EXE_LINKER_FLAGS -static)
# set(CMAKE_FIND_LIBRARY_SUFFIXES .a)
# set(CMAKE_EXE_LINK_DYNAMIC_C_FLAGS) # remove -Wl,-Bdynamic
# set(CMAKE_EXE_LINK_DYNAMIC_CXX_FLAGS)
# set(CMAKE_SHARED_LIBRARY_C_FLAGS) # remove -fPIC
# set(CMAKE_SHARED_LIBRARY_CXX_FLAGS)
# set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS) # remove -rdynamic
# set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS)
# # Maybe this works as well, haven't tried yet.
# # set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS FALSE)
#else(BUILD_STATIC_EXECUTABLES)
# # Set RPATH to use for installed targets; append linker search path
# set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LOFAR_LIBDIR}")
# set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
#endif(BUILD_STATIC_EXECUTABLES)
#--------------------------------------------------------------------------------
#get_cmake_property(_variableNames VARIABLES)
#foreach (_variableName ${_variableNames})
# message(STATUS "${_variableName}=${${_variableName}}")
#endforeach ()
#--------------------------------------------------------------------------------
# install ----------------------------------------------------------------------
install(DIRECTORY ${PROJECT_SOURCE_DIR}/Documentation/man/
DESTINATION share/man)
if (MSVC)
install_readme(README . README.txt)
install_readme(README.md . README.md)
install_readme(README.windows . README.windows.txt)
endif ()
if (MSVC)
install_readme(LICENSE . LICENSE.txt)
install_readme(LICENSES-OTHER-COMPONENTS.md . LICENSES-OTHER-COMPONENTS.md)
else ()
install_readme(README share/doc/arangodb3 README)
install_readme(README.md share/doc/arangodb3 README.md)
install_readme(LICENSE share/doc/arangodb3 LICENSE)
install_readme(LICENSES-OTHER-COMPONENTS.md share/doc/arangodb3 LICENSES-OTHER-COMPONENTS.md)
endif ()
# Build package ----------------------------------------------------------------
if (NOT(MSVC))
set(CPACK_SET_DESTDIR ON)
endif()
find_program(DH_INSTALLINIT dh_installinit)
find_program(FAKEROOT fakeroot)
if (DH_INSTALLINIT AND FAKEROOT)
add_custom_target(prepare_debian)
SET(DEBIAN_CONTROL_EXTRA_BASENAMES
postinst
preinst
postrm
prerm
)
SET(DEBIAN_WORK_DIR "${PROJECT_BINARY_DIR}/debian-work")
add_custom_command(TARGET prepare_debian POST_BUILD
COMMAND ${CMAKE_COMMAND} -E
remove_directory "${DEBIAN_WORK_DIR}"
)
foreach (_DEBIAN_CONTROL_EXTRA_BASENAME ${DEBIAN_CONTROL_EXTRA_BASENAMES})
SET(RELATIVE_NAME "debian/${_DEBIAN_CONTROL_EXTRA_BASENAME}")
SET(SRCFILE "${PROJECT_SOURCE_DIR}/Installation/${RELATIVE_NAME}")
SET(DESTFILE "${DEBIAN_WORK_DIR}/${RELATIVE_NAME}")
list(APPEND DEBIAN_CONTROL_EXTRA_SRC "${SRCFILE}")
list(APPEND DEBIAN_CONTROL_EXTRA_DEST "${DESTFILE}")
add_custom_command(TARGET prepare_debian POST_BUILD
COMMAND ${CMAKE_COMMAND} -E
copy ${SRCFILE} ${DESTFILE})
endforeach()
add_custom_command(TARGET prepare_debian POST_BUILD
COMMAND ${CMAKE_COMMAND} -E
copy "${PROJECT_SOURCE_DIR}/Installation/debian/control" "${DEBIAN_WORK_DIR}/debian/control"
)
add_custom_command(TARGET prepare_debian POST_BUILD
COMMAND ${CMAKE_COMMAND} -E
copy "${PROJECT_SOURCE_DIR}/Installation/debian/compat" "${DEBIAN_WORK_DIR}/debian/compat"
)
add_custom_command(TARGET prepare_debian POST_BUILD
COMMAND fakeroot "${DH_INSTALLINIT}" -o 2>/dev/null
WORKING_DIRECTORY ${DEBIAN_WORK_DIR}
)
add_custom_command(TARGET prepare_debian POST_BUILD
COMMAND fakeroot dh_installdeb
WORKING_DIRECTORY ${DEBIAN_WORK_DIR}
)
endif()
# General
set(CPACK_PACKAGE_NAME "arangodb3")
set(CPACK_PACKAGE_VENDOR "ArangoDB GmbH")
set(CPACK_PACKAGE_CONTACT "info@arangodb.com")
set(CPACK_PACKAGE_VERSION "${ARANGODB_VERSION}")
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
set(CPACK_STRIP_FILES "ON")
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64")
set(CPACK_DEBIAN_PACKAGE_SECTION "database")
set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "a multi-purpose NoSQL database
A distributed free and open-source database with a flexible data model for documents,
graphs, and key-values. Build high performance applications using a convenient
SQL-like query language or JavaScript extensions.
.
Copyright: 2014-2016 by ArangoDB GmbH
Copyright: 2012-2013 by triAGENS GmbH
ArangoDB Software
www.arangodb.com
")
SET(CPACK_DEBIAN_PACKAGE_CONFLICTS "arangodb")
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
set(CPACK_DEBIAN_COMPRESSION_TYPE "xz")
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://www.arangodb.com/")
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${PROJECT_BINARY_DIR}/debian-work/debian/${CPACK_PACKAGE_NAME}/DEBIAN/postinst;${PROJECT_BINARY_DIR}/debian-work/debian/${CPACK_PACKAGE_NAME}/DEBIAN/preinst;${PROJECT_BINARY_DIR}/debian-work/debian/${CPACK_PACKAGE_NAME}/DEBIAN/postrm;${PROJECT_BINARY_DIR}/debian-work/debian/${CPACK_PACKAGE_NAME}/DEBIAN/prerm;")
set(CPACK_BUNDLE_NAME "${CPACK_PACKAGE_NAME}")
configure_file("${PROJECT_SOURCE_DIR}/Installation/MacOSX/Bundle/Info.plist.in" "${CMAKE_CURRENT_BINARY_DIR}/Info.plist")
set(CPACK_BUNDLE_PLIST "${CMAKE_CURRENT_BINARY_DIR}/Info.plist")
set(CPACK_BUNDLE_ICON "${PROJECT_SOURCE_DIR}/Installation/MacOSX/Bundle/icon.icns")
set(CPACK_BUNDLE_STARTUP_COMMAND "${PROJECT_SOURCE_DIR}/Installation/MacOSX/Bundle/arangodb-cli.sh")
# MS installer
if (MSVC)
set(CPACK_PACKAGE_NAME "ArangoDB")
set(CPACK_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Installation/Windows/Templates")
set(CPACK_PLUGIN_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Installation/Windows/Plugins")
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL 1)
set(BITS 64)
if (CMAKE_CL_64)
SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64")
SET(BITS 64)
else ()
SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES")
SET(BITS 32)
endif ()
message(STATUS "ARANGO_IMG: ${ARANGO_IMG}")
message(STATUS "ARANGO_ICON: ${ARANGO_ICON}")
message(STATUS "RELATIVE_ARANGO_ICON: ${RELATIVE_ARANGO_ICON}")
install(
DIRECTORY "${PROJECT_SOURCE_DIR}/Installation/Windows/Icons"
DESTINATION ${TRI_RESOURCEDIR})
set(CPACK_NSIS_DEFINES "
!define BITS ${BITS}
!define TRI_FRIENDLY_SVC_NAME '${ARANGODB_FRIENDLY_STRING}'
!define TRI_AARDVARK_URL 'http://127.0.0.1:8529'
")
set(CPACK_PACKAGE_ICON ${ARANGO_ICON})
set(CPACK_NSIS_MODIFY_PATH ON)
set(CPACK_NSIS_MUI_ICON ${ARANGO_ICON})
set(CPACK_NSIS_MUI_UNIICON ${ARANGO_ICON})
set(CPACK_NSIS_INSTALLED_ICON_NAME ${RELATIVE_ARANGO_ICON})
set(CPACK_NSIS_DISPLAY_NAME, ${ARANGODB_DISPLAY_NAME})
set(CPACK_NSIS_HELP_LINK ${ARANGODB_HELP_LINK})
set(CPACK_NSIS_URL_INFO_ABOUT ${ARANGODB_URL_INFO_ABOUT})
set(CPACK_NSIS_CONTACT ${ARANGODB_CONTACT})
endif ()
configure_file("${CMAKE_SOURCE_DIR}/Installation/cmake/CMakeCPackOptions.cmake.in"
"${CMAKE_BINARY_DIR}/CMakeCPackOptions.cmake" @ONLY)
set(CPACK_PROJECT_CONFIG_FILE "${CMAKE_BINARY_DIR}/CMakeCPackOptions.cmake")
if (NOT(MSVC))
# components
install(
FILES ${PROJECT_SOURCE_DIR}/Installation/debian/arangodb.init
PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
DESTINATION ${ETCDIR}/init.d
RENAME arangodb3
COMPONENT debian-extras
)
endif()
# Custom targets ----------------------------------------------------------------
# love
add_custom_target (love
COMMENT "ArangoDB loves you."
COMMAND ""
)
# Finally: user cpack
include(CPack)
################################################################################
### @brief install client-side JavaScript files
################################################################################
install(
DIRECTORY ${PROJECT_SOURCE_DIR}/js/common ${PROJECT_SOURCE_DIR}/js/client
DESTINATION share/arangodb3/js
FILES_MATCHING PATTERN "*.js"
REGEX "^.*/common/test-data$" EXCLUDE
REGEX "^.*/common/tests$" EXCLUDE
REGEX "^.*/client/tests$" EXCLUDE)
################################################################################
### @brief install server-side JavaScript files
################################################################################
install(
DIRECTORY ${PROJECT_SOURCE_DIR}/js/actions ${PROJECT_SOURCE_DIR}/js/apps ${PROJECT_SOURCE_DIR}/js/contrib ${PROJECT_SOURCE_DIR}/js/node ${PROJECT_SOURCE_DIR}/js/server
DESTINATION share/arangodb3/js
REGEX "^.*/server/tests$" EXCLUDE
REGEX "^.*/aardvark/APP/node_modules$" EXCLUDE
)
################################################################################
### @brief install log directory
################################################################################
install(
DIRECTORY ${PROJECT_BINARY_DIR}/var/log/arangodb
DESTINATION ${VARDIR_INSTALL}/log)
################################################################################
### @brief install database directory
################################################################################
install(
DIRECTORY ${PROJECT_BINARY_DIR}/var/lib/arangodb3
DESTINATION ${VARDIR_INSTALL}/lib)
################################################################################
### @brief install apps directory
################################################################################
install(
DIRECTORY ${PROJECT_BINARY_DIR}/var/lib/arangodb3-apps
DESTINATION ${VARDIR_INSTALL}/lib)

View File

@ -297,8 +297,26 @@
this.buildSubNavBar(menus);
},
buildNodesSubNav: function(activeKey, disabled) {
var menus = {
Overview: {
route: '#nodes'
},
Shards: {
route: '#shards'
}
};
menus[activeKey].active = true;
if (disabled) {
menus[disabled].disabled = true;
}
this.buildSubNavBar(menus);
},
scaleability: undefined,
/*
//nav for cluster/nodes view
buildNodesSubNav: function(type) {
@ -363,6 +381,7 @@
this.buildSubNavBar(menus);
},
*/
//nav for collection view
buildCollectionSubNav: function(collectionName, activeKey) {

View File

@ -1,7 +1,6 @@
<script id="shardsView.ejs" type="text/template">
<div id="shardsContent" class="innerContent">
<% var genClass = 'pure-u-1-3'; %>
<% var disabled = ' '; %>
@ -23,12 +22,13 @@
</div>
</div>
<% var counter = 0; %>
<% _.each(collection.Plan, function(shard, name) { %>
<div class="pure-g pure-table pure-table-body">
<div class="pure-table-row disabled">
<div class="<%= genClass %> left"><%= name %></div>
<% if (name === Object.keys(collection.Current)[0]) { %>
<% if (name === Object.keys(collection.Current)[counter]) { %>
<div class="<%= genClass %> positive left"><%= shard.leader %></div>
<% } else { %>
<div class="<%= genClass %> negative left"><%= shard.leader %></div>
@ -40,6 +40,8 @@
<% } %>
</div>
</div>
<% counter++; %>
<% }); %>
<% }); %>

View File

@ -29,7 +29,7 @@
//start polling with interval
this.intervalFunction = window.setInterval(function() {
if (window.location.hash === '#nodes') {
self.render();
self.render(false);
}
}, this.interval);
}
@ -45,7 +45,7 @@
window.App.navigate("#node/" + encodeURIComponent(name), {trigger: true});
},
render: function () {
render: function (navi) {
var self = this;
@ -75,6 +75,9 @@
}
});
if (navi !== false) {
arangoHelper.buildNodesSubNav('Overview');
}
},
continueRender: function(nodes, scaling) {

View File

@ -30,7 +30,7 @@
}
},
render: function () {
render: function (navi) {
var self = this;
@ -48,6 +48,10 @@
arangoHelper.arangoError("Cluster", "Could not fetch sharding information.");
}
});
if (navi !== false) {
arangoHelper.buildNodesSubNav('Shards');
}
},
continueRender: function(collections) {

View File

@ -74,7 +74,11 @@ module.exports = class SyntheticResponse {
if (typeof data === 'string' || data instanceof Buffer) {
this._raw.body = data;
} else if (typeof data === 'object') {
this._raw.body = JSON.stringify(data);
if (this.context.isDevelopment) {
this._raw.body = JSON.stringify(data, null, 2);
} else {
this._raw.body = JSON.stringify(data);
}
} else {
this._raw.body = String(data);
}
@ -118,7 +122,11 @@ module.exports = class SyntheticResponse {
}
if (!dataIsBuffer) {
if (typeof data === 'object') {
data = JSON.stringify(data);
if (this.context.isDevelopment) {
data = JSON.stringify(data, null, 2);
} else {
data = JSON.stringify(data);
}
} else {
data = String(data);
}

View File

@ -37,15 +37,11 @@ using namespace arangodb::basics;
namespace arangodb {
namespace httpclient {
////////////////////////////////////////////////////////////////////////////////
/// @brief empty map, used for headers
////////////////////////////////////////////////////////////////////////////////
std::unordered_map<std::string, std::string> const SimpleHttpClient::NO_HEADERS {};
// -----------------------------------------------------------------------------
// constructors and destructors
// -----------------------------------------------------------------------------
/// @brief default value for max packet size
size_t SimpleHttpClient::MaxPacketSize = 128 * 1024 * 1024;
SimpleHttpClient::SimpleHttpClient(GeneralClientConnection* connection,
double requestTimeout, bool warn)
@ -60,7 +56,7 @@ SimpleHttpClient::SimpleHttpClient(GeneralClientConnection* connection,
_locationRewriter({nullptr, nullptr}),
_nextChunkedSize(0),
_result(nullptr),
_maxPacketSize(128 * 1024 * 1024),
_maxPacketSize(MaxPacketSize),
_maxRetries(3),
_retryWaitTime(1 * 1000 * 1000),
_retryMessage(),

View File

@ -43,8 +43,8 @@ class GeneralClientConnection;
class SimpleHttpClient {
private:
SimpleHttpClient(SimpleHttpClient const&);
SimpleHttpClient& operator=(SimpleHttpClient const&);
SimpleHttpClient(SimpleHttpClient const&) = delete;
SimpleHttpClient& operator=(SimpleHttpClient const&) = delete;
public:
//////////////////////////////////////////////////////////////////////////////
@ -176,6 +176,14 @@ class SimpleHttpClient {
_locationRewriter.data = data;
_locationRewriter.func = func;
}
//////////////////////////////////////////////////////////////////////////////
/// @brief set the value for max packet size
//////////////////////////////////////////////////////////////////////////////
static void setMaxPacketSize(size_t value) {
MaxPacketSize = value;
}
//////////////////////////////////////////////////////////////////////////////
/// @brief enable or disable keep-alive
@ -408,7 +416,7 @@ class SimpleHttpClient {
std::vector<std::pair<std::string, std::string>> _pathToBasicAuth;
size_t const _maxPacketSize;
size_t _maxPacketSize;
public:
size_t _maxRetries;
@ -434,6 +442,9 @@ class SimpleHttpClient {
// empty map, used for headers
static std::unordered_map<std::string, std::string> const NO_HEADERS;
// default value for max packet size
static size_t MaxPacketSize;
};
}
}

View File

@ -40,8 +40,8 @@ SslServerFeature::SslServerFeature(application_features::ApplicationServer* serv
_keyfile(),
_sessionCache(false),
_cipherList(),
_protocol(TLS_V1),
_options(
_sslProtocol(TLS_V1),
_sslOptions(
(long)(SSL_OP_TLS_ROLLBACK_BUG | SSL_OP_CIPHER_SERVER_PREFERENCE)),
_ecdhCurve("prime256v1"),
_sslContext(nullptr) {
@ -75,16 +75,17 @@ void SslServerFeature::collectOptions(std::shared_ptr<ProgramOptions> options) {
"ssl cipers to use, see OpenSSL documentation",
new StringParameter(&_cipherList));
std::unordered_set<uint64_t> sslProtocols = {1, 2, 3, 4};
std::unordered_set<uint64_t> sslProtocols = {1, 2, 3, 4, 5};
options->addOption("--ssl.protocol",
"ssl protocol (1 = SSLv2, 2 = SSLv23, 3 = SSLv3, 4 = "
"TLSv1, 5 = TLSV1.2 (recommended)",
new UInt64Parameter(&_protocol));
new DiscreteValuesParameter<UInt64Parameter>(
&_sslProtocol, sslProtocols));
options->addHiddenOption(
"--ssl.options", "ssl connection options, see OpenSSL documentation",
new DiscreteValuesParameter<UInt64Parameter>(&_options, sslProtocols));
new DiscreteValuesParameter<UInt64Parameter>(&_sslOptions, sslProtocols));
options->addOption(
"--ssl.ecdh-curve",
@ -95,7 +96,7 @@ void SslServerFeature::collectOptions(std::shared_ptr<ProgramOptions> options) {
void SslServerFeature::prepare() {
createSslContext();
LOG(INFO) << "using SSL options: " << stringifySslOptions(_options);
LOG(INFO) << "using SSL options: " << stringifySslOptions(_sslOptions);
if (!_cipherList.empty()) {
LOG(INFO) << "using SSL cipher-list '" << _cipherList << "'";
@ -128,14 +129,14 @@ void SslServerFeature::createSslContext() {
}
// validate protocol
if (_protocol <= SSL_UNKNOWN || _protocol >= SSL_LAST) {
if (_sslProtocol <= SSL_UNKNOWN || _sslProtocol >= SSL_LAST) {
LOG(FATAL) << "invalid SSL protocol version specified. Please use a valid "
"value for '--ssl.protocol.'";
FATAL_ERROR_EXIT();
}
LOG(DEBUG) << "using SSL protocol version '"
<< protocolName((protocol_e)_protocol) << "'";
<< protocolName((protocol_e)_sslProtocol) << "'";
if (!FileUtils::exists(_keyfile)) {
LOG(FATAL) << "unable to find SSL keyfile '" << _keyfile << "'";
@ -143,7 +144,7 @@ void SslServerFeature::createSslContext() {
}
// create context
_sslContext = ::sslContext(protocol_e(_protocol), _keyfile);
_sslContext = ::sslContext(protocol_e(_sslProtocol), _keyfile);
if (_sslContext == nullptr) {
LOG(FATAL) << "failed to create SSL context, cannot create HTTPS server";
@ -159,7 +160,7 @@ void SslServerFeature::createSslContext() {
}
// set options
SSL_CTX_set_options(_sslContext, (long)_options);
SSL_CTX_set_options(_sslContext, (long)_sslOptions);
if (!_cipherList.empty()) {
if (SSL_CTX_set_cipher_list(_sslContext, _cipherList.c_str()) != 1) {

View File

@ -45,8 +45,8 @@ class SslServerFeature final : public application_features::ApplicationFeature {
std::string _keyfile;
bool _sessionCache;
std::string _cipherList;
uint64_t _protocol;
uint64_t _options;
uint64_t _sslProtocol;
uint64_t _sslOptions;
std::string _ecdhCurve;
private:

View File

@ -272,6 +272,15 @@ def LIT(txt, wordboundary = ['<b>','</b>']):
return r.sub(subpattern, txt)
################################################################################
### @brief LIT
###
### \ -> needs to become \\ so \n's in the text can be differciated.
################################################################################
def BACKSLASH(txt):
return txt.replace('\\', '\\\\\\')
################################################################################
### @brief Typegraphy
################################################################################
@ -292,7 +301,7 @@ def Typography(txt):
r = rc(r"""@ref [a-zA-Z0-9]+""", MS)
txt = r.sub("the manual", txt)
txt = re.sub(r"@endDocuBlock", "", txt)
txt = BACKSLASH(txt);
return txt
################################################################################