1
0
Fork 0

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

This commit is contained in:
Michael Hackstein 2015-06-16 10:46:37 +02:00
commit df75ae48f9
12 changed files with 165 additions and 86 deletions

View File

@ -144,6 +144,13 @@ FOR u IN users
SORT u.lastName, u.firstName, u.id DESC
RETURN u
```
Note that constant *SORT* expressions can be used to indicate that no particular
sort order is desired. Constant *SORT* expressions will be optimized away by the AQL
optimizer during optimization, but specifying them explicitly may enable further
optimizations if the optimizer does not need to take into account any particular
sort order.
!SUBSECTION LIMIT
The *LIMIT* statement allows slicing the result array using an
@ -420,7 +427,14 @@ added in front of the *COLLECT*. This is because the *hash* variant of *COLLECT*
sorted input. Instead, a *SORT* statement will be added after the *COLLECT* to sort its output.
This *SORT* statement may be optimized away again in later stages.
If the sort order of the *COLLECT* is irrelevant to the user, adding the extra instruction *SORT null*
after the *COLLECT* will allow the optimizer to remove the sorts altogether.
after the *COLLECT* will allow the optimizer to remove the sorts altogether:
```
FOR u IN users
COLLECT age = u.age
SORT null /* note: will be optimized away */
RETURN age
```
Which *COLLECT* variant is used by the optimizer depends on the optimizer's cost estimations. The
created plans with the different *COLLECT* variants will be shipped through the regular optimization

View File

@ -40,6 +40,10 @@
using namespace triagens::aql;
using Json = triagens::basics::Json;
// -----------------------------------------------------------------------------
// --SECTION-- private functions
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @brief register warning
////////////////////////////////////////////////////////////////////////////////
@ -204,6 +208,10 @@ static void AppendAsString (triagens::basics::StringBuffer& buffer,
}
}
// -----------------------------------------------------------------------------
// --SECTION-- AQL function bindings
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @brief function IS_NULL
////////////////////////////////////////////////////////////////////////////////
@ -211,7 +219,7 @@ static void AppendAsString (triagens::basics::StringBuffer& buffer,
AqlValue Functions::IsNull (triagens::aql::Query*,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
Json j(parameters.extractArrayMember(trx, collection, 0, false));
return AqlValue(new Json(j.isNull()));
}
@ -223,7 +231,7 @@ AqlValue Functions::IsNull (triagens::aql::Query*,
AqlValue Functions::IsBool (triagens::aql::Query*,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
Json j(parameters.extractArrayMember(trx, collection, 0, false));
return AqlValue(new Json(j.isBoolean()));
}
@ -235,7 +243,7 @@ AqlValue Functions::IsBool (triagens::aql::Query*,
AqlValue Functions::IsNumber (triagens::aql::Query*,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
Json j(parameters.extractArrayMember(trx, collection, 0, false));
return AqlValue(new Json(j.isNumber()));
}
@ -247,7 +255,7 @@ AqlValue Functions::IsNumber (triagens::aql::Query*,
AqlValue Functions::IsString (triagens::aql::Query*,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
Json j(parameters.extractArrayMember(trx, collection, 0, false));
return AqlValue(new Json(j.isString()));
}
@ -259,7 +267,7 @@ AqlValue Functions::IsString (triagens::aql::Query*,
AqlValue Functions::IsArray (triagens::aql::Query*,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
Json j(parameters.extractArrayMember(trx, collection, 0, false));
return AqlValue(new Json(j.isArray()));
}
@ -271,7 +279,7 @@ AqlValue Functions::IsArray (triagens::aql::Query*,
AqlValue Functions::IsObject (triagens::aql::Query*,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
Json j(parameters.extractArrayMember(trx, collection, 0, false));
return AqlValue(new Json(j.isObject()));
}
@ -283,7 +291,7 @@ AqlValue Functions::IsObject (triagens::aql::Query*,
AqlValue Functions::Length (triagens::aql::Query*,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
Json j(parameters.extractArrayMember(trx, collection, 0, false));
TRI_json_t const* json = j.json();
@ -347,7 +355,7 @@ AqlValue Functions::Length (triagens::aql::Query*,
AqlValue Functions::Concat (triagens::aql::Query*,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
triagens::basics::StringBuffer buffer(TRI_UNKNOWN_MEM_ZONE, 24);
size_t const n = parameters.arraySize();
@ -398,7 +406,7 @@ AqlValue Functions::Concat (triagens::aql::Query*,
AqlValue Functions::Passthru (triagens::aql::Query*,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
Json j(parameters.extractArrayMember(trx, collection, 0, true));
auto jr = new Json(TRI_UNKNOWN_MEM_ZONE, j.json());
@ -413,7 +421,7 @@ AqlValue Functions::Passthru (triagens::aql::Query*,
AqlValue Functions::Unset (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
Json value(parameters.extractArrayMember(trx, collection, 0, false));
if (! value.isObject()) {
@ -471,7 +479,7 @@ AqlValue Functions::Unset (triagens::aql::Query* query,
AqlValue Functions::Keep (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
Json value(parameters.extractArrayMember(trx, collection, 0, false));
if (! value.isObject()) {
@ -521,7 +529,7 @@ AqlValue Functions::Keep (triagens::aql::Query* query,
AqlValue Functions::Merge (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
size_t const n = parameters.arraySize();
if (n == 0) {
@ -569,7 +577,7 @@ AqlValue Functions::Merge (triagens::aql::Query* query,
AqlValue Functions::Has (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
size_t const n = parameters.arraySize();
if (n < 2) {
@ -609,7 +617,7 @@ AqlValue Functions::Has (triagens::aql::Query* query,
AqlValue Functions::Attributes (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
size_t const n = parameters.arraySize();
if (n < 1) {
@ -686,7 +694,7 @@ AqlValue Functions::Attributes (triagens::aql::Query* query,
AqlValue Functions::Values (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
size_t const n = parameters.arraySize();
if (n < 1) {
@ -745,7 +753,7 @@ AqlValue Functions::Values (triagens::aql::Query* query,
AqlValue Functions::Min (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
Json value(parameters.extractArrayMember(trx, collection, 0, false));
if (! value.isArray()) {
@ -791,7 +799,7 @@ AqlValue Functions::Min (triagens::aql::Query* query,
AqlValue Functions::Max (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
Json value(parameters.extractArrayMember(trx, collection, 0, false));
if (! value.isArray()) {
@ -837,7 +845,7 @@ AqlValue Functions::Max (triagens::aql::Query* query,
AqlValue Functions::Sum (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
Json value(parameters.extractArrayMember(trx, collection, 0, false));
if (! value.isArray()) {
@ -884,7 +892,7 @@ AqlValue Functions::Sum (triagens::aql::Query* query,
AqlValue Functions::Average (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
Json value(parameters.extractArrayMember(trx, collection, 0, false));
if (! value.isArray()) {
@ -934,7 +942,7 @@ AqlValue Functions::Average (triagens::aql::Query* query,
AqlValue Functions::Md5 (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
Json value(parameters.extractArrayMember(trx, collection, 0, false));
triagens::basics::StringBuffer buffer(TRI_UNKNOWN_MEM_ZONE);
@ -963,7 +971,7 @@ AqlValue Functions::Md5 (triagens::aql::Query* query,
AqlValue Functions::Sha1 (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
Json value(parameters.extractArrayMember(trx, collection, 0, false));
triagens::basics::StringBuffer buffer(TRI_UNKNOWN_MEM_ZONE);
@ -992,7 +1000,7 @@ AqlValue Functions::Sha1 (triagens::aql::Query* query,
AqlValue Functions::Unique (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
if (parameters.arraySize() != 1) {
THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "UNIQUE");
}
@ -1048,7 +1056,7 @@ AqlValue Functions::Unique (triagens::aql::Query* query,
AqlValue Functions::Union (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
size_t const n = parameters.arraySize();
if (parameters.arraySize() < 2) {
@ -1109,7 +1117,7 @@ AqlValue Functions::Union (triagens::aql::Query* query,
AqlValue Functions::UnionDistinct (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
if (parameters.arraySize() < 2) {
THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "UNION_DISTINCT");
}
@ -1199,7 +1207,7 @@ AqlValue Functions::UnionDistinct (triagens::aql::Query* query,
AqlValue Functions::Intersection (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection,
AqlValue const parameters) {
FunctionParameters parameters) {
size_t const n = parameters.arraySize();
if (parameters.arraySize() < 2) {

View File

@ -42,42 +42,48 @@ namespace triagens {
class Query;
// -----------------------------------------------------------------------------
// --SECTION-- public typedefs
// -----------------------------------------------------------------------------
typedef AqlValue const FunctionParameters;
typedef std::function<AqlValue(triagens::aql::Query*,
triagens::arango::AqlTransaction*,
TRI_document_collection_t const*,
AqlValue const)> FunctionImplementation;
FunctionParameters)> FunctionImplementation;
// -----------------------------------------------------------------------------
// --SECTION-- AQL function bindings
// -----------------------------------------------------------------------------
struct Functions {
////////////////////////////////////////////////////////////////////////////////
/// @brief functions
////////////////////////////////////////////////////////////////////////////////
static AqlValue IsNull (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue IsBool (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue IsNumber (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue IsString (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue IsArray (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue IsObject (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue Length (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue Concat (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue Passthru (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue Unset (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue Keep (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue Merge (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue Has (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue Attributes (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue Values (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue Min (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue Max (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue Sum (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue Average (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue Md5 (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue Sha1 (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue Unique (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue Union (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue UnionDistinct (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue Intersection (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue IsNull (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue IsBool (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue IsNumber (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue IsString (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue IsArray (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue IsObject (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Length (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Concat (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Passthru (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Unset (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Keep (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Merge (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Has (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Attributes (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Values (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Min (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Max (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Sum (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Average (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Md5 (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Sha1 (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Unique (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Union (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue UnionDistinct (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Intersection (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
};
}

View File

@ -54,6 +54,14 @@
};
},
calculateCenterDivHeight: function() {
var navigation = $('.navbar').height();
var footer = $('.footer').height();
var windowHeight = $(window).height();
return windowHeight - footer - navigation - 110;
},
fixTooltips: function (selector, placement) {
$(selector).tooltip({
placement: placement,
@ -2168,8 +2176,6 @@ window.StatisticsCollection = Backbone.Collection.extend({
{async: true}
).done(
function (d) {
console.log(url + urlParams);
console.log(d);
if (d.times.length > 0) {
self.isUpdating = true;
self.mergeHistory(d);

View File

@ -4104,7 +4104,6 @@ svg.graph-viewer {
pointer-events: none; }
div.gv-background {
height: 685px;
position: relative; }
.link > line {

View File

@ -54,6 +54,14 @@
};
},
calculateCenterDivHeight: function() {
var navigation = $('.navbar').height();
var footer = $('.footer').height();
var windowHeight = $(window).height();
return windowHeight - footer - navigation - 110;
},
fixTooltips: function (selector, placement) {
$(selector).tooltip({
placement: placement,

View File

@ -141,7 +141,7 @@ global.tutorial = require("org/arangodb/tutorial");
/// @brief prints help
////////////////////////////////////////////////////////////////////////////////
(function() {
var initHelp = function() {
var internal = require("internal");
if (internal.db) {
@ -158,11 +158,16 @@ global.tutorial = require("org/arangodb/tutorial");
internal.print("Type 'tutorial' for a tutorial or 'help' to see common examples");
}
}
};
////////////////////////////////////////////////////////////////////////////////
/// @brief read rc file
////////////////////////////////////////////////////////////////////////////////
if (typeof window === 'undefined') {
// We're in arangosh
initHelp();
// these variables are not defined in the browser context
if (
global.IS_EXECUTE_SCRIPT ||
@ -194,7 +199,7 @@ global.tutorial = require("org/arangodb/tutorial");
delete global.IS_UNIT_TESTS;
delete global.IS_JS_LINT;
} catch (e) {}
}());
}
// -----------------------------------------------------------------------------
// --SECTION-- END-OF-FILE

View File

@ -45,7 +45,10 @@
};
var width = $("#content").width() - 75;
$("#content").html("");
this.ui = new GraphViewerUI($("#content")[0], adapterConfig, width, 680, {
var height = arangoHelper.calculateCenterDivHeight();
this.ui = new GraphViewerUI($("#content")[0], adapterConfig, width, height, {
nodeShaper: {
label: "_key",
color: {
@ -56,6 +59,8 @@
}, true);
$('.contentDiv').height(height);
},
handleResize: function(w) {

View File

@ -70,7 +70,6 @@ svg.graph-viewer {
}
div.gv-background {
height: 685px;
position: relative;
}

View File

@ -141,7 +141,7 @@ global.tutorial = require("org/arangodb/tutorial");
/// @brief prints help
////////////////////////////////////////////////////////////////////////////////
(function() {
var initHelp = function() {
var internal = require("internal");
if (internal.db) {
@ -158,11 +158,16 @@ global.tutorial = require("org/arangodb/tutorial");
internal.print("Type 'tutorial' for a tutorial or 'help' to see common examples");
}
}
};
////////////////////////////////////////////////////////////////////////////////
/// @brief read rc file
////////////////////////////////////////////////////////////////////////////////
if (typeof window === 'undefined') {
// We're in arangosh
initHelp();
// these variables are not defined in the browser context
if (
global.IS_EXECUTE_SCRIPT ||
@ -194,7 +199,7 @@ global.tutorial = require("org/arangodb/tutorial");
delete global.IS_UNIT_TESTS;
delete global.IS_JS_LINT;
} catch (e) {}
}());
}
// -----------------------------------------------------------------------------
// --SECTION-- END-OF-FILE

View File

@ -133,6 +133,7 @@ struct TRI_log_appender_t {
virtual void closeLog () = 0;
virtual char* details () = 0;
virtual TRI_log_appender_type_e type () = 0;
virtual char const* typeName () = 0;
char* _contentFilter; // an optional content filter for log messages
TRI_log_severity_e _severityFilter; // appender will care only about message with a specific severity. set to TRI_LOG_SEVERITY_UNKNOWN to catch all
@ -854,14 +855,16 @@ static void LogThread (char const* func,
}
else
#endif
{
try {
std::string message("format string is corrupt: [");
message += fmt + std::string("] - GenerateMessage failed");
TRI_GetBacktrace(message);
DisarmFormatString(message);
TRI_Log(func, file, line, TRI_LOG_LEVEL_WARNING, TRI_LOG_SEVERITY_HUMAN, message.c_str());
return;
}
catch (...) {
}
return;
}
if (n < (int) (sizeof(buffer) - len)) {
// static buffer was big enough
@ -901,11 +904,15 @@ static void LogThread (char const* func,
#endif
{
TRI_Free(TRI_UNKNOWN_MEM_ZONE, p);
std::string message("format string is corrupt: [");
message += fmt + std::string("] ");
TRI_GetBacktrace(message);
DisarmFormatString(message);
TRI_Log(func, file, line, TRI_LOG_LEVEL_WARNING, TRI_LOG_SEVERITY_HUMAN, message.c_str());
try {
std::string message("format string is corrupt: [");
message += fmt + std::string("] ");
TRI_GetBacktrace(message);
DisarmFormatString(message);
TRI_Log(func, file, line, TRI_LOG_LEVEL_WARNING, TRI_LOG_SEVERITY_HUMAN, message.c_str());
}
catch (...) {
}
return;
}
}
@ -1327,6 +1334,10 @@ struct log_appender_file_t : public TRI_log_appender_t {
return APPENDER_TYPE_FILE;
}
char const* typeName () override final {
return "file";
}
private:
void writeLogFile (int, char const*, ssize_t);
@ -1613,6 +1624,10 @@ struct log_appender_syslog_t : public TRI_log_appender_t {
TRI_log_appender_type_e type () override final {
return APPENDER_TYPE_SYSLOG;
}
char const* typeName () override final {
return "syslog";
}
private:
@ -1932,7 +1947,13 @@ void TRI_ReopenLogging () {
MUTEX_LOCKER(AppendersLock);
for (auto& it : Appenders) {
it->reopenLog();
try {
it->reopenLog();
}
catch (...) {
// silently catch this error (we shouldn't try to log an error about a
// logging error as this will get us into trouble with mutexes etc.)
}
}
}

View File

@ -154,17 +154,25 @@ void DispatcherThread::run () {
status = Job::status_t(Job::JOB_FAILED);
}
catch (std::exception const& ex) {
catch (std::bad_alloc const& ex) {
try {
Exception ex2(TRI_ERROR_INTERNAL, string("job failed with unknown in work: ") + ex.what(), __FILE__, __LINE__);
Exception ex2(TRI_ERROR_OUT_OF_MEMORY, string("job failed with unknown error in work(): ") + ex.what(), __FILE__, __LINE__);
job->handleError(ex2);
LOG_WARNING("caught exception in work(): %s", ex2.what());
}
catch (Exception const& ex) {
LOG_WARNING("caught error while handling error: %s", ex.what());
catch (...) {
LOG_WARNING("caught error while handling error!");
}
catch (std::exception const& ex) {
LOG_WARNING("caught error while handling error: %s", ex.what());
status = Job::status_t(Job::JOB_FAILED);
}
catch (std::exception const& ex) {
try {
Exception ex2(TRI_ERROR_INTERNAL, string("job failed with unknown error in work(): ") + ex.what(), __FILE__, __LINE__);
job->handleError(ex2);
LOG_WARNING("caught exception in work(): %s", ex2.what());
}
catch (...) {
LOG_WARNING("caught error while handling error!");
@ -181,15 +189,10 @@ void DispatcherThread::run () {
#endif
try {
Exception ex(TRI_ERROR_INTERNAL, "job failed with unknown error in work", __FILE__, __LINE__);
Exception ex(TRI_ERROR_INTERNAL, "job failed with unknown error in work()", __FILE__, __LINE__);
job->handleError(ex);
}
catch (Exception const& ex) {
LOG_WARNING("caught error while handling error: %s", DIAGNOSTIC_INFORMATION(ex));
}
catch (std::exception const& ex) {
LOG_WARNING("caught error while handling error: %s", ex.what());
LOG_WARNING("caught unknown exception in work()");
}
catch (...) {
LOG_WARNING("caught error while handling error!");