1
0
Fork 0

Merge branch 'devel' of github.com:triAGENS/AvocadoDB

This commit is contained in:
Frank Celler 2012-05-09 10:41:49 +02:00
commit add0aff2c3
22 changed files with 3549 additions and 794 deletions

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,198 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief Ahuacatl, access optimizer
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2010-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Jan Steemann
/// @author Copyright 2012, triagens GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#ifndef TRIAGENS_DURHAM_AHUACATL_ACCESS_OPTIMIZER_H
#define TRIAGENS_DURHAM_AHUACATL_ACCESS_OPTIMIZER_H 1
#include <BasicsC/common.h>
#include <BasicsC/associative.h>
#include <BasicsC/hashes.h>
#include <BasicsC/json-utilities.h>
#include <BasicsC/logging.h>
#include <BasicsC/strings.h>
#include <BasicsC/string-buffer.h>
#include <BasicsC/vector.h>
#include "Ahuacatl/ahuacatl-ast-node.h"
#include "Ahuacatl/ahuacatl-conversions.h"
#ifdef __cplusplus
extern "C" {
#endif
// -----------------------------------------------------------------------------
// --SECTION-- public types
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup Ahuacatl
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief logical operator types
////////////////////////////////////////////////////////////////////////////////
typedef enum {
TRI_AQL_LOGICAL_AND,
TRI_AQL_LOGICAL_OR
}
TRI_aql_logical_e;
////////////////////////////////////////////////////////////////////////////////
/// @brief access types
////////////////////////////////////////////////////////////////////////////////
typedef enum {
TRI_AQL_ACCESS_ALL = 0, // all values must be accessed
TRI_AQL_ACCESS_IMPOSSIBLE, // no values must be accessed
TRI_AQL_ACCESS_EXACT, // one value must be accessed
TRI_AQL_ACCESS_LIST, // a list of values must be accessed
TRI_AQL_ACCESS_RANGE_SINGLE, // a range with one bound must be accessed
TRI_AQL_ACCESS_RANGE_DOUBLE // a two bounded range must be accessed
}
TRI_aql_access_e;
////////////////////////////////////////////////////////////////////////////////
/// @brief range access types
////////////////////////////////////////////////////////////////////////////////
typedef enum {
TRI_AQL_RANGE_LOWER_EXCLUDED, // x| ... inf
TRI_AQL_RANGE_LOWER_INCLUDED, // |x ... inf
TRI_AQL_RANGE_UPPER_EXCLUDED, // -inf ... |x
TRI_AQL_RANGE_UPPER_INCLUDED // -inf ... x|
}
TRI_aql_range_e;
////////////////////////////////////////////////////////////////////////////////
/// @brief range type (consisting of range type & range bound value)
////////////////////////////////////////////////////////////////////////////////
typedef struct TRI_aql_range_s {
TRI_json_t* _value;
TRI_aql_range_e _type;
}
TRI_aql_range_t;
////////////////////////////////////////////////////////////////////////////////
/// @brief attribute access container used during optimisation
////////////////////////////////////////////////////////////////////////////////
typedef struct TRI_aql_field_access_s {
char* _fieldName;
TRI_aql_access_e _type;
union {
TRI_json_t* _value; // used for TRI_AQL_ACCESS_EXACT, TRI_AQL_ACCESS_LIST
TRI_aql_range_t _singleRange; // used for TRI_AQL_ACCESS_RANGE_SINGLE
struct {
TRI_aql_range_t _lower; // lower bound
TRI_aql_range_t _upper; // upper bound
}
_between; // used for TRI_AQL_ACCESS_RANGE_DOUBLE
}
_value;
}
TRI_aql_field_access_t;
////////////////////////////////////////////////////////////////////////////////
/// @brief attribute name container
////////////////////////////////////////////////////////////////////////////////
typedef struct TRI_aql_attribute_name_s {
const char* _variable; // variable name/alias used
TRI_string_buffer_t _name; // complete attribute name (including variable and '.'s)
}
TRI_aql_attribute_name_t;
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- constructors / destructors
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup Ahuacatl
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief init the optimizer
////////////////////////////////////////////////////////////////////////////////
bool TRI_InitOptimizerAql (TRI_aql_context_t* const);
////////////////////////////////////////////////////////////////////////////////
/// @brief shutdown the optimizer
////////////////////////////////////////////////////////////////////////////////
void TRI_FreeOptimizerAql (TRI_aql_context_t* const);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- public functions
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup Ahuacatl
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief dump ranges found for debugging purposes
////////////////////////////////////////////////////////////////////////////////
void TRI_DumpRangesAql (TRI_aql_context_t* const);
////////////////////////////////////////////////////////////////////////////////
/// @brief inspect a condition and note all accesses found for it
////////////////////////////////////////////////////////////////////////////////
void TRI_InspectConditionAql (TRI_aql_context_t* const,
const TRI_aql_logical_e,
TRI_aql_node_t*);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
#ifdef __cplusplus
}
#endif
#endif
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

View File

@ -31,557 +31,12 @@
#include "V8/v8-execution.h"
#undef RANGE_OPTIMIZER
// -----------------------------------------------------------------------------
// --SECTION-- private functions
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @brief hash a variable
////////////////////////////////////////////////////////////////////////////////
static uint64_t HashFieldAccess (TRI_associative_pointer_t* array,
void const* element) {
TRI_aql_field_access_t* fieldAccess = (TRI_aql_field_access_t*) element;
return TRI_FnvHashString(fieldAccess->_fieldName);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief comparison function used to determine variable equality
////////////////////////////////////////////////////////////////////////////////
static bool EqualFieldAccess (TRI_associative_pointer_t* array,
void const* key,
void const* element) {
TRI_aql_field_access_t* fieldAccess = (TRI_aql_field_access_t*) element;
return TRI_EqualString(key, fieldAccess->_fieldName);
}
static int TypeWeight (const TRI_json_t* const value) {
switch (value->_type) {
case TRI_JSON_BOOLEAN:
return 1;
case TRI_JSON_NUMBER:
return 2;
case TRI_JSON_STRING:
return 3;
case TRI_JSON_LIST:
return 4;
case TRI_JSON_ARRAY:
return 5;
case TRI_JSON_NULL:
default:
return 0;
}
}
static int Compare (const TRI_json_t* const lhs, const TRI_json_t* const rhs) {
int lWeight = TypeWeight(lhs);
int rWeight = TypeWeight(rhs);
if (lWeight < rWeight) {
return -1;
}
if (lWeight > rWeight) {
return 1;
}
// equal weight
switch (lhs->_type) {
case TRI_JSON_NULL:
return 0; // null == null;
case TRI_JSON_BOOLEAN:
if (lhs->_value._boolean == rhs->_value._boolean) {
return 0;
}
if (!lhs->_value._boolean && rhs->_value._boolean) {
return -1;
}
return 1;
case TRI_JSON_NUMBER:
if (lhs->_value._number == rhs->_value._number) {
return 0;
}
if (lhs->_value._number < rhs->_value._number) {
return -1;
}
return 1;
case TRI_JSON_STRING:
return strcmp(lhs->_value._string.data, rhs->_value._string.data);
case TRI_JSON_LIST: {
size_t nl = lhs->_value._objects._length;
size_t nr = rhs->_value._objects._length;
size_t i;
for (i = 0; i < nl; ++i) {
int result;
if (i >= nr) {
// left list is longer
return 1;
}
result = Compare(TRI_AtVector(&lhs->_value._objects, i), TRI_AtVector(&rhs->_value._objects, i));
if (result != 0) {
return result;
}
}
// right list is longer
if (nr > nl) {
return -1;
}
return 0;
}
case TRI_JSON_ARRAY: {
size_t nl = lhs->_value._objects._length;
size_t nr = rhs->_value._objects._length;
size_t i;
for (i = 0; i < nl; i += 2) {
int result;
if (i > nr) {
// left list is longer
return 1;
}
// compare key
result = Compare(TRI_AtVector(&lhs->_value._objects, i), TRI_AtVector(&rhs->_value._objects, i));
if (result != 0) {
return result;
}
// compare value
result = Compare(TRI_AtVector(&lhs->_value._objects, i + 1), TRI_AtVector(&rhs->_value._objects, i + 1));
if (result != 0) {
return result;
}
}
// right list is longer
if (nr > nl) {
return -1;
}
return 0;
}
default:
return 0;
}
}
static bool IsSameValue (const TRI_json_t* const lhs, const TRI_json_t* const rhs) {
if (!lhs || !rhs) {
return false;
}
if (lhs->_type != rhs->_type) {
return false;
}
switch (lhs->_type) {
case TRI_JSON_NULL:
return true;
case TRI_JSON_BOOLEAN:
return (lhs->_value._boolean == rhs->_value._boolean);
case TRI_JSON_NUMBER:
return (lhs->_value._number == rhs->_value._number); // TODO: handle epsilon
case TRI_JSON_STRING:
return TRI_EqualString(lhs->_value._string.data, rhs->_value._string.data);
case TRI_JSON_LIST:
case TRI_JSON_ARRAY: {
// lists and arrays can be treated the same here
size_t n = lhs->_value._objects._length;
size_t i;
if (n != rhs->_value._objects._length) {
return false;
}
for (i = 0; i < n; ++i) {
if (!IsSameValue(TRI_AtVector(&lhs->_value._objects, i), TRI_AtVector(&rhs->_value._objects, i))) {
return false;
}
}
return true;
}
default:
return false;
}
}
static bool IsInList (const TRI_json_t* const lhs, const TRI_json_t* const rhs) {
size_t n;
size_t i;
if (!lhs || !rhs || !rhs->_type == TRI_JSON_LIST) {
return false;
}
n = rhs->_value._objects._length;
for (i = 0; i < n; ++i) {
TRI_json_t* r = (TRI_json_t*) TRI_AtVector(&rhs->_value._objects, i);
if (IsSameValue(lhs, r)) {
return true;
}
}
return false;
}
static char* AccessName (const TRI_aql_access_e type) {
switch (type) {
case TRI_AQL_ACCESS_ALL:
return "all";
case TRI_AQL_ACCESS_IMPOSSIBLE:
return "impossible";
case TRI_AQL_ACCESS_EXACT:
return "exact";
case TRI_AQL_ACCESS_LIST:
return "list";
case TRI_AQL_ACCESS_SINGLE_RANGE:
return "single range";
case TRI_AQL_ACCESS_DOUBLE_RANGE:
return "double range";
default:
return "unknown";
}
}
static TRI_aql_field_access_t* MergeAccess (TRI_aql_context_t* const context,
TRI_aql_field_access_t* lhs,
TRI_aql_field_access_t* rhs) {
assert(lhs);
assert(rhs);
assert(lhs->_fieldName != NULL);
assert(rhs->_fieldName != NULL);
if (lhs->_type > rhs->_type) {
// swap operands so they are always sorted
TRI_aql_field_access_t* tmp = lhs;
lhs = rhs;
rhs = tmp;
}
if (lhs->_type == TRI_AQL_ACCESS_ALL) {
// TODO: free lhs
return rhs;
}
if (lhs->_type == TRI_AQL_ACCESS_IMPOSSIBLE) {
// TODO: free rhs
return lhs;
}
if (lhs->_type == TRI_AQL_ACCESS_EXACT) {
if (rhs->_type == TRI_AQL_ACCESS_EXACT) {
if (!IsSameValue(lhs->_value._exactValue, rhs->_value._exactValue)) {
// lhs and rhs values are non-identical
lhs->_type = TRI_AQL_ACCESS_IMPOSSIBLE;
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, lhs->_value._exactValue);
// TODO: free rhs
return lhs;
}
// lhs and rhs values are identical
// TODO: free rhs
return lhs;
}
else if (rhs->_type == TRI_AQL_ACCESS_LIST) {
if (!IsInList(lhs->_value._exactValue, rhs->_value._list)) {
// lhs value is not in rhs list
lhs->_type = TRI_AQL_ACCESS_IMPOSSIBLE;
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, lhs->_value._exactValue);
// TODO: free rhs
return lhs;
}
// lhs value is contained in rhs
// TODO: free rhs
return lhs;
}
else if (rhs->_type == TRI_AQL_ACCESS_SINGLE_RANGE) {
// check if value is in range
int result = Compare(lhs->_value._exactValue, rhs->_value._singleRange._value);
bool contained = ((rhs->_value._singleRange._type == TRI_AQL_RANGE_LOWER_EXCLUDED && result > 0) ||
(rhs->_value._singleRange._type == TRI_AQL_RANGE_LOWER_INCLUDED && result >= 0) ||
(rhs->_value._singleRange._type == TRI_AQL_RANGE_UPPER_EXCLUDED && result < 0) ||
(rhs->_value._singleRange._type == TRI_AQL_RANGE_UPPER_INCLUDED && result <= 0));
if (!contained) {
// lhs value is not contained in rhs range
lhs->_type = TRI_AQL_ACCESS_IMPOSSIBLE;
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, lhs->_value._exactValue);
// TODO: free rhs
return lhs;
}
// lhs value is contained in rhs range
// TODO: free lhs
return rhs;
}
else if (rhs->_type == TRI_AQL_ACCESS_DOUBLE_RANGE) {
// check if value is in range
int result;
bool contained;
result = Compare(lhs->_value._exactValue, rhs->_value._between._lower._value);
contained = ((rhs->_value._between._lower._type == TRI_AQL_RANGE_LOWER_EXCLUDED && result > 0) ||
(rhs->_value._between._lower._type == TRI_AQL_RANGE_LOWER_INCLUDED && result >= 0));
if (!contained) {
// lhs value is not contained in rhs range
lhs->_type = TRI_AQL_ACCESS_IMPOSSIBLE;
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, lhs->_value._exactValue);
// TODO: free rhs
return lhs;
}
result = Compare(lhs->_value._exactValue, rhs->_value._between._upper._value);
contained = ((rhs->_value._between._upper._type == TRI_AQL_RANGE_UPPER_EXCLUDED && result < 0) ||
(rhs->_value._between._upper._type == TRI_AQL_RANGE_UPPER_INCLUDED && result <= 0));
if (!contained) {
// lhs value is not contained in rhs range
lhs->_type = TRI_AQL_ACCESS_IMPOSSIBLE;
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, lhs->_value._exactValue);
// TODO: free rhs
return lhs;
}
// lhs value is contained in rhs range
// TODO: free lhs
return rhs;
}
}
if (lhs->_type == TRI_AQL_ACCESS_LIST) {
if (rhs->_type == TRI_AQL_ACCESS_LIST) {
// make a list of both
}
else if (rhs->_type == TRI_AQL_ACCESS_SINGLE_RANGE) {
// check if value in range
}
else if (rhs->_type == TRI_AQL_ACCESS_DOUBLE_RANGE) {
// check if value in range
}
}
if (lhs->_type == TRI_AQL_ACCESS_SINGLE_RANGE) {
if (rhs->_type == TRI_AQL_ACCESS_SINGLE_RANGE) {
// check if value in range
}
else if (rhs->_type == TRI_AQL_ACCESS_DOUBLE_RANGE) {
// check if value in range
}
}
if (lhs->_type == TRI_AQL_ACCESS_DOUBLE_RANGE) {
}
return NULL;
}
static TRI_aql_field_access_t* CreateAccess (TRI_aql_context_t* const context,
const TRI_aql_field_name_t* const field,
const TRI_aql_node_type_e operator,
const TRI_aql_node_t* const node) {
TRI_aql_field_access_t* fieldAccess;
TRI_json_t* value;
value = TRI_NodeJsonAql(context, node);
if (!value) {
return NULL;
}
fieldAccess = (TRI_aql_field_access_t*) TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_aql_field_access_t), false);
if (fieldAccess == NULL) {
return NULL;
}
fieldAccess->_fieldName = TRI_DuplicateString(field->_name._buffer);
if (fieldAccess->_fieldName == NULL) {
TRI_Free(TRI_UNKNOWN_MEM_ZONE, fieldAccess);
return NULL;
}
if (operator == AQL_NODE_OPERATOR_BINARY_EQ) {
fieldAccess->_type = TRI_AQL_ACCESS_EXACT;
fieldAccess->_value._exactValue = value;
}
else if (operator == AQL_NODE_OPERATOR_BINARY_LT) {
fieldAccess->_type = TRI_AQL_ACCESS_SINGLE_RANGE;
fieldAccess->_value._singleRange._type = TRI_AQL_RANGE_UPPER_EXCLUDED;
fieldAccess->_value._singleRange._value = value;
}
else if (operator == AQL_NODE_OPERATOR_BINARY_LE) {
fieldAccess->_type = TRI_AQL_ACCESS_SINGLE_RANGE;
fieldAccess->_value._singleRange._type = TRI_AQL_RANGE_UPPER_INCLUDED;
fieldAccess->_value._singleRange._value = value;
}
else if (operator == AQL_NODE_OPERATOR_BINARY_GT) {
fieldAccess->_type = TRI_AQL_ACCESS_SINGLE_RANGE;
fieldAccess->_value._singleRange._type = TRI_AQL_RANGE_LOWER_EXCLUDED;
fieldAccess->_value._singleRange._value = value;
}
else if (operator == AQL_NODE_OPERATOR_BINARY_GE) {
fieldAccess->_type = TRI_AQL_ACCESS_SINGLE_RANGE;
fieldAccess->_value._singleRange._type = TRI_AQL_RANGE_LOWER_INCLUDED;
fieldAccess->_value._singleRange._value = value;
}
else {
assert(false);
}
return fieldAccess;
}
static void CreateFieldAccess (TRI_aql_context_t* const context,
const TRI_aql_field_name_t* const field,
const TRI_aql_node_type_e operator,
const TRI_aql_node_t* const node) {
TRI_aql_field_access_t* previous;
TRI_aql_field_access_t* fieldAccess;
if (!field || !field->_name._buffer) {
return;
}
fieldAccess = CreateAccess(context, field, operator, node);
if (!fieldAccess) {
// TODO: mark failure
return;
}
previous = (TRI_aql_field_access_t*) TRI_LookupByKeyAssociativePointer(&context->_ranges, field->_name._buffer);
if (previous) {
printf("ENTER MERGE\n");
TRI_aql_field_access_t* merged = MergeAccess(context, fieldAccess, previous);
printf("LEAVE MERGE\n");
// TODO:
// free previous
// free fieldAccess
if (merged) {
TRI_InsertKeyAssociativePointer(&context->_ranges, fieldAccess->_fieldName, merged, true);
printf("MERGE1\n");
}
// previous access exists, must merge
// merge(previous, new)
// TRI_InsertKeyAssociativePointer(&context
}
else {
// no previous access exists, no need to merge
TRI_InsertKeyAssociativePointer(&context->_ranges, fieldAccess->_fieldName, fieldAccess, false);
printf("INSERT1\n");
}
}
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup Ahuacatl
/// @{
////////////////////////////////////////////////////////////////////////////////
static TRI_aql_field_name_t* GetFieldName (TRI_aql_context_t* const context,
const TRI_aql_node_t* const node) {
if (node->_type == AQL_NODE_ATTRIBUTE_ACCESS) {
TRI_aql_field_name_t* field = GetFieldName(context, TRI_AQL_NODE_MEMBER(node, 0));
if (!field) {
return NULL;
}
TRI_AppendCharStringBuffer(&field->_name, '.');
TRI_AppendStringStringBuffer(&field->_name, TRI_AQL_NODE_STRING(node));
return field;
}
else if (node->_type == AQL_NODE_REFERENCE) {
TRI_aql_field_name_t* field;
field = (TRI_aql_field_name_t*) TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_aql_field_name_t), false);
if (!field) {
TRI_SetErrorContextAql(context, TRI_ERROR_OUT_OF_MEMORY, NULL);
return NULL;
}
field->_variable = TRI_AQL_NODE_STRING(node);
TRI_InitStringBuffer(&field->_name, TRI_UNKNOWN_MEM_ZONE);
TRI_AppendStringStringBuffer(&field->_name, TRI_AQL_NODE_STRING(node));
return field;
}
return NULL;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief inspect a filter expression
////////////////////////////////////////////////////////////////////////////////
static void InspectFilter (TRI_aql_context_t* const context,
TRI_aql_node_t* node) {
printf("ITERATION SOMETHING %s\n", TRI_NodeNameAql(node->_type));
if (node->_type == AQL_NODE_OPERATOR_UNARY_NOT) {
return;
}
if (node->_type == AQL_NODE_OPERATOR_BINARY_OR) {
TRI_aql_node_t* lhs = TRI_AQL_NODE_MEMBER(node, 0);
TRI_aql_node_t* rhs = TRI_AQL_NODE_MEMBER(node, 1);
InspectFilter(context, lhs);
InspectFilter(context, rhs);
}
if (node->_type == AQL_NODE_OPERATOR_BINARY_AND) {
TRI_aql_node_t* lhs = TRI_AQL_NODE_MEMBER(node, 0);
TRI_aql_node_t* rhs = TRI_AQL_NODE_MEMBER(node, 1);
InspectFilter(context, lhs);
InspectFilter(context, rhs);
}
if (node->_type == AQL_NODE_OPERATOR_BINARY_EQ ||
// node->_type == AQL_NODE_OPERATOR_BINARY_NE ||
node->_type == AQL_NODE_OPERATOR_BINARY_LT ||
node->_type == AQL_NODE_OPERATOR_BINARY_LE ||
node->_type == AQL_NODE_OPERATOR_BINARY_GT ||
node->_type == AQL_NODE_OPERATOR_BINARY_GE) {
TRI_aql_node_t* lhs = TRI_AQL_NODE_MEMBER(node, 0);
TRI_aql_node_t* rhs = TRI_AQL_NODE_MEMBER(node, 1);
if (lhs->_type == AQL_NODE_ATTRIBUTE_ACCESS) {
TRI_aql_field_name_t* field = GetFieldName(context, lhs);
if (field) {
CreateFieldAccess(context, field, node->_type, rhs);
TRI_DestroyStringBuffer(&field->_name);
TRI_Free(TRI_UNKNOWN_MEM_ZONE, field);
}
}
else if (lhs->_type == AQL_NODE_ATTRIBUTE_ACCESS) {
TRI_aql_field_name_t* field = GetFieldName(context, rhs);
if (field) {
CreateFieldAccess(context, field, node->_type, lhs);
TRI_DestroyStringBuffer(&field->_name);
TRI_Free(TRI_UNKNOWN_MEM_ZONE, field);
}
}
}
}
////////////////////////////////////////////////////////////////////////////////
/// @brief create javascript function code for a relational operation
////////////////////////////////////////////////////////////////////////////////
@ -806,13 +261,15 @@ static TRI_aql_node_t* OptimiseFilter (TRI_aql_context_t* const context,
TRI_aql_node_t* node) {
TRI_aql_node_t* expression = TRI_AQL_NODE_MEMBER(node, 0);
bool result;
if (!expression) {
return node;
}
if (!TRI_IsConstantValueNodeAql(expression)) {
//InspectFilter(context, expression);
#ifdef RANGE_OPTIMIZER
TRI_InspectConditionAql(context, TRI_AQL_LOGICAL_AND, expression);
#endif
return node;
}
@ -996,6 +453,10 @@ static TRI_aql_node_t* OptimiseBinaryRelationalOperation (TRI_aql_context_t* con
else if (node->_type == AQL_NODE_OPERATOR_BINARY_IN) {
func = "IN";
}
else {
// not what we expected, however, simply continue
return node;
}
code = RelationCode(func, lhs, rhs);
if (!code) {
@ -1111,6 +572,7 @@ static TRI_aql_node_t* OptimiseBinaryArithmeticOperation (TRI_aql_context_t* con
static TRI_aql_node_t* MarkFor (TRI_aql_context_t* const context,
TRI_aql_node_t* node) {
#ifdef RANGE_OPTIMIZER
TRI_aql_node_t* nameNode = TRI_AQL_NODE_MEMBER(node, 0);
TRI_aql_node_t* expressionNode = TRI_AQL_NODE_MEMBER(node, 1);
@ -1126,11 +588,11 @@ static TRI_aql_node_t* MarkFor (TRI_aql_context_t* const context,
return node;
}
}
#endif
return node;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief fold constants in a node
////////////////////////////////////////////////////////////////////////////////
@ -1172,7 +634,7 @@ static TRI_aql_node_t* ModifyNode (void* data, TRI_aql_node_t* node) {
case AQL_NODE_FCALL:
return OptimiseFcall(context, node);
case AQL_NODE_FOR:
// return MarkFor(context, node);
return MarkFor(context, node);
default:
break;
}
@ -1200,15 +662,14 @@ static TRI_aql_node_t* ModifyNode (void* data, TRI_aql_node_t* node) {
TRI_aql_node_t* TRI_FoldConstantsAql (TRI_aql_context_t* const context,
TRI_aql_node_t* node) {
TRI_aql_modify_tree_walker_t* walker;
// todo: must free
TRI_InitAssociativePointer(&context->_ranges,
TRI_UNKNOWN_MEM_ZONE,
&TRI_HashStringKeyAssociativePointer,
&HashFieldAccess,
&EqualFieldAccess,
NULL);
#ifdef RANGE_OPTIMIZER
if (!TRI_InitOptimizerAql(context)) {
TRI_SetErrorContextAql(context, TRI_ERROR_OUT_OF_MEMORY, NULL);
return node;
}
#endif
walker = TRI_CreateModifyTreeWalkerAql((void*) context, &ModifyNode);
if (!walker) {
TRI_SetErrorContextAql(context, TRI_ERROR_OUT_OF_MEMORY, NULL);
@ -1218,33 +679,11 @@ TRI_aql_node_t* TRI_FoldConstantsAql (TRI_aql_context_t* const context,
node = TRI_ModifyWalkTreeAql(walker, node);
TRI_FreeModifyTreeWalkerAql(walker);
/*
size_t i;
for (i = 0; i < context->_ranges._nrAlloc; ++i) {
TRI_aql_field_access_t* fieldAccess = context->_ranges._table[i];
if (!fieldAccess) {
continue;
}
#ifdef RANGE_OPTIMIZER
TRI_DumpRangesAql(context);
#endif
printf("\nFIELD ACCESS\n- FIELD: %s\n",fieldAccess->_fieldName);
printf("- TYPE: %s\n", AccessName(fieldAccess->_type));
if (fieldAccess->_type == TRI_AQL_ACCESS_EXACT) {
TRI_string_buffer_t b;
TRI_InitStringBuffer(&b, TRI_UNKNOWN_MEM_ZONE);
TRI_StringifyJson(&b, fieldAccess->_value._exactValue);
printf("- VALUE: %s\n", b._buffer);
}
else if (fieldAccess->_type == TRI_AQL_ACCESS_SINGLE_RANGE) {
TRI_string_buffer_t b;
TRI_InitStringBuffer(&b, TRI_UNKNOWN_MEM_ZONE);
TRI_StringifyJson(&b, fieldAccess->_value._singleRange._value);
printf("- VALUE: %s\n", b._buffer);
}
}
*/
return node;
}

View File

@ -29,13 +29,15 @@
#define TRIAGENS_DURHAM_AHUACATL_CONSTANT_FOLDER_H 1
#include <BasicsC/common.h>
#include <BasicsC/associative.h>
#include <BasicsC/hashes.h>
#include <BasicsC/json-utilities.h>
#include <BasicsC/logging.h>
#include <BasicsC/strings.h>
#include <BasicsC/string-buffer.h>
#include <BasicsC/hashes.h>
#include <BasicsC/logging.h>
#include <BasicsC/vector.h>
#include <BasicsC/associative.h>
#include "Ahuacatl/ahuacatl-access-optimizer.h"
#include "Ahuacatl/ahuacatl-ast-node.h"
#include "Ahuacatl/ahuacatl-tree-walker.h"
@ -52,66 +54,6 @@ extern "C" {
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief access type
////////////////////////////////////////////////////////////////////////////////
typedef enum {
TRI_AQL_RANGE_LOWER_EXCLUDED,
TRI_AQL_RANGE_LOWER_INCLUDED,
TRI_AQL_RANGE_UPPER_EXCLUDED,
TRI_AQL_RANGE_UPPER_INCLUDED
}
TRI_aql_range_e;
typedef enum {
TRI_AQL_ACCESS_ALL = 0,
TRI_AQL_ACCESS_IMPOSSIBLE,
TRI_AQL_ACCESS_EXACT,
TRI_AQL_ACCESS_LIST,
TRI_AQL_ACCESS_SINGLE_RANGE,
TRI_AQL_ACCESS_DOUBLE_RANGE,
}
TRI_aql_access_e;
typedef struct TRI_aql_range_s {
TRI_json_t* _value;
TRI_aql_range_e _type;
}
TRI_aql_range_t;
////////////////////////////////////////////////////////////////////////////////
/// @brief attribute access container used during optimisation
////////////////////////////////////////////////////////////////////////////////
typedef struct TRI_aql_field_access_s {
char* _fieldName;
TRI_aql_access_e _type;
union {
TRI_json_t* _exactValue;
TRI_json_t* _list;
TRI_aql_range_t _singleRange;
struct {
TRI_aql_range_t _lower;
TRI_aql_range_t _upper;
}
_between;
}
_value;
}
TRI_aql_field_access_t;
typedef struct TRI_aql_field_name_s {
const char* _variable;
TRI_string_buffer_t _name;
}
TRI_aql_field_name_t;
////////////////////////////////////////////////////////////////////////////////
/// @brief fold constants recursively
////////////////////////////////////////////////////////////////////////////////

View File

@ -26,6 +26,7 @@
////////////////////////////////////////////////////////////////////////////////
#include "Ahuacatl/ahuacatl-context.h"
#include "Ahuacatl/ahuacatl-access-optimizer.h"
#include "Ahuacatl/ahuacatl-ast-node.h"
#include "Ahuacatl/ahuacatl-bind-parameter.h"
#include "Ahuacatl/ahuacatl-collections.h"
@ -77,6 +78,8 @@ TRI_aql_context_t* TRI_CreateContextAql (TRI_vocbase_t* vocbase,
}
context->_vocbase = vocbase;
context->_ranges = NULL;
context->_variableIndex = 0;
// actual bind parameter values
@ -161,6 +164,9 @@ void TRI_FreeContextAql (TRI_aql_context_t* const context) {
}
TRI_DestroyVectorPointer(&context->_scopes);
// free range optimizer
TRI_FreeOptimizerAql(context);
// free all strings registered
i = context->_strings._length;
while (i--) {
@ -462,10 +468,8 @@ bool TRI_AddStatementAql (TRI_aql_context_t* const context,
TRI_aql_scope_t* TRI_StartScopeContextAql (TRI_aql_context_t* const context) {
TRI_aql_scope_t* scope;
size_t n;
assert(context);
n = context->_scopes._length;
scope = TRI_CreateScopeAql();
if (!scope) {
ABORT_OOM

View File

@ -82,7 +82,7 @@ typedef struct TRI_aql_context_s {
TRI_associative_pointer_t _parameterValues;
TRI_associative_pointer_t _parameterNames;
TRI_associative_pointer_t _collectionNames;
TRI_associative_pointer_t _ranges;
TRI_associative_pointer_t* _ranges;
size_t _variableIndex;
void* _first;
char* _query;

View File

@ -89,7 +89,12 @@ TRI_json_t* TRI_NodeJsonAql (TRI_aql_context_t* const context,
if (result) {
n = node->_members._length;
for (i = 0; i < n; ++i) {
TRI_PushBackListJson(TRI_UNKNOWN_MEM_ZONE, result, TRI_NodeJsonAql(context, TRI_AQL_NODE_MEMBER(node, i)));
TRI_json_t* subValue = TRI_NodeJsonAql(context, TRI_AQL_NODE_MEMBER(node, i));
if (subValue) {
TRI_PushBack2ListJson(result, subValue);
TRI_Free(TRI_UNKNOWN_MEM_ZONE, subValue);
}
}
}
return result;
@ -102,7 +107,15 @@ TRI_json_t* TRI_NodeJsonAql (TRI_aql_context_t* const context,
n = node->_members._length;
for (i = 0; i < n; ++i) {
TRI_aql_node_t* element = TRI_AQL_NODE_MEMBER(node, i);
TRI_InsertArrayJson(TRI_UNKNOWN_MEM_ZONE, result, TRI_AQL_NODE_STRING(element), TRI_NodeJsonAql(context, TRI_AQL_NODE_MEMBER(element, 0)));
TRI_json_t* subValue = TRI_NodeJsonAql(context, TRI_AQL_NODE_MEMBER(element, 0));
if (subValue) {
TRI_Insert2ArrayJson(TRI_UNKNOWN_MEM_ZONE,
result,
TRI_AQL_NODE_STRING(element),
subValue);
TRI_Free(TRI_UNKNOWN_MEM_ZONE, subValue);
}
}
}
return result;

View File

@ -141,6 +141,8 @@ char* TRI_GetContextErrorAql (const char* const query, const size_t line, const
size_t currentLine = 1;
size_t currentColumn = 1;
const char* p = query;
char* temp;
char* result;
size_t offset;
char c;
@ -169,7 +171,16 @@ char* TRI_GetContextErrorAql (const char* const query, const size_t line, const
return TRI_DuplicateString2(query + offset, strlen(query) - offset);
}
return TRI_Concatenate2String(TRI_DuplicateString2(query + offset, SNIPPET_LENGTH), SNIPPET_SUFFIX);
temp = TRI_DuplicateString2(query + offset, SNIPPET_LENGTH);
if (!temp) {
// out of memory
return NULL;
}
result = TRI_Concatenate2String(temp, SNIPPET_SUFFIX);
TRI_FreeString(TRI_CORE_MEM_ZONE, temp);
return result;
}
////////////////////////////////////////////////////////////////////////////////

553
BasicsC/json-utilities.c Normal file
View File

@ -0,0 +1,553 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief utility functions for json objects
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2010-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Jan Steemann
/// @author Copyright 2012, triagens GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#include <BasicsC/json-utilities.h>
// -----------------------------------------------------------------------------
// --SECTION-- private functions
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup Json
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief fruitsort initialisation parameters
///
/// Included fsrt.inc with these parameters will create a function SortJsonList
/// that is used to do the sorting. SortJsonList will call OrderDataCompareFunc()
/// to do the actual element comparisons
////////////////////////////////////////////////////////////////////////////////
static int CompareJson (TRI_json_t*, TRI_json_t*, size_t);
#define FSRT_INSTANCE SortJson
#define FSRT_NAME SortListJson
#define FSRT_TYPE TRI_json_t
#define FSRT_COMP(l,r,s) CompareJson(l,r,s)
uint32_t SortJsonFSRT_Rand = 0;
static uint32_t SortJsonRandomGenerator (void) {
return (SortJsonFSRT_Rand = SortJsonFSRT_Rand * 31415 + 27818);
}
#define FSRT__RAND \
((fs_b) + FSRT__UNIT * (SortJsonRandomGenerator() % FSRT__DIST(fs_e,fs_b,FSRT__SIZE)))
#include <BasicsC/fsrt.inc>
////////////////////////////////////////////////////////////////////////////////
/// @brief get type weight of a json value usable for comparison and sorting
////////////////////////////////////////////////////////////////////////////////
static inline int TypeWeight (const TRI_json_t* const value) {
switch (value->_type) {
case TRI_JSON_BOOLEAN:
return 1;
case TRI_JSON_NUMBER:
return 2;
case TRI_JSON_STRING:
return 3;
case TRI_JSON_LIST:
return 4;
case TRI_JSON_ARRAY:
return 5;
case TRI_JSON_NULL:
case TRI_JSON_UNUSED:
default:
return 0;
}
}
////////////////////////////////////////////////////////////////////////////////
/// @brief callback function used for json value sorting
////////////////////////////////////////////////////////////////////////////////
static int CompareJson (TRI_json_t* lhs, TRI_json_t* rhs, size_t size) {
return TRI_CompareValuesJson((TRI_json_t*) lhs, (TRI_json_t*) rhs);
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- public functions
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup Json
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief compare two json values
////////////////////////////////////////////////////////////////////////////////
int TRI_CompareValuesJson (const TRI_json_t* const lhs,
const TRI_json_t* const rhs) {
int lWeight = TypeWeight(lhs);
int rWeight = TypeWeight(rhs);
if (lWeight < rWeight) {
return -1;
}
if (lWeight > rWeight) {
return 1;
}
// equal weight
switch (lhs->_type) {
case TRI_JSON_UNUSED:
case TRI_JSON_NULL:
return 0; // null == null;
case TRI_JSON_BOOLEAN:
if (lhs->_value._boolean == rhs->_value._boolean) {
return 0;
}
if (!lhs->_value._boolean && rhs->_value._boolean) {
return -1;
}
return 1;
case TRI_JSON_NUMBER:
if (lhs->_value._number == rhs->_value._number) {
return 0;
}
if (lhs->_value._number < rhs->_value._number) {
return -1;
}
return 1;
case TRI_JSON_STRING:
return strcmp(lhs->_value._string.data, rhs->_value._string.data);
case TRI_JSON_LIST: {
size_t nl = lhs->_value._objects._length;
size_t nr = rhs->_value._objects._length;
size_t i;
for (i = 0; i < nl; ++i) {
int result;
if (i >= nr) {
// left list is longer
return 1;
}
result = TRI_CompareValuesJson(TRI_AtVector(&lhs->_value._objects, i),
TRI_AtVector(&rhs->_value._objects, i));
if (result != 0) {
return result;
}
}
// right list is longer
if (nr > nl) {
return -1;
}
return 0;
}
case TRI_JSON_ARRAY: {
size_t nl = lhs->_value._objects._length;
size_t nr = rhs->_value._objects._length;
size_t i;
for (i = 0; i < nl; i += 2) {
int result;
if (i > nr) {
// left list is longer
return 1;
}
// compare key
result = TRI_CompareValuesJson(TRI_AtVector(&lhs->_value._objects, i),
TRI_AtVector(&rhs->_value._objects, i));
if (result != 0) {
return result;
}
// compare value
result = TRI_CompareValuesJson(TRI_AtVector(&lhs->_value._objects, i + 1),
TRI_AtVector(&rhs->_value._objects, i + 1));
if (result != 0) {
return result;
}
}
// right list is longer
if (nr > nl) {
return -1;
}
return 0;
}
default:
return 0;
}
}
////////////////////////////////////////////////////////////////////////////////
/// @brief check if two json values are the same
////////////////////////////////////////////////////////////////////////////////
bool TRI_CheckSameValueJson (const TRI_json_t* const lhs,
const TRI_json_t* const rhs) {
return (TRI_CompareValuesJson(lhs, rhs) == 0);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief checks if a json value is contained in a json list
////////////////////////////////////////////////////////////////////////////////
bool TRI_CheckInListJson (const TRI_json_t* const search,
const TRI_json_t* const list) {
size_t n;
size_t i;
assert(search);
assert(list);
assert(list->_type == TRI_JSON_LIST);
// iterate over list
n = list->_value._objects._length;
for (i = 0; i < n; ++i) {
TRI_json_t* listValue = (TRI_json_t*) TRI_AtVector(&list->_value._objects, i);
if (TRI_CheckSameValueJson(search, listValue)) {
// value is contained in list, exit
return true;
}
}
// finished list iteration, value not contained
return false;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief return the elements of a list that are between the specified bounds
////////////////////////////////////////////////////////////////////////////////
TRI_json_t* TRI_BetweenListJson (const TRI_json_t* const list,
const TRI_json_t* const lower,
const bool includeLower,
const TRI_json_t* const upper,
const bool includeUpper) {
TRI_json_t* result;
size_t i, n;
assert(list);
assert(list->_type == TRI_JSON_LIST);
assert(lower || upper);
// create result list
result = TRI_CreateListJson(TRI_UNKNOWN_MEM_ZONE);
if (!result) {
return NULL;
}
n = list->_value._objects._length;
for (i = 0; i < n; ++i) {
TRI_json_t* p = TRI_AtVector(&list->_value._objects, i);
if (lower) {
// lower bound is set
int compareResult = TRI_CompareValuesJson(lower, p);
if (compareResult > 0 || (compareResult == 0 && !includeLower)) {
// element is bigger than lower bound
continue;
}
}
if (upper) {
// upper bound is set
int compareResult = TRI_CompareValuesJson(p, upper);
if (compareResult > 0 || (compareResult == 0 && !includeUpper)) {
// element is smaller than upper bound
continue;
}
}
// element is between lower and upper bound
TRI_PushBackListJson(TRI_UNKNOWN_MEM_ZONE, result, p);
}
return result;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief uniquify a sorted json list into a new list
////////////////////////////////////////////////////////////////////////////////
TRI_json_t* TRI_UniquifyListJson (const TRI_json_t* const list) {
TRI_json_t* last = NULL;
TRI_json_t* result;
size_t i, n;
assert(list);
assert(list->_type == TRI_JSON_LIST);
// create result list
result = TRI_CreateListJson(TRI_UNKNOWN_MEM_ZONE);
if (!result) {
return NULL;
}
n = list->_value._objects._length;
for (i = 0; i < n; ++i) {
TRI_json_t* p = TRI_AtVector(&list->_value._objects, i);
// don't push value if it is the same as the last value
if (!last || TRI_CompareValuesJson(p, last) > 0) {
TRI_PushBackListJson(TRI_UNKNOWN_MEM_ZONE, result, p);
// remember last element
last = p;
}
}
return result;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief create the union of two sorted json lists into a new list
////////////////////////////////////////////////////////////////////////////////
TRI_json_t* TRI_UnionizeListsJson (const TRI_json_t* const list1,
const TRI_json_t* const list2,
const bool unique) {
TRI_json_t* last = NULL;
TRI_json_t* result;
size_t i1, i2;
size_t n1, n2;
assert(list1);
assert(list1->_type == TRI_JSON_LIST);
assert(list2);
assert(list2->_type == TRI_JSON_LIST);
n1 = list1->_value._objects._length;
n2 = list2->_value._objects._length;
// special cases for empty lists
if (n1 == 0 && !unique) {
return TRI_CopyJson(TRI_UNKNOWN_MEM_ZONE, (TRI_json_t*) list2);
}
if (n2 == 0 && !unique) {
return TRI_CopyJson(TRI_UNKNOWN_MEM_ZONE, (TRI_json_t*) list1);
}
// create result list
result = TRI_CreateListJson(TRI_UNKNOWN_MEM_ZONE);
if (!result) {
return NULL;
}
// reset positions
i1 = 0;
i2 = 0;
// iterate over lists
while (true) {
// pointers to elements in both lists
TRI_json_t* p1;
TRI_json_t* p2;
if (i1 < n1 && i2 < n2) {
int compareResult;
// both lists not yet exhausted
p1 = TRI_AtVector(&list1->_value._objects, i1);
p2 = TRI_AtVector(&list2->_value._objects, i2);
compareResult = TRI_CompareValuesJson(p1, p2);
if (compareResult < 0) {
// left element is smaller
if (!unique || !last || TRI_CompareValuesJson(p1, last) > 0) {
TRI_PushBackListJson(TRI_UNKNOWN_MEM_ZONE, result, p1);
last = p1;
}
++i1;
}
else if (compareResult > 0) {
// right element is smaller
if (!unique || !last || TRI_CompareValuesJson(p2, last) > 0) {
TRI_PushBackListJson(TRI_UNKNOWN_MEM_ZONE, result, p2);
last = p2;
}
++i2;
}
else {
// both elements are equal
if (!unique || !last || TRI_CompareValuesJson(p1, last) > 0) {
TRI_PushBackListJson(TRI_UNKNOWN_MEM_ZONE, result, p1);
last = p1;
if (!unique) {
TRI_PushBackListJson(TRI_UNKNOWN_MEM_ZONE, result, p2);
}
}
++i1;
++i2;
}
}
else if (i1 < n1 && i2 >= n2) {
// only right list is exhausted
p1 = TRI_AtVector(&list1->_value._objects, i1);
if (!unique || !last || TRI_CompareValuesJson(p1, last) > 0) {
TRI_PushBackListJson(TRI_UNKNOWN_MEM_ZONE, result, p1);
last = p1;
}
++i1;
}
else if (i1 >= n1 && i2 < n2) {
// only left list is exhausted
p2 = TRI_AtVector(&list2->_value._objects, i2);
if (!unique || !last || TRI_CompareValuesJson(p2, last) > 0) {
TRI_PushBackListJson(TRI_UNKNOWN_MEM_ZONE, result, p2);
last = p2;
}
++i2;
}
else {
// both lists exhausted, stop!
break;
}
}
return result;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief create the intersection of two sorted json lists into a new list
////////////////////////////////////////////////////////////////////////////////
TRI_json_t* TRI_IntersectListsJson (const TRI_json_t* const list1,
const TRI_json_t* const list2,
const bool unique) {
TRI_json_t* last = NULL;
TRI_json_t* result;
size_t i1, i2;
size_t n1, n2;
assert(list1);
assert(list1->_type == TRI_JSON_LIST);
assert(list2);
assert(list2->_type == TRI_JSON_LIST);
// create result list
result = TRI_CreateListJson(TRI_UNKNOWN_MEM_ZONE);
if (!result) {
return NULL;
}
n1 = list1->_value._objects._length;
n2 = list2->_value._objects._length;
// special case for empty lists
if (n1 == 0 || n2 == 0) {
return result;
}
// reset positions
i1 = 0;
i2 = 0;
// iterate over lists
while (i1 < n1 && i2 < n2) {
// pointers to elements in both lists
TRI_json_t* p1 = TRI_AtVector(&list1->_value._objects, i1);
TRI_json_t* p2 = TRI_AtVector(&list2->_value._objects, i2);
int compareResult = TRI_CompareValuesJson(p1, p2);
if (compareResult < 0) {
// left element is smaller
++i1;
}
else if (compareResult > 0) {
// right element is smaller
++i2;
}
else {
// both elements are equal
if (!unique || !last || TRI_CompareValuesJson(p1, last) > 0) {
TRI_PushBackListJson(TRI_UNKNOWN_MEM_ZONE, result, p1);
last = p1;
if (!unique) {
TRI_PushBackListJson(TRI_UNKNOWN_MEM_ZONE, result, p2);
}
}
++i1;
++i2;
}
}
return result;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief sorts a json list in place
////////////////////////////////////////////////////////////////////////////////
TRI_json_t* TRI_SortListJson (TRI_json_t* const list) {
size_t n;
assert(list);
assert(list->_type == TRI_JSON_LIST);
n = list->_value._objects._length;
if (n > 1) {
// only sort if more than one value in list
SortListJson((TRI_json_t*) TRI_BeginVector(&list->_value._objects),
(TRI_json_t*) TRI_EndVector(&list->_value._objects));
}
return list;
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

138
BasicsC/json-utilities.h Normal file
View File

@ -0,0 +1,138 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief utility functions for json objects
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2004-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Jan Steemann
/// @author Copyright 2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#ifndef TRIAGENS_BASICS_C_JSON_UTILITIES_H
#define TRIAGENS_BASICS_C_JSON_UTILITIES_H 1
#include <BasicsC/common.h>
#include <BasicsC/json.h>
#ifdef __cplusplus
extern "C" {
#endif
// -----------------------------------------------------------------------------
// --SECTION-- public functions
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup Json
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief compare two json values
///
/// the values are first compared by their types, and only by their values if
/// the types are the same
/// returns -1 if lhs is smaller than rhs, 0 if lhs == rhs, and 1 if rhs is
/// greater than lhs
////////////////////////////////////////////////////////////////////////////////
int TRI_CompareValuesJson (const TRI_json_t* const, const TRI_json_t* const);
////////////////////////////////////////////////////////////////////////////////
/// @brief check if two json values are the same
////////////////////////////////////////////////////////////////////////////////
bool TRI_CheckSameValueJson (const TRI_json_t* const, const TRI_json_t* const);
////////////////////////////////////////////////////////////////////////////////
/// @brief checks if a json value is contained in a json list
////////////////////////////////////////////////////////////////////////////////
bool TRI_CheckInListJson (const TRI_json_t* const, const TRI_json_t* const);
////////////////////////////////////////////////////////////////////////////////
/// @brief return the elements of a list that are between the specified bounds
///
/// lower and upper are the bounds values. if both lower and upper have a value,
/// then each list element is checked against the range (lower ... uppper).
/// if either lower or upper are null, then the comparison is done as either
/// (-inf ... upper) or (lower ... +inf).
///
/// using the boolean flags includeLower and includeUpper it can be specified
/// whether the bounds values are part of the range (true) or not (false)
////////////////////////////////////////////////////////////////////////////////
TRI_json_t* TRI_BetweenListJson (const TRI_json_t* const,
const TRI_json_t* const,
const bool,
const TRI_json_t* const,
const bool);
////////////////////////////////////////////////////////////////////////////////
/// @brief uniquify a sorted json list into a new list
///
/// it is a prerequisite that the input list is already sorted.
/// otherwise the result is unpredictable.
////////////////////////////////////////////////////////////////////////////////
TRI_json_t* TRI_UniquifyListJson (const TRI_json_t* const);
////////////////////////////////////////////////////////////////////////////////
/// @brief create the union of two sorted json lists into a new list
///
/// the result list can be made unique or non-unique. it is a prerequisite that
/// both input lists are already sorted. otherwise the result is unpredictable.
////////////////////////////////////////////////////////////////////////////////
TRI_json_t* TRI_UnionizeListsJson (const TRI_json_t* const,
const TRI_json_t* const,
const bool);
////////////////////////////////////////////////////////////////////////////////
/// @brief create the intersection of two sorted json lists into a new list
///
/// the result list can be made unique or non-unique. it is a prerequisite that
/// both input lists are already sorted. otherwise the result is unpredictable.
////////////////////////////////////////////////////////////////////////////////
TRI_json_t* TRI_IntersectListsJson (const TRI_json_t* const,
const TRI_json_t* const,
const bool);
////////////////////////////////////////////////////////////////////////////////
/// @brief sorts a json list in place
////////////////////////////////////////////////////////////////////////////////
TRI_json_t* TRI_SortListJson (TRI_json_t* const list);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
#ifdef __cplusplus
}
#endif
#endif
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

View File

@ -32,6 +32,7 @@ libavocado_a_SOURCES = \
BasicsC/hashes.c \
BasicsC/init.c \
BasicsC/json.c \
BasicsC/json-utilities.c \
BasicsC/linked-list.c \
BasicsC/locks-macos.c \
BasicsC/locks-posix.c \
@ -154,6 +155,7 @@ avocado_SOURCES = \
HttpsServer/HttpsServerImpl.cpp \
PriorityQueue/pqueueindex.c \
PriorityQueue/priorityqueue.c \
Ahuacatl/ahuacatl-access-optimizer.c \
Ahuacatl/ahuacatl-ast-node.c \
Ahuacatl/ahuacatl-bind-parameter.c \
Ahuacatl/ahuacatl-codegen-js.c \

View File

@ -1,9 +1,9 @@
# Makefile.in generated by automake 1.11.1 from Makefile.am.
# Makefile.in generated by automake 1.11.3 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
# Inc.
# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
# Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@ -158,11 +158,11 @@ CONFIG_CLEAN_VPATH_FILES =
LIBRARIES = $(noinst_LIBRARIES)
AR = ar
ARFLAGS = cru
AM_V_AR = $(am__v_AR_$(V))
am__v_AR_ = $(am__v_AR_$(AM_DEFAULT_VERBOSITY))
AM_V_AR = $(am__v_AR_@AM_V@)
am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
am__v_AR_0 = @echo " AR " $@;
AM_V_at = $(am__v_at_$(V))
am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
libavocado_a_AR = $(AR) $(ARFLAGS)
libavocado_a_LIBADD =
@ -178,9 +178,9 @@ am__libavocado_a_SOURCES_DIST = Basics/ConditionLocker.cpp \
BasicsC/associative-multi.c BasicsC/associative.c \
BasicsC/conversions.c BasicsC/csv.c BasicsC/error.c \
BasicsC/files.c BasicsC/hashes.c BasicsC/init.c BasicsC/json.c \
BasicsC/linked-list.c BasicsC/locks-macos.c \
BasicsC/locks-posix.c BasicsC/logging.c BasicsC/memory.c \
BasicsC/process-utils.c BasicsC/random.c \
BasicsC/json-utilities.c BasicsC/linked-list.c \
BasicsC/locks-macos.c BasicsC/locks-posix.c BasicsC/logging.c \
BasicsC/memory.c BasicsC/process-utils.c BasicsC/random.c \
BasicsC/socket-utils.c BasicsC/string-buffer.c \
BasicsC/strings.c BasicsC/structures.c \
BasicsC/system-functions.c BasicsC/terminal-utils-ncurses.c \
@ -233,12 +233,12 @@ am_libavocado_a_OBJECTS = Basics/ConditionLocker.$(OBJEXT) \
BasicsC/csv.$(OBJEXT) BasicsC/error.$(OBJEXT) \
BasicsC/files.$(OBJEXT) BasicsC/hashes.$(OBJEXT) \
BasicsC/init.$(OBJEXT) BasicsC/json.$(OBJEXT) \
BasicsC/linked-list.$(OBJEXT) BasicsC/locks-macos.$(OBJEXT) \
BasicsC/locks-posix.$(OBJEXT) BasicsC/logging.$(OBJEXT) \
BasicsC/memory.$(OBJEXT) BasicsC/process-utils.$(OBJEXT) \
BasicsC/random.$(OBJEXT) BasicsC/socket-utils.$(OBJEXT) \
BasicsC/string-buffer.$(OBJEXT) BasicsC/strings.$(OBJEXT) \
BasicsC/structures.$(OBJEXT) \
BasicsC/json-utilities.$(OBJEXT) BasicsC/linked-list.$(OBJEXT) \
BasicsC/locks-macos.$(OBJEXT) BasicsC/locks-posix.$(OBJEXT) \
BasicsC/logging.$(OBJEXT) BasicsC/memory.$(OBJEXT) \
BasicsC/process-utils.$(OBJEXT) BasicsC/random.$(OBJEXT) \
BasicsC/socket-utils.$(OBJEXT) BasicsC/string-buffer.$(OBJEXT) \
BasicsC/strings.$(OBJEXT) BasicsC/structures.$(OBJEXT) \
BasicsC/system-functions.$(OBJEXT) \
BasicsC/terminal-utils-ncurses.$(OBJEXT) \
BasicsC/terminal-utils.$(OBJEXT) \
@ -288,10 +288,12 @@ am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sbindir)" \
PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) $(sbin_PROGRAMS)
am__UnitTests_basics_suite_SOURCES_DIST = UnitTests/Runner.cpp \
UnitTests/Philadelphia/json-test.cpp \
UnitTests/Philadelphia/json-utilities-test.cpp \
UnitTests/Philadelphia/hashes-test.cpp \
UnitTests/Philadelphia/associative-pointer-test.cpp \
UnitTests/Philadelphia/string-buffer-test.cpp \
UnitTests/Philadelphia/string-utf8-test.cpp \
UnitTests/Philadelphia/string-test.cpp \
UnitTests/Philadelphia/vector-pointer-test.cpp \
UnitTests/Philadelphia/vector-test.cpp \
UnitTests/Jutland/StringBufferTest.cpp \
@ -299,10 +301,12 @@ am__UnitTests_basics_suite_SOURCES_DIST = UnitTests/Runner.cpp \
@ENABLE_BOOST_TEST_TRUE@am_UnitTests_basics_suite_OBJECTS = \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Runner.$(OBJEXT) \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Philadelphia/json-test.$(OBJEXT) \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Philadelphia/json-utilities-test.$(OBJEXT) \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Philadelphia/hashes-test.$(OBJEXT) \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Philadelphia/associative-pointer-test.$(OBJEXT) \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Philadelphia/string-buffer-test.$(OBJEXT) \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Philadelphia/string-utf8-test.$(OBJEXT) \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Philadelphia/string-test.$(OBJEXT) \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Philadelphia/vector-pointer-test.$(OBJEXT) \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Philadelphia/vector-test.$(OBJEXT) \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Jutland/StringBufferTest.$(OBJEXT) \
@ -345,6 +349,7 @@ am_avocado_OBJECTS = Admin/ApplicationAdminServer.$(OBJEXT) \
HttpsServer/HttpsServerImpl.$(OBJEXT) \
PriorityQueue/pqueueindex.$(OBJEXT) \
PriorityQueue/priorityqueue.$(OBJEXT) \
Ahuacatl/ahuacatl-access-optimizer.$(OBJEXT) \
Ahuacatl/ahuacatl-ast-node.$(OBJEXT) \
Ahuacatl/ahuacatl-bind-parameter.$(OBJEXT) \
Ahuacatl/ahuacatl-codegen-js.$(OBJEXT) \
@ -441,27 +446,27 @@ am__depfiles_maybe = depfiles
am__mv = mv -f
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_$(V))
am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
am__v_CC_0 = @echo " CC " $@;
CCLD = $(CC)
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_$(V))
am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
am__v_CCLD_0 = @echo " CCLD " $@;
CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
AM_V_CXX = $(am__v_CXX_$(V))
am__v_CXX_ = $(am__v_CXX_$(AM_DEFAULT_VERBOSITY))
AM_V_CXX = $(am__v_CXX_@AM_V@)
am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
am__v_CXX_0 = @echo " CXX " $@;
CXXLD = $(CXX)
CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
-o $@
AM_V_CXXLD = $(am__v_CXXLD_$(V))
am__v_CXXLD_ = $(am__v_CXXLD_$(AM_DEFAULT_VERBOSITY))
AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
am__v_CXXLD_0 = @echo " CXXLD " $@;
AM_V_GEN = $(am__v_GEN_$(V))
am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(libavocado_a_SOURCES) $(UnitTests_basics_suite_SOURCES) \
$(UnitTests_geo_suite_SOURCES) $(avocado_SOURCES) \
@ -492,6 +497,12 @@ am__nobase_list = $(am__nobase_strip_setup); \
am__base_list = \
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
am__uninstall_files_from_dir = { \
test -z "$$files" \
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
$(am__cd) "$$dir" && rm -f $$files; }; \
}
DATA = $(nobase_pkgdata_DATA)
ETAGS = etags
CTAGS = ctags
@ -499,12 +510,16 @@ DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
distdir = $(PACKAGE)-$(VERSION)
top_distdir = $(distdir)
am__remove_distdir = \
{ test ! -d "$(distdir)" \
|| { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
&& rm -fr "$(distdir)"; }; }
if test -d "$(distdir)"; then \
find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
&& rm -rf "$(distdir)" \
|| { sleep 5 && rm -rf "$(distdir)"; }; \
else :; fi
DIST_ARCHIVES = $(distdir).tar.gz
GZIP_ENV = --best
distuninstallcheck_listfiles = find . -type f -print
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
distcleancheck_listfiles = find . -type f -print
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
@ -710,9 +725,9 @@ libavocado_a_SOURCES = Basics/ConditionLocker.cpp \
BasicsC/associative-multi.c BasicsC/associative.c \
BasicsC/conversions.c BasicsC/csv.c BasicsC/error.c \
BasicsC/files.c BasicsC/hashes.c BasicsC/init.c BasicsC/json.c \
BasicsC/linked-list.c BasicsC/locks-macos.c \
BasicsC/locks-posix.c BasicsC/logging.c BasicsC/memory.c \
BasicsC/process-utils.c BasicsC/random.c \
BasicsC/json-utilities.c BasicsC/linked-list.c \
BasicsC/locks-macos.c BasicsC/locks-posix.c BasicsC/logging.c \
BasicsC/memory.c BasicsC/process-utils.c BasicsC/random.c \
BasicsC/socket-utils.c BasicsC/string-buffer.c \
BasicsC/strings.c BasicsC/structures.c \
BasicsC/system-functions.c BasicsC/terminal-utils-ncurses.c \
@ -783,6 +798,7 @@ avocado_SOURCES = \
HttpsServer/HttpsServerImpl.cpp \
PriorityQueue/pqueueindex.c \
PriorityQueue/priorityqueue.c \
Ahuacatl/ahuacatl-access-optimizer.c \
Ahuacatl/ahuacatl-ast-node.c \
Ahuacatl/ahuacatl-bind-parameter.c \
Ahuacatl/ahuacatl-codegen-js.c \
@ -1033,10 +1049,12 @@ CLIENT_OPT := --startup.directory ./js --startup.modules-path ./js/client/module
@ENABLE_BOOST_TEST_TRUE@UnitTests_basics_suite_SOURCES = \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Runner.cpp \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Philadelphia/json-test.cpp \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Philadelphia/json-utilities-test.cpp \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Philadelphia/hashes-test.cpp \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Philadelphia/associative-pointer-test.cpp \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Philadelphia/string-buffer-test.cpp \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Philadelphia/string-utf8-test.cpp \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Philadelphia/string-test.cpp \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Philadelphia/vector-pointer-test.cpp \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Philadelphia/vector-test.cpp \
@ENABLE_BOOST_TEST_TRUE@ UnitTests/Jutland/StringBufferTest.cpp \
@ -1087,7 +1105,7 @@ all: $(BUILT_SOURCES)
.SUFFIXES:
.SUFFIXES: .c .cpp .o .obj
am--refresh:
am--refresh: Makefile
@:
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/Makefile.files $(srcdir)/Makefile.doxygen $(srcdir)/Makefile.javascript $(srcdir)/Makefile.unittests $(srcdir)/Makefile.flex $(srcdir)/Makefile.bison $(srcdir)/m4/Makefile.all-in-one-libev $(srcdir)/m4/Makefile.all-in-one-v8 $(srcdir)/m4/Makefile.all-in-one-mruby $(am__configure_deps)
@for dep in $?; do \
@ -1112,6 +1130,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
esac;
$(srcdir)/Makefile.files $(srcdir)/Makefile.doxygen $(srcdir)/Makefile.javascript $(srcdir)/Makefile.unittests $(srcdir)/Makefile.flex $(srcdir)/Makefile.bison $(srcdir)/m4/Makefile.all-in-one-libev $(srcdir)/m4/Makefile.all-in-one-v8 $(srcdir)/m4/Makefile.all-in-one-mruby:
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
$(SHELL) ./config.status --recheck
@ -1123,10 +1142,8 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps)
$(am__aclocal_m4_deps):
config/config.h: config/stamp-h1
@if test ! -f $@; then \
rm -f config/stamp-h1; \
$(MAKE) $(AM_MAKEFLAGS) config/stamp-h1; \
else :; fi
@if test ! -f $@; then rm -f config/stamp-h1; else :; fi
@if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) config/stamp-h1; else :; fi
config/stamp-h1: $(top_srcdir)/config/config.h.in $(top_builddir)/config.status
@rm -f config/stamp-h1
@ -1137,10 +1154,8 @@ $(top_srcdir)/config/config.h.in: $(am__configure_deps)
touch $@
BasicsC/local-configuration.h: BasicsC/stamp-h2
@if test ! -f $@; then \
rm -f BasicsC/stamp-h2; \
$(MAKE) $(AM_MAKEFLAGS) BasicsC/stamp-h2; \
else :; fi
@if test ! -f $@; then rm -f BasicsC/stamp-h2; else :; fi
@if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) BasicsC/stamp-h2; else :; fi
BasicsC/stamp-h2: $(top_srcdir)/BasicsC/local-configuration.h.in $(top_builddir)/config.status
@rm -f BasicsC/stamp-h2
@ -1219,6 +1234,8 @@ BasicsC/init.$(OBJEXT): BasicsC/$(am__dirstamp) \
BasicsC/$(DEPDIR)/$(am__dirstamp)
BasicsC/json.$(OBJEXT): BasicsC/$(am__dirstamp) \
BasicsC/$(DEPDIR)/$(am__dirstamp)
BasicsC/json-utilities.$(OBJEXT): BasicsC/$(am__dirstamp) \
BasicsC/$(DEPDIR)/$(am__dirstamp)
BasicsC/linked-list.$(OBJEXT): BasicsC/$(am__dirstamp) \
BasicsC/$(DEPDIR)/$(am__dirstamp)
BasicsC/locks-macos.$(OBJEXT): BasicsC/$(am__dirstamp) \
@ -1442,7 +1459,7 @@ MRuby/MRLineEditor.$(OBJEXT): MRuby/$(am__dirstamp) \
MRuby/$(DEPDIR)/$(am__dirstamp)
MRuby/mr-utils.$(OBJEXT): MRuby/$(am__dirstamp) \
MRuby/$(DEPDIR)/$(am__dirstamp)
libavocado.a: $(libavocado_a_OBJECTS) $(libavocado_a_DEPENDENCIES)
libavocado.a: $(libavocado_a_OBJECTS) $(libavocado_a_DEPENDENCIES) $(EXTRA_libavocado_a_DEPENDENCIES)
$(AM_V_at)-rm -f libavocado.a
$(AM_V_AR)$(libavocado_a_AR) libavocado.a $(libavocado_a_OBJECTS) $(libavocado_a_LIBADD)
$(AM_V_at)$(RANLIB) libavocado.a
@ -1540,6 +1557,9 @@ UnitTests/Philadelphia/$(DEPDIR)/$(am__dirstamp):
UnitTests/Philadelphia/json-test.$(OBJEXT): \
UnitTests/Philadelphia/$(am__dirstamp) \
UnitTests/Philadelphia/$(DEPDIR)/$(am__dirstamp)
UnitTests/Philadelphia/json-utilities-test.$(OBJEXT): \
UnitTests/Philadelphia/$(am__dirstamp) \
UnitTests/Philadelphia/$(DEPDIR)/$(am__dirstamp)
UnitTests/Philadelphia/hashes-test.$(OBJEXT): \
UnitTests/Philadelphia/$(am__dirstamp) \
UnitTests/Philadelphia/$(DEPDIR)/$(am__dirstamp)
@ -1552,6 +1572,9 @@ UnitTests/Philadelphia/string-buffer-test.$(OBJEXT): \
UnitTests/Philadelphia/string-utf8-test.$(OBJEXT): \
UnitTests/Philadelphia/$(am__dirstamp) \
UnitTests/Philadelphia/$(DEPDIR)/$(am__dirstamp)
UnitTests/Philadelphia/string-test.$(OBJEXT): \
UnitTests/Philadelphia/$(am__dirstamp) \
UnitTests/Philadelphia/$(DEPDIR)/$(am__dirstamp)
UnitTests/Philadelphia/vector-pointer-test.$(OBJEXT): \
UnitTests/Philadelphia/$(am__dirstamp) \
UnitTests/Philadelphia/$(DEPDIR)/$(am__dirstamp)
@ -1570,7 +1593,7 @@ UnitTests/Jutland/StringBufferTest.$(OBJEXT): \
UnitTests/Jutland/StringUtilsTest.$(OBJEXT): \
UnitTests/Jutland/$(am__dirstamp) \
UnitTests/Jutland/$(DEPDIR)/$(am__dirstamp)
UnitTests/basics_suite$(EXEEXT): $(UnitTests_basics_suite_OBJECTS) $(UnitTests_basics_suite_DEPENDENCIES) UnitTests/$(am__dirstamp)
UnitTests/basics_suite$(EXEEXT): $(UnitTests_basics_suite_OBJECTS) $(UnitTests_basics_suite_DEPENDENCIES) $(EXTRA_UnitTests_basics_suite_DEPENDENCIES) UnitTests/$(am__dirstamp)
@rm -f UnitTests/basics_suite$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(UnitTests_basics_suite_OBJECTS) $(UnitTests_basics_suite_LDADD) $(LIBS)
UnitTests/Cambridge/$(am__dirstamp):
@ -1585,7 +1608,7 @@ UnitTests/Cambridge/Runner.$(OBJEXT): \
UnitTests/Cambridge/georeg.$(OBJEXT): \
UnitTests/Cambridge/$(am__dirstamp) \
UnitTests/Cambridge/$(DEPDIR)/$(am__dirstamp)
UnitTests/geo_suite$(EXEEXT): $(UnitTests_geo_suite_OBJECTS) $(UnitTests_geo_suite_DEPENDENCIES) UnitTests/$(am__dirstamp)
UnitTests/geo_suite$(EXEEXT): $(UnitTests_geo_suite_OBJECTS) $(UnitTests_geo_suite_DEPENDENCIES) $(EXTRA_UnitTests_geo_suite_DEPENDENCIES) UnitTests/$(am__dirstamp)
@rm -f UnitTests/geo_suite$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(UnitTests_geo_suite_OBJECTS) $(UnitTests_geo_suite_LDADD) $(LIBS)
Admin/$(am__dirstamp):
@ -1718,6 +1741,8 @@ Ahuacatl/$(am__dirstamp):
Ahuacatl/$(DEPDIR)/$(am__dirstamp):
@$(MKDIR_P) Ahuacatl/$(DEPDIR)
@: > Ahuacatl/$(DEPDIR)/$(am__dirstamp)
Ahuacatl/ahuacatl-access-optimizer.$(OBJEXT): \
Ahuacatl/$(am__dirstamp) Ahuacatl/$(DEPDIR)/$(am__dirstamp)
Ahuacatl/ahuacatl-ast-node.$(OBJEXT): Ahuacatl/$(am__dirstamp) \
Ahuacatl/$(DEPDIR)/$(am__dirstamp)
Ahuacatl/ahuacatl-bind-parameter.$(OBJEXT): Ahuacatl/$(am__dirstamp) \
@ -1937,7 +1962,7 @@ VocBase/voc-shaper.$(OBJEXT): VocBase/$(am__dirstamp) \
VocBase/$(DEPDIR)/$(am__dirstamp)
VocBase/vocbase.$(OBJEXT): VocBase/$(am__dirstamp) \
VocBase/$(DEPDIR)/$(am__dirstamp)
avocado$(EXEEXT): $(avocado_OBJECTS) $(avocado_DEPENDENCIES)
avocado$(EXEEXT): $(avocado_OBJECTS) $(avocado_DEPENDENCIES) $(EXTRA_avocado_DEPENDENCIES)
@rm -f avocado$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(avocado_OBJECTS) $(avocado_LDADD) $(LIBS)
SimpleHttpClient/$(am__dirstamp):
@ -1964,7 +1989,7 @@ V8Client/V8ClientConnection.$(OBJEXT): V8Client/$(am__dirstamp) \
V8Client/$(DEPDIR)/$(am__dirstamp)
V8Client/avocimp.$(OBJEXT): V8Client/$(am__dirstamp) \
V8Client/$(DEPDIR)/$(am__dirstamp)
avocimp$(EXEEXT): $(avocimp_OBJECTS) $(avocimp_DEPENDENCIES)
avocimp$(EXEEXT): $(avocimp_OBJECTS) $(avocimp_DEPENDENCIES) $(EXTRA_avocimp_DEPENDENCIES)
@rm -f avocimp$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(avocimp_OBJECTS) $(avocimp_LDADD) $(LIBS)
MRClient/$(am__dirstamp):
@ -1975,12 +2000,12 @@ MRClient/$(DEPDIR)/$(am__dirstamp):
@: > MRClient/$(DEPDIR)/$(am__dirstamp)
MRClient/avocirb.$(OBJEXT): MRClient/$(am__dirstamp) \
MRClient/$(DEPDIR)/$(am__dirstamp)
avocirb$(EXEEXT): $(avocirb_OBJECTS) $(avocirb_DEPENDENCIES)
avocirb$(EXEEXT): $(avocirb_OBJECTS) $(avocirb_DEPENDENCIES) $(EXTRA_avocirb_DEPENDENCIES)
@rm -f avocirb$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(avocirb_OBJECTS) $(avocirb_LDADD) $(LIBS)
V8Client/avocsh.$(OBJEXT): V8Client/$(am__dirstamp) \
V8Client/$(DEPDIR)/$(am__dirstamp)
avocsh$(EXEEXT): $(avocsh_OBJECTS) $(avocsh_DEPENDENCIES)
avocsh$(EXEEXT): $(avocsh_OBJECTS) $(avocsh_DEPENDENCIES) $(EXTRA_avocsh_DEPENDENCIES)
@rm -f avocsh$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(avocsh_OBJECTS) $(avocsh_LDADD) $(LIBS)
@ -1992,6 +2017,7 @@ mostlyclean-compile:
-rm -f Admin/RestAdminLogHandler.$(OBJEXT)
-rm -f Admin/RestBaseHandler.$(OBJEXT)
-rm -f Admin/RestVersionHandler.$(OBJEXT)
-rm -f Ahuacatl/ahuacatl-access-optimizer.$(OBJEXT)
-rm -f Ahuacatl/ahuacatl-ast-node.$(OBJEXT)
-rm -f Ahuacatl/ahuacatl-bind-parameter.$(OBJEXT)
-rm -f Ahuacatl/ahuacatl-codegen-js.$(OBJEXT)
@ -2038,6 +2064,7 @@ mostlyclean-compile:
-rm -f BasicsC/files.$(OBJEXT)
-rm -f BasicsC/hashes.$(OBJEXT)
-rm -f BasicsC/init.$(OBJEXT)
-rm -f BasicsC/json-utilities.$(OBJEXT)
-rm -f BasicsC/json.$(OBJEXT)
-rm -f BasicsC/linked-list.$(OBJEXT)
-rm -f BasicsC/locks-macos.$(OBJEXT)
@ -2152,7 +2179,9 @@ mostlyclean-compile:
-rm -f UnitTests/Philadelphia/associative-pointer-test.$(OBJEXT)
-rm -f UnitTests/Philadelphia/hashes-test.$(OBJEXT)
-rm -f UnitTests/Philadelphia/json-test.$(OBJEXT)
-rm -f UnitTests/Philadelphia/json-utilities-test.$(OBJEXT)
-rm -f UnitTests/Philadelphia/string-buffer-test.$(OBJEXT)
-rm -f UnitTests/Philadelphia/string-test.$(OBJEXT)
-rm -f UnitTests/Philadelphia/string-utf8-test.$(OBJEXT)
-rm -f UnitTests/Philadelphia/vector-pointer-test.$(OBJEXT)
-rm -f UnitTests/Philadelphia/vector-test.$(OBJEXT)
@ -2237,6 +2266,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@Admin/$(DEPDIR)/RestAdminLogHandler.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@Admin/$(DEPDIR)/RestBaseHandler.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@Admin/$(DEPDIR)/RestVersionHandler.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@Ahuacatl/$(DEPDIR)/ahuacatl-access-optimizer.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@Ahuacatl/$(DEPDIR)/ahuacatl-ast-node.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@Ahuacatl/$(DEPDIR)/ahuacatl-bind-parameter.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@Ahuacatl/$(DEPDIR)/ahuacatl-codegen-js.Po@am__quote@
@ -2283,6 +2313,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@BasicsC/$(DEPDIR)/files.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@BasicsC/$(DEPDIR)/hashes.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@BasicsC/$(DEPDIR)/init.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@BasicsC/$(DEPDIR)/json-utilities.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@BasicsC/$(DEPDIR)/json.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@BasicsC/$(DEPDIR)/linked-list.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@BasicsC/$(DEPDIR)/locks-macos.Po@am__quote@
@ -2398,7 +2429,9 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@UnitTests/Philadelphia/$(DEPDIR)/associative-pointer-test.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@UnitTests/Philadelphia/$(DEPDIR)/hashes-test.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@UnitTests/Philadelphia/$(DEPDIR)/json-test.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@UnitTests/Philadelphia/$(DEPDIR)/json-utilities-test.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@UnitTests/Philadelphia/$(DEPDIR)/string-buffer-test.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@UnitTests/Philadelphia/$(DEPDIR)/string-test.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@UnitTests/Philadelphia/$(DEPDIR)/string-utf8-test.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@UnitTests/Philadelphia/$(DEPDIR)/vector-pointer-test.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@UnitTests/Philadelphia/$(DEPDIR)/vector-test.Po@am__quote@
@ -2477,37 +2510,33 @@ distclean-compile:
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ $<
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
.c.obj:
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
.cpp.o:
@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
.cpp.obj:
@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
install-nobase_pkgdataDATA: $(nobase_pkgdata_DATA)
@$(NORMAL_INSTALL)
test -z "$(pkgdatadir)" || $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)"
@ -2528,9 +2557,7 @@ uninstall-nobase_pkgdataDATA:
@$(NORMAL_UNINSTALL)
@list='$(nobase_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
$(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \
test -n "$$files" || exit 0; \
echo " ( cd '$(DESTDIR)$(pkgdatadir)' && rm -f" $$files ")"; \
cd "$(DESTDIR)$(pkgdatadir)" && rm -f $$files
dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@ -2628,7 +2655,11 @@ dist-gzip: distdir
$(am__remove_distdir)
dist-bzip2: distdir
tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
$(am__remove_distdir)
dist-lzip: distdir
tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
$(am__remove_distdir)
dist-lzma: distdir
@ -2636,7 +2667,7 @@ dist-lzma: distdir
$(am__remove_distdir)
dist-xz: distdir
tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
$(am__remove_distdir)
dist-tarZ: distdir
@ -2667,6 +2698,8 @@ distcheck: dist
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
*.tar.lzma*) \
lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
*.tar.lz*) \
lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
*.tar.xz*) \
xz -dc $(distdir).tar.xz | $(am__untar) ;;\
*.tar.Z*) \
@ -2686,6 +2719,7 @@ distcheck: dist
&& am__cwd=`pwd` \
&& $(am__cd) $(distdir)/_build \
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \
$(AM_DISTCHECK_CONFIGURE_FLAGS) \
$(DISTCHECK_CONFIGURE_FLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
@ -2714,8 +2748,16 @@ distcheck: dist
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
distuninstallcheck:
@$(am__cd) '$(distuninstallcheck_dir)' \
&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
@test -n '$(distuninstallcheck_dir)' || { \
echo 'ERROR: trying to run $@ with an empty' \
'$$(distuninstallcheck_dir)' >&2; \
exit 1; \
}; \
$(am__cd) '$(distuninstallcheck_dir)' || { \
echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
exit 1; \
}; \
test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
|| { echo "ERROR: files left after uninstall:" ; \
if test -n "$(DESTDIR)"; then \
echo " (check DESTDIR support)"; \
@ -2750,10 +2792,15 @@ install-am: all-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
if test -z '$(STRIP)'; then \
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
install; \
else \
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
clean-generic:
@ -2921,8 +2968,8 @@ uninstall-am: uninstall-binPROGRAMS uninstall-nobase_pkgdataDATA \
.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \
clean-binPROGRAMS clean-generic clean-local \
clean-noinstLIBRARIES clean-noinstPROGRAMS clean-sbinPROGRAMS \
ctags dist dist-all dist-bzip2 dist-gzip dist-lzma dist-shar \
dist-tarZ dist-xz dist-zip distcheck distclean \
ctags dist dist-all dist-bzip2 dist-gzip dist-lzip dist-lzma \
dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \
distclean-compile distclean-generic distclean-hdr \
distclean-tags distcleancheck distdir distuninstallcheck dvi \
dvi-am html html-am info info-am install install-am \

View File

@ -101,10 +101,12 @@ UnitTests_basics_suite_DEPENDENCIES = @top_builddir@/libavocado.a
UnitTests_basics_suite_SOURCES = \
UnitTests/Runner.cpp \
UnitTests/Philadelphia/json-test.cpp \
UnitTests/Philadelphia/json-utilities-test.cpp \
UnitTests/Philadelphia/hashes-test.cpp \
UnitTests/Philadelphia/associative-pointer-test.cpp \
UnitTests/Philadelphia/string-buffer-test.cpp \
UnitTests/Philadelphia/string-utf8-test.cpp \
UnitTests/Philadelphia/string-test.cpp \
UnitTests/Philadelphia/vector-pointer-test.cpp \
UnitTests/Philadelphia/vector-test.cpp \
UnitTests/Jutland/StringBufferTest.cpp \

View File

@ -292,7 +292,7 @@ BOOST_AUTO_TEST_CASE (tst_json_list_empty) {
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test empty json list mixed
/// @brief test json list mixed
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_json_list_mixed) {
@ -305,9 +305,40 @@ BOOST_AUTO_TEST_CASE (tst_json_list_mixed) {
TRI_PushBack3ListJson(TRI_UNKNOWN_MEM_ZONE, json, TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, -8093));
TRI_PushBack3ListJson(TRI_UNKNOWN_MEM_ZONE, json, TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, 1.5));
TRI_PushBack3ListJson(TRI_UNKNOWN_MEM_ZONE, json, TRI_CreateStringCopyJson(TRI_UNKNOWN_MEM_ZONE, (char*) "the quick brown fox"));
TRI_PushBack3ListJson(TRI_UNKNOWN_MEM_ZONE, json, TRI_CreateListJson(TRI_UNKNOWN_MEM_ZONE));
TRI_PushBack3ListJson(TRI_UNKNOWN_MEM_ZONE, json, TRI_CreateArrayJson(TRI_UNKNOWN_MEM_ZONE));
STRINGIFY
BOOST_CHECK_EQUAL("[null,true,false,-8093,1.5,\"the quick brown fox\"]", STRING_VALUE);
BOOST_CHECK_EQUAL("[null,true,false,-8093,1.5,\"the quick brown fox\",[],{}]", STRING_VALUE);
FREE_JSON
FREE_BUFFER
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test json lists nested
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_json_list_nested) {
INIT_BUFFER
TRI_json_t* json = TRI_CreateListJson(TRI_UNKNOWN_MEM_ZONE);
TRI_json_t* list1 = TRI_CreateListJson(TRI_UNKNOWN_MEM_ZONE);
TRI_json_t* list2 = TRI_CreateListJson(TRI_UNKNOWN_MEM_ZONE);
TRI_json_t* list3 = TRI_CreateListJson(TRI_UNKNOWN_MEM_ZONE);
TRI_json_t* list4 = TRI_CreateListJson(TRI_UNKNOWN_MEM_ZONE);
TRI_PushBack3ListJson(TRI_UNKNOWN_MEM_ZONE, list1, TRI_CreateBooleanJson(TRI_UNKNOWN_MEM_ZONE, true));
TRI_PushBack3ListJson(TRI_UNKNOWN_MEM_ZONE, list1, TRI_CreateBooleanJson(TRI_UNKNOWN_MEM_ZONE, false));
TRI_PushBack3ListJson(TRI_UNKNOWN_MEM_ZONE, list2, TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, -8093));
TRI_PushBack3ListJson(TRI_UNKNOWN_MEM_ZONE, list2, TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, 1.5));
TRI_PushBack3ListJson(TRI_UNKNOWN_MEM_ZONE, list3, TRI_CreateStringCopyJson(TRI_UNKNOWN_MEM_ZONE, (char*) "the quick brown fox"));
TRI_PushBack3ListJson(TRI_UNKNOWN_MEM_ZONE, json, list1);
TRI_PushBack3ListJson(TRI_UNKNOWN_MEM_ZONE, json, list2);
TRI_PushBack3ListJson(TRI_UNKNOWN_MEM_ZONE, json, list3);
TRI_PushBack3ListJson(TRI_UNKNOWN_MEM_ZONE, json, list4);
STRINGIFY
BOOST_CHECK_EQUAL("[[true,false],[-8093,1.5],[\"the quick brown fox\"],[]]", STRING_VALUE);
FREE_JSON
FREE_BUFFER
}
@ -327,6 +358,107 @@ BOOST_AUTO_TEST_CASE (tst_json_array_empty) {
FREE_BUFFER
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test json array mixed
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_json_array_mixed) {
INIT_BUFFER
TRI_json_t* json = TRI_CreateArrayJson(TRI_UNKNOWN_MEM_ZONE);
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "one", TRI_CreateNullJson(TRI_UNKNOWN_MEM_ZONE));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "two", TRI_CreateBooleanJson(TRI_UNKNOWN_MEM_ZONE, true));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "three", TRI_CreateBooleanJson(TRI_UNKNOWN_MEM_ZONE, false));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "four", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, -8093));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "five", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, 1.5));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "six", TRI_CreateStringCopyJson(TRI_UNKNOWN_MEM_ZONE, (char*) "the quick brown fox"));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "seven", TRI_CreateListJson(TRI_UNKNOWN_MEM_ZONE));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "eight", TRI_CreateArrayJson(TRI_UNKNOWN_MEM_ZONE));
STRINGIFY
BOOST_CHECK_EQUAL("{\"one\":null,\"two\":true,\"three\":false,\"four\":-8093,\"five\":1.5,\"six\":\"the quick brown fox\",\"seven\":[],\"eight\":{}}", STRING_VALUE);
FREE_JSON
FREE_BUFFER
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test nested json array
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_json_array_nested) {
INIT_BUFFER
TRI_json_t* json = TRI_CreateArrayJson(TRI_UNKNOWN_MEM_ZONE);
TRI_json_t* array1 = TRI_CreateArrayJson(TRI_UNKNOWN_MEM_ZONE);
TRI_json_t* array2 = TRI_CreateArrayJson(TRI_UNKNOWN_MEM_ZONE);
TRI_json_t* array3 = TRI_CreateArrayJson(TRI_UNKNOWN_MEM_ZONE);
TRI_json_t* array4 = TRI_CreateArrayJson(TRI_UNKNOWN_MEM_ZONE);
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, array1, "one", TRI_CreateNullJson(TRI_UNKNOWN_MEM_ZONE));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, array1, "two", TRI_CreateBooleanJson(TRI_UNKNOWN_MEM_ZONE, true));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, array1, "three", TRI_CreateBooleanJson(TRI_UNKNOWN_MEM_ZONE, false));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, array2, "four", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, -8093));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, array2, "five", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, 1.5));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, array2, "six", TRI_CreateStringCopyJson(TRI_UNKNOWN_MEM_ZONE, (char*) "the quick brown fox"));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, array3, "seven", TRI_CreateListJson(TRI_UNKNOWN_MEM_ZONE));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, array3, "eight", TRI_CreateArrayJson(TRI_UNKNOWN_MEM_ZONE));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "one", array1);
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "two", array2);
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "three", array3);
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "four", array4);
STRINGIFY
BOOST_CHECK_EQUAL("{\"one\":{\"one\":null,\"two\":true,\"three\":false},\"two\":{\"four\":-8093,\"five\":1.5,\"six\":\"the quick brown fox\"},\"three\":{\"seven\":[],\"eight\":{}},\"four\":{}}", STRING_VALUE);
FREE_JSON
FREE_BUFFER
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test json array keys
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_json_array_keys) {
INIT_BUFFER
TRI_json_t* json = TRI_CreateArrayJson(TRI_UNKNOWN_MEM_ZONE);
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "\"quoted\"", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, 1));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "'quoted'", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, 2));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "\\slashed\\\"", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, 3));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "white spaced", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, 4));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "line\\nbreak", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, 5));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, 6));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, " ", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, 7));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "null", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, 8));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "true", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, 9));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "false", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, 10));
STRINGIFY
BOOST_CHECK_EQUAL("{\"\\\"quoted\\\"\":1,\"'quoted'\":2,\"\\\\slashed\\\\\\\"\":3,\"white spaced\":4,\"line\\\\nbreak\":5,\"\":6,\" \":7,\"null\":8,\"true\":9,\"false\":10}", STRING_VALUE);
FREE_JSON
FREE_BUFFER
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test utf8 json array keys
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_json_array_keys_utf8) {
INIT_BUFFER
TRI_json_t* json = TRI_CreateArrayJson(TRI_UNKNOWN_MEM_ZONE);
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "äöüÄÖÜß", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, 1));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "코리아닷컴", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, 2));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "ジャパン", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, 3));
TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, json, "мадридского", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, 4));
STRINGIFY
BOOST_CHECK_EQUAL("{\"\\u00E4\\u00F6\\u00FC\\u00C4\\u00D6\\u00DC\\u00DF\":1,\"\\uCF54\\uB9AC\\uC544\\uB2F7\\uCEF4\":2,\"\\u30B8\\u30E3\\u30D1\\u30F3\":3,\"\\u043C\\u0430\\u0434\\u0440\\u0438\\u0434\\u0441\\u043A\\u043E\\u0433\\u043E\":4}", STRING_VALUE);
FREE_JSON
FREE_BUFFER
}
// TODO: add tests for lookup json array value etc.
////////////////////////////////////////////////////////////////////////////////
/// @brief generate tests
////////////////////////////////////////////////////////////////////////////////

View File

@ -0,0 +1,431 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief test suite for json-utilities.c
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Jan Steemann
/// @author Copyright 2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#include <boost/test/unit_test.hpp>
#include "BasicsC/json-utilities.h"
#include "BasicsC/string-buffer.h"
// -----------------------------------------------------------------------------
// --SECTION-- private macros
// -----------------------------------------------------------------------------
#define JSON_CHECK(expected, func, lValue, rValue) \
l = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, lValue); \
r = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, rValue); \
if (l && r) { \
BOOST_CHECK_EQUAL(expected, func(l, r)); \
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, l); \
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, r); \
}
#define INIT_BUFFER TRI_string_buffer_t* sb = TRI_CreateStringBuffer(TRI_UNKNOWN_MEM_ZONE);
#define FREE_BUFFER TRI_FreeStringBuffer(TRI_UNKNOWN_MEM_ZONE, sb);
#define STRINGIFY TRI_StringifyJson(sb, json);
#define STRING_VALUE sb->_buffer
#define FREE_JSON TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, json);
// -----------------------------------------------------------------------------
// --SECTION-- setup / tear-down
// -----------------------------------------------------------------------------
struct CJsonUtilitiesSetup {
CJsonUtilitiesSetup () {
BOOST_TEST_MESSAGE("setup json utilities test");
}
~CJsonUtilitiesSetup () {
BOOST_TEST_MESSAGE("tear-down json utilities test");
}
};
// -----------------------------------------------------------------------------
// --SECTION-- test suite
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @brief setup
////////////////////////////////////////////////////////////////////////////////
BOOST_FIXTURE_TEST_SUITE(CJsonUtilitiesTest, CJsonUtilitiesSetup)
////////////////////////////////////////////////////////////////////////////////
/// @brief test compare values with equal values
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_compare_values_equal) {
TRI_json_t* l;
TRI_json_t* r;
JSON_CHECK(0, TRI_CompareValuesJson, "null", "null");
JSON_CHECK(0, TRI_CompareValuesJson, "false", "false");
JSON_CHECK(0, TRI_CompareValuesJson, "true", "true");
JSON_CHECK(0, TRI_CompareValuesJson, "0", "0");
JSON_CHECK(0, TRI_CompareValuesJson, "1", "1");
JSON_CHECK(0, TRI_CompareValuesJson, "1.5", "1.5");
JSON_CHECK(0, TRI_CompareValuesJson, "-43.2", "-43.2");
JSON_CHECK(0, TRI_CompareValuesJson, "\"\"", "\"\"");
JSON_CHECK(0, TRI_CompareValuesJson, "\" \"", "\" \"");
JSON_CHECK(0, TRI_CompareValuesJson, "\"the quick brown fox\"", "\"the quick brown fox\"");
JSON_CHECK(0, TRI_CompareValuesJson, "[]", "[]");
JSON_CHECK(0, TRI_CompareValuesJson, "[-1]", "[-1]");
JSON_CHECK(0, TRI_CompareValuesJson, "[0]", "[0]");
JSON_CHECK(0, TRI_CompareValuesJson, "[1]", "[1]");
JSON_CHECK(0, TRI_CompareValuesJson, "[true]", "[true]");
JSON_CHECK(0, TRI_CompareValuesJson, "{}", "{}");
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test compare values with unequal values
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_compare_values_unequal) {
TRI_json_t* l;
TRI_json_t* r;
JSON_CHECK(-1, TRI_CompareValuesJson, "null", "false");
JSON_CHECK(-1, TRI_CompareValuesJson, "null", "true");
JSON_CHECK(-1, TRI_CompareValuesJson, "null", "-1");
JSON_CHECK(-1, TRI_CompareValuesJson, "null", "0");
JSON_CHECK(-1, TRI_CompareValuesJson, "null", "1");
JSON_CHECK(-1, TRI_CompareValuesJson, "null", "-10");
JSON_CHECK(-1, TRI_CompareValuesJson, "null", "\"\"");
JSON_CHECK(-1, TRI_CompareValuesJson, "null", "\"0\"");
JSON_CHECK(-1, TRI_CompareValuesJson, "null", "\" \"");
JSON_CHECK(-1, TRI_CompareValuesJson, "null", "[]");
JSON_CHECK(-1, TRI_CompareValuesJson, "null", "[null]");
JSON_CHECK(-1, TRI_CompareValuesJson, "null", "[false]");
JSON_CHECK(-1, TRI_CompareValuesJson, "null", "[true]");
JSON_CHECK(-1, TRI_CompareValuesJson, "null", "[0]");
JSON_CHECK(-1, TRI_CompareValuesJson, "null", "{}");
JSON_CHECK(-1, TRI_CompareValuesJson, "false", "true");
JSON_CHECK(-1, TRI_CompareValuesJson, "false", "-1");
JSON_CHECK(-1, TRI_CompareValuesJson, "false", "0");
JSON_CHECK(-1, TRI_CompareValuesJson, "false", "1");
JSON_CHECK(-1, TRI_CompareValuesJson, "false", "-10");
JSON_CHECK(-1, TRI_CompareValuesJson, "false", "\"\"");
JSON_CHECK(-1, TRI_CompareValuesJson, "false", "\"0\"");
JSON_CHECK(-1, TRI_CompareValuesJson, "false", "\" \"");
JSON_CHECK(-1, TRI_CompareValuesJson, "false", "[]");
JSON_CHECK(-1, TRI_CompareValuesJson, "false", "[null]");
JSON_CHECK(-1, TRI_CompareValuesJson, "false", "[false]");
JSON_CHECK(-1, TRI_CompareValuesJson, "false", "[true]");
JSON_CHECK(-1, TRI_CompareValuesJson, "false", "[0]");
JSON_CHECK(-1, TRI_CompareValuesJson, "false", "{}");
JSON_CHECK(-1, TRI_CompareValuesJson, "true", "-1");
JSON_CHECK(-1, TRI_CompareValuesJson, "true", "0");
JSON_CHECK(-1, TRI_CompareValuesJson, "true", "1");
JSON_CHECK(-1, TRI_CompareValuesJson, "true", "-10");
JSON_CHECK(-1, TRI_CompareValuesJson, "true", "\"\"");
JSON_CHECK(-1, TRI_CompareValuesJson, "true", "\"0\"");
JSON_CHECK(-1, TRI_CompareValuesJson, "true", "\" \"");
JSON_CHECK(-1, TRI_CompareValuesJson, "true", "[]");
JSON_CHECK(-1, TRI_CompareValuesJson, "true", "[null]");
JSON_CHECK(-1, TRI_CompareValuesJson, "true", "[false]");
JSON_CHECK(-1, TRI_CompareValuesJson, "true", "[true]");
JSON_CHECK(-1, TRI_CompareValuesJson, "true", "[0]");
JSON_CHECK(-1, TRI_CompareValuesJson, "true", "{}");
JSON_CHECK(-1, TRI_CompareValuesJson, "-2", "-1");
JSON_CHECK(-1, TRI_CompareValuesJson, "-10", "-9");
JSON_CHECK(-1, TRI_CompareValuesJson, "-20", "-5");
JSON_CHECK(-1, TRI_CompareValuesJson, "-5", "-2");
JSON_CHECK(-1, TRI_CompareValuesJson, "true", "1");
JSON_CHECK(-1, TRI_CompareValuesJson, "1.5", "1.6");
JSON_CHECK(-1, TRI_CompareValuesJson, "10.5", "10.51");
JSON_CHECK(-1, TRI_CompareValuesJson, "0", "\"\"");
JSON_CHECK(-1, TRI_CompareValuesJson, "0", "\"0\"");
JSON_CHECK(-1, TRI_CompareValuesJson, "0", "\"-1\"");
JSON_CHECK(-1, TRI_CompareValuesJson, "1", "\"-1\"");
JSON_CHECK(-1, TRI_CompareValuesJson, "1", "\" \"");
JSON_CHECK(-1, TRI_CompareValuesJson, "0", "[]");
JSON_CHECK(-1, TRI_CompareValuesJson, "0", "[-1]");
JSON_CHECK(-1, TRI_CompareValuesJson, "0", "[0]");
JSON_CHECK(-1, TRI_CompareValuesJson, "0", "[1]");
JSON_CHECK(-1, TRI_CompareValuesJson, "0", "[null]");
JSON_CHECK(-1, TRI_CompareValuesJson, "0", "[false");
JSON_CHECK(-1, TRI_CompareValuesJson, "0", "[true]");
JSON_CHECK(-1, TRI_CompareValuesJson, "0", "{}");
JSON_CHECK(-1, TRI_CompareValuesJson, "1", "[]");
JSON_CHECK(-1, TRI_CompareValuesJson, "1", "[-1]");
JSON_CHECK(-1, TRI_CompareValuesJson, "1", "[0]");
JSON_CHECK(-1, TRI_CompareValuesJson, "1", "[1]");
JSON_CHECK(-1, TRI_CompareValuesJson, "1", "[null]");
JSON_CHECK(-1, TRI_CompareValuesJson, "1", "[false");
JSON_CHECK(-1, TRI_CompareValuesJson, "1", "[true]");
JSON_CHECK(-1, TRI_CompareValuesJson, "1", "{}");
// TODO: add more tests
}
// TODO: add tests for
// TRI_CheckSameValueJson
// TRI_BetweenListJson
// TRI_UniquifyListJson
// TRI_UnionizeListsJson
// TRI_IntersectListsJson
// TRI_SortListJson
////////////////////////////////////////////////////////////////////////////////
/// @brief test check in list
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_check_in_list) {
TRI_json_t* l;
TRI_json_t* r;
JSON_CHECK(true, TRI_CheckInListJson, "null", "[1,2,3,null]");
JSON_CHECK(true, TRI_CheckInListJson, "false", "[false]");
JSON_CHECK(true, TRI_CheckInListJson, "true", "[false,true]");
JSON_CHECK(true, TRI_CheckInListJson, "0", "[0]");
JSON_CHECK(true, TRI_CheckInListJson, "0", "[0,1]");
JSON_CHECK(true, TRI_CheckInListJson, "0", "[0,1,2]");
JSON_CHECK(true, TRI_CheckInListJson, "0", "[2,1,0]");
JSON_CHECK(true, TRI_CheckInListJson, "1", "[1,0]");
JSON_CHECK(true, TRI_CheckInListJson, "1", "[2,1,0]");
JSON_CHECK(true, TRI_CheckInListJson, "1", "[12,12,12,12,1]");
JSON_CHECK(true, TRI_CheckInListJson, "12", "[0,9,100,7,12,8]");
JSON_CHECK(true, TRI_CheckInListJson, "15", "[12,13,14,16,17,15]");
JSON_CHECK(true, TRI_CheckInListJson, "\"\"", "[1,2,3,\"\"]");
JSON_CHECK(true, TRI_CheckInListJson, "\"a\"", "[1,2,3,\"a\"]");
JSON_CHECK(true, TRI_CheckInListJson, "\"A\"", "[1,2,\"A\"]");
JSON_CHECK(true, TRI_CheckInListJson, "\"the fox\"", "[1,\"the fox\"]");
JSON_CHECK(true, TRI_CheckInListJson, "[]", "[[]]");
JSON_CHECK(true, TRI_CheckInListJson, "[]", "[2,3,[]]");
JSON_CHECK(true, TRI_CheckInListJson, "[null]", "[[null]]");
JSON_CHECK(true, TRI_CheckInListJson, "[false]", "[[false]]");
JSON_CHECK(true, TRI_CheckInListJson, "[true]", "[[true]]");
JSON_CHECK(true, TRI_CheckInListJson, "[true]", "[[false],[true]]");
JSON_CHECK(true, TRI_CheckInListJson, "[0]", "[1,2,3,[0]]");
JSON_CHECK(true, TRI_CheckInListJson, "[\"a\"]", "[\"b\",\"\",[\"a\"]]");
JSON_CHECK(false, TRI_CheckInListJson, "null", "[0,1,2,3,\"\",false,\"null\"]");
JSON_CHECK(false, TRI_CheckInListJson, "null", "[[null]]");
JSON_CHECK(false, TRI_CheckInListJson, "false", "[0,1,2,3,\"\",\"false\",\"null\"]");
JSON_CHECK(false, TRI_CheckInListJson, "false", "[[false]]");
JSON_CHECK(false, TRI_CheckInListJson, "true", "[\"true\"]");
JSON_CHECK(false, TRI_CheckInListJson, "true", "[[true]]");
JSON_CHECK(false, TRI_CheckInListJson, "0", "[null,false,\"\",\" \"]");
JSON_CHECK(false, TRI_CheckInListJson, "0", "[[0]]");
JSON_CHECK(false, TRI_CheckInListJson, "15", "[12,13,14,16,17]");
JSON_CHECK(false, TRI_CheckInListJson, "15", "[[15]]");
JSON_CHECK(false, TRI_CheckInListJson, "120", "[12,121,1200]");
JSON_CHECK(false, TRI_CheckInListJson, "\"a\"", "[\"A\"]");
JSON_CHECK(false, TRI_CheckInListJson, "\"A\"", "[\"a\"]");
JSON_CHECK(false, TRI_CheckInListJson, "\"a\"", "[\"abc\"]");
JSON_CHECK(false, TRI_CheckInListJson, "\"a\"", "[\"a \"]");
JSON_CHECK(false, TRI_CheckInListJson, "\"the fox\"", "[\"the\",\"fox\"]");
JSON_CHECK(false, TRI_CheckInListJson, "\"a\"", "[[\"a\"]]");
JSON_CHECK(false, TRI_CheckInListJson, "[]", "[]");
JSON_CHECK(false, TRI_CheckInListJson, "[]", "[5,4,3,2,1]");
JSON_CHECK(false, TRI_CheckInListJson, "[0]", "[0,1,2,3]");
JSON_CHECK(false, TRI_CheckInListJson, "[]", "[0,1,2,3]");
JSON_CHECK(false, TRI_CheckInListJson, "[false]", "[false,true]");
JSON_CHECK(false, TRI_CheckInListJson, "[\"a\"]", "[\"a\"]");
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test check in list with an empty list
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_check_in_list_empty) {
TRI_json_t* l;
TRI_json_t* r;
JSON_CHECK(false, TRI_CheckInListJson, "null", "[]");
JSON_CHECK(false, TRI_CheckInListJson, "false", "[]");
JSON_CHECK(false, TRI_CheckInListJson, "true", "[]");
JSON_CHECK(false, TRI_CheckInListJson, "0", "[]");
JSON_CHECK(false, TRI_CheckInListJson, "1", "[]");
JSON_CHECK(false, TRI_CheckInListJson, "\"fox\"", "[]");
JSON_CHECK(false, TRI_CheckInListJson, "", "[]");
JSON_CHECK(false, TRI_CheckInListJson, " ", "[]");
JSON_CHECK(false, TRI_CheckInListJson, "[]", "[]");
JSON_CHECK(false, TRI_CheckInListJson, "{}", "[]");
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test lists union
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_unionize_lists_empty) {
INIT_BUFFER
TRI_json_t* json;
TRI_json_t* list1;
TRI_json_t* list2;
list1 = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, "[]");
list2 = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, "[]");
json = TRI_UnionizeListsJson(list1, list2, true);
STRINGIFY
BOOST_CHECK_EQUAL("[]", STRING_VALUE);
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, list1);
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, list2);
FREE_JSON
FREE_BUFFER
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test lists intersection
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_intersect_lists_empty1) {
INIT_BUFFER
TRI_json_t* json;
TRI_json_t* list1;
TRI_json_t* list2;
list1 = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, "[]");
list2 = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, "[]");
json = TRI_IntersectListsJson(list1, list2, true);
STRINGIFY
BOOST_CHECK_EQUAL("[]", STRING_VALUE);
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, list1);
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, list2);
FREE_JSON
FREE_BUFFER
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test lists intersection
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_intersect_lists_empty2) {
INIT_BUFFER
TRI_json_t* json;
TRI_json_t* list1;
TRI_json_t* list2;
list1 = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, "[1]");
list2 = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, "[]");
json = TRI_IntersectListsJson(list1, list2, true);
STRINGIFY
BOOST_CHECK_EQUAL("[]", STRING_VALUE);
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, list1);
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, list2);
FREE_JSON
FREE_BUFFER
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test lists intersection
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_intersect_lists_empty3) {
INIT_BUFFER
TRI_json_t* json;
TRI_json_t* list1;
TRI_json_t* list2;
list1 = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, "[0]");
list2 = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, "[]");
json = TRI_IntersectListsJson(list1, list2, true);
STRINGIFY
BOOST_CHECK_EQUAL("[]", STRING_VALUE);
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, list1);
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, list2);
FREE_JSON
FREE_BUFFER
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test lists intersection
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_intersect_lists_values1) {
INIT_BUFFER
TRI_json_t* json;
TRI_json_t* list1;
TRI_json_t* list2;
list1 = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, "[0,1,2,3]");
list2 = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, "[2,3,4]");
json = TRI_IntersectListsJson(list1, list2, true);
STRINGIFY
BOOST_CHECK_EQUAL("[2,3]", STRING_VALUE);
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, list1);
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, list2);
FREE_JSON
FREE_BUFFER
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test lists intersection
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_intersect_lists_values2) {
INIT_BUFFER
TRI_json_t* json;
TRI_json_t* list1;
TRI_json_t* list2;
list1 = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, "[null,false,true,0,1,2,3,99,99.5,\"fox\",\"zoo\"]");
list2 = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, "[false,2,99,99.2,\"Fox\",\"zoo\"]");
json = TRI_IntersectListsJson(list1, list2, true);
STRINGIFY
BOOST_CHECK_EQUAL("[false,2,99,\"zoo\"]", STRING_VALUE);
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, list1);
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, list2);
FREE_JSON
FREE_BUFFER
}
////////////////////////////////////////////////////////////////////////////////
/// @brief generate tests
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_SUITE_END ()
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

View File

@ -0,0 +1,297 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief test suite for string utility functions
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Jan Steemann
/// @author Copyright 2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#include <boost/test/unit_test.hpp>
#include "BasicsC/strings.h"
// -----------------------------------------------------------------------------
// --SECTION-- private macros
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// --SECTION-- private constants
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// --SECTION-- setup / tear-down
// -----------------------------------------------------------------------------
struct CStringSetup {
CStringSetup () {
BOOST_TEST_MESSAGE("setup string test");
}
~CStringSetup () {
BOOST_TEST_MESSAGE("tear-down string test");
}
};
// -----------------------------------------------------------------------------
// --SECTION-- test suite
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @brief setup
////////////////////////////////////////////////////////////////////////////////
BOOST_FIXTURE_TEST_SUITE(CStringTest, CStringSetup)
////////////////////////////////////////////////////////////////////////////////
/// @brief test lower casing (no changes)
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_lower_ascii_no_change) {
char* result;
result = TRI_LowerAsciiString("this is supposed to stay the same");
BOOST_CHECK_EQUAL("this is supposed to stay the same", result);
TRI_FreeString(TRI_CORE_MEM_ZONE, result);
result = TRI_LowerAsciiString("this is also supposed to stay the same");
BOOST_CHECK_EQUAL("this is also supposed to stay the same", result);
TRI_FreeString(TRI_CORE_MEM_ZONE, result);
// punctuation should not change
result = TRI_LowerAsciiString("01234567890,.;:-_#'+*~!\"§$%&/()[]{}=?\\|<>");
BOOST_CHECK_EQUAL("01234567890,.;:-_#'+*~!\"§$%&/()[]{}=?\\|<>", result);
TRI_FreeString(TRI_CORE_MEM_ZONE, result);
// whitespace should not change
result = TRI_LowerAsciiString(" \t \n \r \n");
BOOST_CHECK_EQUAL(" \t \n \r \n", result);
TRI_FreeString(TRI_CORE_MEM_ZONE, result);
// test an empty string
result = TRI_LowerAsciiString("");
BOOST_CHECK_EQUAL("", result);
TRI_FreeString(TRI_CORE_MEM_ZONE, result);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test lower casing
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_lower_ascii) {
char* result;
result = TRI_LowerAsciiString("This MUST be converted into LOWER CASE!");
BOOST_CHECK_EQUAL("this must be converted into lower case!", result);
TRI_FreeString(TRI_CORE_MEM_ZONE, result);
result = TRI_LowerAsciiString("SCREAMING OUT LOUD");
BOOST_CHECK_EQUAL("screaming out loud", result);
TRI_FreeString(TRI_CORE_MEM_ZONE, result);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test lower casing with non-ASCII
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_lower_ascii_non_ascii) {
char* result;
result = TRI_LowerAsciiString("äöüÄÖÜß");
BOOST_CHECK_EQUAL("äöüÄÖÜß", result);
TRI_FreeString(TRI_CORE_MEM_ZONE, result);
result = TRI_LowerAsciiString("코리아닷컴");
BOOST_CHECK_EQUAL("코리아닷컴", result);
TRI_FreeString(TRI_CORE_MEM_ZONE, result);
result = TRI_LowerAsciiString("своих партнеров");
BOOST_CHECK_EQUAL("своих партнеров", result);
TRI_FreeString(TRI_CORE_MEM_ZONE, result);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test upper casing (no changes)
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_upper_ascii_no_change) {
char* result;
result = TRI_UpperAsciiString("THIS IS SUPPOSED TO STAY THE SAME");
BOOST_CHECK_EQUAL("THIS IS SUPPOSED TO STAY THE SAME", result);
TRI_FreeString(TRI_CORE_MEM_ZONE, result);
result = TRI_UpperAsciiString("THIS IS ALSO SUPPOSED TO STAY THE SAME");
BOOST_CHECK_EQUAL("THIS IS ALSO SUPPOSED TO STAY THE SAME", result);
TRI_FreeString(TRI_CORE_MEM_ZONE, result);
// punctuation should not change
result = TRI_UpperAsciiString("01234567890,.;:-_#'+*~!\"§$%&/()[]{}=?\\|<>");
BOOST_CHECK_EQUAL("01234567890,.;:-_#'+*~!\"§$%&/()[]{}=?\\|<>", result);
TRI_FreeString(TRI_CORE_MEM_ZONE, result);
// whitespace should not change
result = TRI_UpperAsciiString(" \t \n \r \n");
BOOST_CHECK_EQUAL(" \t \n \r \n", result);
TRI_FreeString(TRI_CORE_MEM_ZONE, result);
// test an empty string
result = TRI_UpperAsciiString("");
BOOST_CHECK_EQUAL("", result);
TRI_FreeString(TRI_CORE_MEM_ZONE, result);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test upper casing
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_upper_ascii) {
char* result;
result = TRI_UpperAsciiString("This must be converted into upper CASE!");
BOOST_CHECK_EQUAL("THIS MUST BE CONVERTED INTO UPPER CASE!", result);
TRI_FreeString(TRI_CORE_MEM_ZONE, result);
result = TRI_UpperAsciiString("silently whispering");
BOOST_CHECK_EQUAL("SILENTLY WHISPERING", result);
TRI_FreeString(TRI_CORE_MEM_ZONE, result);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test upper casing with non-ASCII
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_upper_ascii_non_ascii) {
char* result;
result = TRI_UpperAsciiString("äöüÄÖÜß");
BOOST_CHECK_EQUAL("äöüÄÖÜß", result);
TRI_FreeString(TRI_CORE_MEM_ZONE, result);
result = TRI_UpperAsciiString("코리아닷컴");
BOOST_CHECK_EQUAL("코리아닷컴", result);
TRI_FreeString(TRI_CORE_MEM_ZONE, result);
result = TRI_UpperAsciiString("своих партнеров");
BOOST_CHECK_EQUAL("своих партнеров", result);
TRI_FreeString(TRI_CORE_MEM_ZONE, result);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test equal string
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_equal_string) {
BOOST_CHECK_EQUAL(true, TRI_EqualString("", ""));
BOOST_CHECK_EQUAL(true, TRI_EqualString(" ", " "));
BOOST_CHECK_EQUAL(true, TRI_EqualString("a", "a"));
BOOST_CHECK_EQUAL(true, TRI_EqualString("the quick brown fox", "the quick brown fox"));
BOOST_CHECK_EQUAL(true, TRI_EqualString("The Quick Brown FOX", "The Quick Brown FOX"));
BOOST_CHECK_EQUAL(true, TRI_EqualString("\"\t\r\n ", "\"\t\r\n "));
BOOST_CHECK_EQUAL(false, TRI_EqualString("", " "));
BOOST_CHECK_EQUAL(false, TRI_EqualString(" ", ""));
BOOST_CHECK_EQUAL(false, TRI_EqualString("a", ""));
BOOST_CHECK_EQUAL(false, TRI_EqualString("a", "a "));
BOOST_CHECK_EQUAL(false, TRI_EqualString(" a", "a"));
BOOST_CHECK_EQUAL(false, TRI_EqualString("A", "a"));
BOOST_CHECK_EQUAL(false, TRI_EqualString("a", "A"));
BOOST_CHECK_EQUAL(false, TRI_EqualString("", "0"));
BOOST_CHECK_EQUAL(false, TRI_EqualString("0", ""));
BOOST_CHECK_EQUAL(false, TRI_EqualString(" ", "0"));
BOOST_CHECK_EQUAL(false, TRI_EqualString("0", " "));
BOOST_CHECK_EQUAL(false, TRI_EqualString("case matters", "Case matters"));
BOOST_CHECK_EQUAL(false, TRI_EqualString("CASE matters", "CASE matterS"));
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test case equal string
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_case_equal_string) {
BOOST_CHECK_EQUAL(true, TRI_CaseEqualString("", ""));
BOOST_CHECK_EQUAL(true, TRI_CaseEqualString(" ", " "));
BOOST_CHECK_EQUAL(true, TRI_CaseEqualString("a", "a"));
BOOST_CHECK_EQUAL(true, TRI_CaseEqualString("the quick brown fox", "the quick brown fox"));
BOOST_CHECK_EQUAL(true, TRI_CaseEqualString("The Quick Brown FOX", "The Quick Brown FOX"));
BOOST_CHECK_EQUAL(true, TRI_CaseEqualString("\"\t\r\n ", "\"\t\r\n "));
BOOST_CHECK_EQUAL(true, TRI_CaseEqualString("A", "a"));
BOOST_CHECK_EQUAL(true, TRI_CaseEqualString("a", "A"));
BOOST_CHECK_EQUAL(true, TRI_CaseEqualString("case matters", "Case matters"));
BOOST_CHECK_EQUAL(true, TRI_CaseEqualString("CASE matters", "CASE matterS"));
BOOST_CHECK_EQUAL(false, TRI_CaseEqualString("", " "));
BOOST_CHECK_EQUAL(false, TRI_CaseEqualString(" ", ""));
BOOST_CHECK_EQUAL(false, TRI_CaseEqualString("a", ""));
BOOST_CHECK_EQUAL(false, TRI_CaseEqualString("a", "a "));
BOOST_CHECK_EQUAL(false, TRI_CaseEqualString(" a", "a"));
BOOST_CHECK_EQUAL(false, TRI_CaseEqualString("", "0"));
BOOST_CHECK_EQUAL(false, TRI_CaseEqualString("0", ""));
BOOST_CHECK_EQUAL(false, TRI_CaseEqualString(" ", "0"));
BOOST_CHECK_EQUAL(false, TRI_CaseEqualString("0", " "));
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test prefix string
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_prefix_string) {
BOOST_CHECK_EQUAL(true, TRI_IsPrefixString("the quick brown fox", "the"));
BOOST_CHECK_EQUAL(true, TRI_IsPrefixString("the quick brown fox", "th"));
BOOST_CHECK_EQUAL(true, TRI_IsPrefixString("the quick brown fox", "t"));
BOOST_CHECK_EQUAL(true, TRI_IsPrefixString("the quick brown fox", "the q"));
BOOST_CHECK_EQUAL(true, TRI_IsPrefixString(" the quick brown fox", " "));
BOOST_CHECK_EQUAL(true, TRI_IsPrefixString("the fox", "the fox"));
BOOST_CHECK_EQUAL(true, TRI_IsPrefixString("\t\r\n0", "\t"));
BOOST_CHECK_EQUAL(true, TRI_IsPrefixString("\t\r\n0", "\t\r"));
BOOST_CHECK_EQUAL(true, TRI_IsPrefixString("the fox", ""));
BOOST_CHECK_EQUAL(false, TRI_IsPrefixString("the quick brown fox", "The"));
BOOST_CHECK_EQUAL(false, TRI_IsPrefixString("the quick brown fox", " the"));
BOOST_CHECK_EQUAL(false, TRI_IsPrefixString("the quick brown fox", "the quick"));
BOOST_CHECK_EQUAL(false, TRI_IsPrefixString("the quick brown fox", "the q "));
BOOST_CHECK_EQUAL(false, TRI_IsPrefixString("the quick brown fox", "foo"));
BOOST_CHECK_EQUAL(false, TRI_IsPrefixString("the quick brown fox", "a"));
BOOST_CHECK_EQUAL(false, TRI_IsPrefixString("the quick brown fox", "quick"));
BOOST_CHECK_EQUAL(false, TRI_IsPrefixString("the quick brown fox", "he quick"));
BOOST_CHECK_EQUAL(false, TRI_IsPrefixString("the quick brown fox", "fox"));
BOOST_CHECK_EQUAL(false, TRI_IsPrefixString("the quick brown fox", "T"));
BOOST_CHECK_EQUAL(false, TRI_IsPrefixString("The quick brown fox", "the"));
BOOST_CHECK_EQUAL(false, TRI_IsPrefixString("THE QUICK BROWN FOX", "The"));
BOOST_CHECK_EQUAL(false, TRI_IsPrefixString("THE QUICK BROWN FOX", "the"));
BOOST_CHECK_EQUAL(false, TRI_IsPrefixString("THE QUICK BROWN FOX", "THE quick"));
BOOST_CHECK_EQUAL(false, TRI_IsPrefixString(" the quick brown fox", "the"));
BOOST_CHECK_EQUAL(false, TRI_IsPrefixString("the fox", " "));
BOOST_CHECK_EQUAL(false, TRI_IsPrefixString("\r\n0", "\n"));
BOOST_CHECK_EQUAL(false, TRI_IsPrefixString("\r\n0", " "));
BOOST_CHECK_EQUAL(false, TRI_IsPrefixString("", "the"));
}
////////////////////////////////////////////////////////////////////////////////
/// @brief generate tests
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_SUITE_END ()
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

View File

@ -53,7 +53,7 @@ struct CStringUtf8Setup {
}
~CStringUtf8Setup () {
BOOST_TEST_MESSAGE("tear-downstring UTF8 test");
BOOST_TEST_MESSAGE("tear-down string UTF8 test");
}
};

View File

@ -6366,7 +6366,6 @@ void TRI_InitV8VocBridge (v8::Handle<v8::Context> context, TRI_vocbase_t* vocbas
v8::Handle<v8::String> SaveFuncName = v8::Persistent<v8::String>::New(v8::String::New("save"));
v8::Handle<v8::String> StatusFuncName = v8::Persistent<v8::String>::New(v8::String::New("status"));
v8::Handle<v8::String> UnloadFuncName = v8::Persistent<v8::String>::New(v8::String::New("unload"));
v8::Handle<v8::String> UseNextFuncName = v8::Persistent<v8::String>::New(v8::String::New("useNext"));
v8::Handle<v8::String> _CollectionFuncName = v8::Persistent<v8::String>::New(v8::String::New("_collection"));
v8::Handle<v8::String> _CollectionsFuncName = v8::Persistent<v8::String>::New(v8::String::New("_collections"));

View File

@ -38,6 +38,13 @@ html.busy, html.busy * {
padding: 0;
}
.snippet-no-num {
font-size: 1em;
font-weight: normal;
font-;
font-family: Verdana, Arial, sans-serif;
}
html {
font-family: Verdana,Arial,sans-serif;
font-size: 1em;
@ -62,11 +69,6 @@ td {
font-size: 1.2em ;
}
.nofunction {
padding-left: 4px;
padding-right: 1px;
}
pre ul li span{
font-family:"Lucida Sans Unicode", "Lucida Grande", sans-serif;
font-size: 1em;
@ -84,7 +86,26 @@ pre ul li span{
#logToolbar a, #documentsToolbar a {
font-size: 0.85em;
}
#logToolbar, #documentsToolbar{
.toolbar_primary {
background-color: #e4e9d2;
}
.toolbar_secondary {
background-color: white;
}
.toolbar_left {
float:left;
width:30%;
}
.toolbar_right {
float:right;
width:70%;
}
#logToolbar, #documentsToolbar, .customToolbar{
height:24px;
border: 1px solid #AAAAAA;
padding-left: 3px;

View File

@ -43,7 +43,6 @@
<div id="menue-right">
<button class="minimal" id="Collections">Collections</button>
<button class="minimal" id="Status">Status</button>
<button class="minimal" id="Logs">Logs</button>
<button class="minimal" id="Configuration">Configuration</button>
<button class="minimal" id="Query">Query</button>
@ -61,11 +60,11 @@
<div id="centerView" class="ui-layout-center" class="ui-layout-content">
<div id="collectionsView">
<button class="toolbar" id="createCollection">
<button class="toolbar enabled" id="createCollection">
<img src="/_admin/html/media/icons/round_plus_icon16.png" width="16" height="16">
<a>New Collection</a>
</button>
<button class="toolbar" id="refreshCollections">
<button class="toolbar enabled" id="refreshCollections">
<img src="/_admin/html/media/icons/refresh_icon16.png" width="16" height="16">
<a>Refresh</a>
</button>
@ -86,11 +85,11 @@
<div id="subCenterView">
<div id="createCollectionView" style="display: none">
<button class="minimal" id="saveNewCollection">
<button class="minimal enabled" id="saveNewCollection">
<img src="/_admin/html/media/icons/save_icon16.png" width="16" height="16">
<a>Save Collection</a>
</button>
<button class="minimal" id="cancelNewCollection">
<button class="minimal enabled" id="cancelNewCollection">
<img src="/_admin/html/media/icons/cancel_icon16.png" width="16" height="16">
<a>Cancel</a>
</button>
@ -112,7 +111,7 @@
</div>
<div id="editCollectionView" style="display: none">
<button class="minimal" id="saveEditedCollection">
<button class="minimal enabled" id="saveEditedCollection">
<img src="/_admin/html/media/icons/doc_plus_icon16.png" width="16" height="16">
<a>Save Collection</a>
</button>
@ -134,7 +133,7 @@
</div>
<div id="documentsView" style="display: none">
<button class="minimal" id="addDocumentButton">
<button class="minimal enabled" id="addDocumentButton">
<img src="/_admin/html/media/icons/doc_plus_icon16.png" width="16" height="16">
<a>Add Document</a>
</button>
@ -150,25 +149,25 @@
</table>
<div id="documentsToolbar">
<button id="documents_last"><img src="/_admin/html/media/icons/rnd_br_first_icon16.png"></button>
<button id="documents_next"><img src="/_admin/html/media/icons/rnd_br_prev_icon16.png"></button>
<button id="documents_prev"><img src="/_admin/html/media/icons/rnd_br_next_icon16.png"></button>
<button id="documents_first"><img src="/_admin/html/media/icons/rnd_br_last_icon16.png"></button>
<button class="enabled" id="documents_last"><img src="/_admin/html/media/icons/rnd_br_first_icon16.png"></button>
<button class="enabled" id="documents_next"><img src="/_admin/html/media/icons/rnd_br_prev_icon16.png"></button>
<button class="enabled" id="documents_prev"><img src="/_admin/html/media/icons/rnd_br_next_icon16.png"></button>
<button class="enabled" id="documents_first"><img src="/_admin/html/media/icons/rnd_br_last_icon16.png"></button>
<a id="documents_status">Showing</a>
</div>
</div>
<div id="documentEditView" style="display: none">
<button class="minimal" id="saveEditedDocButton">
<button class="minimal enabled" id="saveEditedDocButton">
<img src="/_admin/html/media/icons/save_icon16.png" width="16" height="16">
<a>Save Document</a>
</button>
<button class="minimal" id="addEditedDocRowButton">
<button class="minimal enabled" id="addEditedDocRowButton">
<img src="/_admin/html/media/icons/round_plus_icon16.png" width="16" height="16">
<a>Add row</a>
</button>
<button class="minimal" id="toggleEditedDocButton">
<button class="minimal enabled" id="toggleEditedDocButton">
<a>Source</a>
<img src="/_admin/html/media/icons/off_icon16.png" width="16" height="16">
</button>
@ -194,15 +193,15 @@
<div id="newDocumentView" style="display: none">
<div id="newDocumentTableView">
<button class="minimal" id="saveNewDocButton">
<button class="minimal enabled" id="saveNewDocButton">
<img src="/_admin/html/media/icons/save_icon16.png" width="16" height="16">
<a>Save Document</a>
</button>
<button class="minimal" id="addNewDocButton">
<button class="minimal enabled" id="addNewDocButton">
<img src="/_admin/html/media/icons/round_plus_icon16.png" width="16" height="16">
<a>Add row</a>
</button>
<button class="minimal" id="toggleNewDocButton">
<button class="minimal enabled" id="toggleNewDocButton">
<a>Source</a>
<img src="/_admin/html/media/icons/off_icon16.png" width="16" height="16">
</button>
@ -247,10 +246,10 @@
</thead>
</table>
<div id="logToolbar">
<button id="logTableID_first"><img src="/_admin/html/media/icons/rnd_br_first_icon16.png"></button>
<button id="logTableID_prev"><img src="/_admin/html/media/icons/rnd_br_prev_icon16.png"></button>
<button id="logTableID_next"><img src="/_admin/html/media/icons/rnd_br_next_icon16.png"></button>
<button id="logTableID_last"><img src="/_admin/html/media/icons/rnd_br_last_icon16.png"></button>
<button class="enabled" id="logTableID_first"><img src="/_admin/html/media/icons/rnd_br_first_icon16.png"></button>
<button class="enabled" id="logTableID_prev"><img src="/_admin/html/media/icons/rnd_br_prev_icon16.png"></button>
<button class="enabled" id="logTableID_next"><img src="/_admin/html/media/icons/rnd_br_next_icon16.png"></button>
<button class="enabled" id="logTableID_last"><img src="/_admin/html/media/icons/rnd_br_last_icon16.png"></button>
<a id="logTableID_status">Showing</a>
</div>
</div>
@ -265,10 +264,10 @@
</thead>
</table>
<div id="logToolbar">
<button id="critLogTableID_first"><img src="/_admin/html/media/icons/rnd_br_first_icon16.png"></button>
<button id="critLogTableID_prev"><img src="/_admin/html/media/icons/rnd_br_prev_icon16.png"></button>
<button id="critLogTableID_next"><img src="/_admin/html/media/icons/rnd_br_next_icon16.png"></button>
<button id="critLogTableID_last"><img src="/_admin/html/media/icons/rnd_br_last_icon16.png"></button>
<button class="enabled" id="critLogTableID_first"><img src="/_admin/html/media/icons/rnd_br_first_icon16.png"></button>
<button class="enabled" id="critLogTableID_prev"><img src="/_admin/html/media/icons/rnd_br_prev_icon16.png"></button>
<button class="enabled" id="critLogTableID_next"><img src="/_admin/html/media/icons/rnd_br_next_icon16.png"></button>
<button class="enabled" id="critLogTableID_last"><img src="/_admin/html/media/icons/rnd_br_last_icon16.png"></button>
<a id="critLogTableID_status">Showing</a>
</div>
</div>
@ -283,10 +282,10 @@
</thead>
</table>
<div id="logToolbar">
<button id="warnLogTableID_first"><img src="/_admin/html/media/icons/rnd_br_first_icon16.png"></button>
<button id="warnLogTableID_prev"><img src="/_admin/html/media/icons/rnd_br_prev_icon16.png"></button>
<button id="warnLogTableID_next"><img src="/_admin/html/media/icons/rnd_br_next_icon16.png"></button>
<button id="warnLogTableID_last"><img src="/_admin/html/media/icons/rnd_br_last_icon16.png"></button>
<button class="enabled" id="warnLogTableID_first"><img src="/_admin/html/media/icons/rnd_br_first_icon16.png"></button>
<button class="enabled" id="warnLogTableID_prev"><img src="/_admin/html/media/icons/rnd_br_prev_icon16.png"></button>
<button class="enabled" id="warnLogTableID_next"><img src="/_admin/html/media/icons/rnd_br_next_icon16.png"></button>
<button class="enabled" id="warnLogTableID_last"><img src="/_admin/html/media/icons/rnd_br_last_icon16.png"></button>
<a id="warnLogTableID_status">Showing</a>
</div>
</div>
@ -301,10 +300,10 @@
</thead>
</table>
<div id="logToolbar">
<button id="infoLogTableID_first"><img src="/_admin/html/media/icons/rnd_br_first_icon16.png"></button>
<button id="infoLogTableID_prev"><img src="/_admin/html/media/icons/rnd_br_prev_icon16.png"></button>
<button id="infoLogTableID_next"><img src="/_admin/html/media/icons/rnd_br_next_icon16.png"></button>
<button id="infoLogTableID_last"><img src="/_admin/html/media/icons/rnd_br_last_icon16.png"></button>
<button class="enabled" id="infoLogTableID_first"><img src="/_admin/html/media/icons/rnd_br_first_icon16.png"></button>
<button class="enabled" id="infoLogTableID_prev"><img src="/_admin/html/media/icons/rnd_br_prev_icon16.png"></button>
<button class="enabled" id="infoLogTableID_next"><img src="/_admin/html/media/icons/rnd_br_next_icon16.png"></button>
<button class="enabled" id="infoLogTableID_last"><img src="/_admin/html/media/icons/rnd_br_last_icon16.png"></button>
<a id="infoLogTableID_status">Showing</a>
</div>
</div>
@ -319,10 +318,10 @@
</thead>
</table>
<div id="logToolbar">
<button id="debugLogTableID_first"><img src="/_admin/html/media/icons/rnd_br_first_icon16.png"></button>
<button id="debugLogTableID_prev"><img src="/_admin/html/media/icons/rnd_br_prev_icon16.png"></button>
<button id="debugLogTableID_next"><img src="/_admin/html/media/icons/rnd_br_next_icon16.png"></button>
<button id="debugLogTableID_last"><img src="/_admin/html/media/icons/rnd_br_last_icon16.png"></button>
<button class="enabled" id="debugLogTableID_first"><img src="/_admin/html/media/icons/rnd_br_first_icon16.png"></button>
<button class="enabled" id="debugLogTableID_prev"><img src="/_admin/html/media/icons/rnd_br_prev_icon16.png"></button>
<button class="enabled" id="debugLogTableID_next"><img src="/_admin/html/media/icons/rnd_br_next_icon16.png"></button>
<button class="enabled" id="debugLogTableID_last"><img src="/_admin/html/media/icons/rnd_br_last_icon16.png"></button>
<a id="debugLogTableID_status">Showing</a>
</div>
</div>
@ -335,6 +334,8 @@
</div>
<div id="configView" style="display: none">
<div id="configContent">
</div>
</div>
<div id="avocshView" style="display: none">
@ -365,11 +366,11 @@
<div id="footerLeft">
<a>Welcome </a><a id="activeUser" class="loggedout">Guest!</a>
<button class="minimal" id="movetologinButton">Login</button><button class="minimal" id="logoutButton">Logout</button>
<button class="minimal enabled" id="movetologinButton">Login</button><button class="minimal" id="logoutButton">Logout</button>
<form class="login-form" id="loginWindow" action="#">
<input type="text" name="username" id="usernameField" placeholder="username">
<input type="password" name="password" id="passwordField" placeholder="password">
<button class="minimal" value="log in" id="loginButton">Login</button>
<button class="minimal enabled" value="log in" id="loginButton">Login</button>
</form>
</div>

View File

@ -11,13 +11,13 @@ var globalCollectionName;
var globalCollectionID;
var globalCollectionRev;
var open = false;
$(document).ready(function() {
showCursor();
///////////////////////////////////////////////////////////////////////////////
/// global variables
///////////////////////////////////////////////////////////////////////////////
var open = false;
var tableView = true;
var sid = ($.cookie("sid"));
var currentUser;
@ -95,6 +95,10 @@ $("#tabs").tabs({
}
});
///////////////////////////////////////////////////////////////////////////////
/// disable grey'd out buttons
///////////////////////////////////////////////////////////////////////////////
$(".nofunction").attr("disabled", "true");
///////////////////////////////////////////////////////////////////////////////
/// checks for a login user cookie, creates new sessions if null
@ -412,10 +416,11 @@ var logTable = $('#logTableID').dataTable({
documentEditTable.fnAddData(["", key, value2html(val), JSON.stringify(val)]);
}
else if (key != '_rev' && key != '_id') {
documentEditTable.fnAddData(['<button id="deleteEditedDocButton"><img src="/_admin/html/media/icons/delete_icon16.png" width="16" height="16"></button>',key, value2html(val), JSON.stringify(val)]);
documentEditTable.fnAddData(['<button class="enabled" id="deleteEditedDocButton"><img src="/_admin/html/media/icons/delete_icon16.png" width="16" height="16"></button>',key, value2html(val), JSON.stringify(val)]);
}
});
documentTableMakeEditable('#documentEditTableID');
showCursor();
},
error: function(data) {
}
@ -458,9 +463,10 @@ var logTable = $('#logTableID').dataTable({
contentType: "application/json",
success: function(data) {
$.each(data.result, function(k, v) {
documentsTable.fnAddData(['<button id="deleteDoc"><img src="/_admin/html/media/icons/doc_delete_icon16.png" width="16" height="16"></button><button id="editDoc"><img src="/_admin/html/media/icons/doc_edit_icon16.png" width="16" height="16"></button>', v._id, v._rev, '<pre class=prettify>' + cutByResolution(JSON.stringify(v)) + '</pre>']);
documentsTable.fnAddData(['<button class="enabled" id="deleteDoc"><img src="/_admin/html/media/icons/doc_delete_icon16.png" width="16" height="16"></button><button class="enabled" id="editDoc"><img src="/_admin/html/media/icons/doc_edit_icon16.png" width="16" height="16"></button>', v._id, v._rev, '<pre class=prettify>' + cutByResolution(JSON.stringify(v)) + '</pre>']);
});
$(".prettify").snippet("javascript", {style: "nedit", menu: false, startText: false, transparent: true, showNum: false});
showCursor();
},
error: function(data) {
@ -548,16 +554,24 @@ var logTable = $('#logTableID').dataTable({
hideAllSubDivs();
$('#collectionsView').hide();
$('#configView').show();
createnav ("Config");
createnav ("Configuration");
var switcher = "primary";
var content={"Menue":{"Haha":"wert1", "ahha":"wert2"}, "Favoriten":{"top10":"content"},"Test":{"testing":"hallo 123 test"}};
$("#configView").empty();
$("#configContent").empty();
$.each(content, function(data) {
$('#configView').append('<h1>' + data + '</h1>');
$('#configContent').append('<div class="customToolbar">' + data + '</div>');
$.each(content[data], function(key, val) {
$('#configView').append('<a>' + key + ":" + val + '</a><br>');
if (switcher == "primary") {
$('#configContent').append('<a class="toolbar_left toolbar_primary">' + key + '</a><a class="toolbar_right toolbar_primary">' + val + '</a><br>');
switcher = "secondary";
}
else if (switcher == "secondary") {
$('#configContent').append('<a class="toolbar_left toolbar_secondary">' + key + '</a><a class="toolbar_right toolbar_secondary">' + val + '</a><br>');
switcher = "primary";
}
});
//$('#configView').append('<a>' + menues + '</a><br>');
//$('#configContent').append('<a>' + menues + '</a><br>');
});
}
@ -690,8 +704,9 @@ var logTable = $('#logTableID').dataTable({
$('#addEditedDocRowButton').live('click', function () {
if (tableView == true) {
documentEditTable.fnAddData(['<button id="deleteEditedDocButton"><img src="/_admin/html/media/icons/delete_icon16.png" width="16" height="16"></button>', "somevalue", value2html("editme"), JSON.stringify("editme")]);
documentEditTable.fnAddData(['<button class="enabled" id="deleteEditedDocButton"><img src="/_admin/html/media/icons/delete_icon16.png" width="16" height="16"></button>', "somevalue", value2html("editme"), JSON.stringify("editme")]);
documentTableMakeEditable('#documentEditTableID');
showCursor();
}
else {
}
@ -763,8 +778,9 @@ var logTable = $('#logTableID').dataTable({
$('#addNewDocButton').live('click', function () {
if (tableView == true) {
newDocumentTable.fnAddData(['<button id="deleteEditedDocButton"><img src="/_admin/html/media/icons/delete_icon16.png" width="16" height="16"></button>', "somevalue", value2html("editme"), JSON.stringify("editme")]);
newDocumentTable.fnAddData(['<button class="enabled" id="deleteEditedDocButton"><img src="/_admin/html/media/icons/delete_icon16.png" width="16" height="16"></button>', "somevalue", value2html("editme"), JSON.stringify("editme")]);
documentTableMakeEditable('#NewDocumentTableID');
showCursor();
}
else {
}
@ -805,7 +821,7 @@ var logTable = $('#logTableID').dataTable({
documentEditTable.fnClearTable();
$.each(parsedContent, function(key, val) {
documentEditTable.fnAddData(['<button id="deleteEditedDocButton"><img src="/_admin/html/media/icons/delete_icon16.png" width="16" height="16"</button>',key, value2html(val), JSON.stringify(val)]);
documentEditTable.fnAddData(['<button class="enabled" id="deleteEditedDocButton"><img src="/_admin/html/media/icons/delete_icon16.png" width="16" height="16"</button>',key, value2html(val), JSON.stringify(val)]);
});
documentEditTable.fnAddData(['', "_id", globalCollectionID, JSON.stringify(globalCollectionID)]);
documentEditTable.fnAddData(['', "_rev", globalCollectionRev, JSON.stringify(globalCollectionRev)]);
@ -1357,7 +1373,7 @@ function drawCollectionsTable () {
}
else if (tempStatus == 2) {
tempStatus = "unloaded";
items.push(['<button id="delete"><img src="/_admin/html/media/icons/round_minus_icon16.png" width="16" height="16"></button><button id="load"><img src="/_admin/html/media/icons/connect_icon16.png" width="16" height="16"></button><img src="/_admin/html/media/icons/zoom_icon16_nofunction.png" width="16" height="16" class="nofunction"></img><img src="/_admin/html/media/icons/doc_edit_icon16_nofunction.png" width="16" height="16" class="nofunction"></img>',
items.push(['<button class="enabled" id="delete"><img src="/_admin/html/media/icons/round_minus_icon16.png" width="16" height="16"></button><button class="enabled" id="load"><img src="/_admin/html/media/icons/connect_icon16.png" width="16" height="16"></button><button><img src="/_admin/html/media/icons/zoom_icon16_nofunction.png" width="16" height="16" class="nofunction"></img></button><button><img src="/_admin/html/media/icons/doc_edit_icon16_nofunction.png" width="16" height="16" class="nofunction"></img></button>',
val.id, val.name, tempStatus, "", ""]);
}
else if (tempStatus == 3) {
@ -1379,7 +1395,7 @@ function drawCollectionsTable () {
}
});
items.push(['<button id="delete"><img src="/_admin/html/media/icons/round_minus_icon16.png" width="16" height="16" title="Delete"></button><button id="unload"><img src="/_admin/html/media/icons/not_connected_icon16.png" width="16" height="16" title="Unload"></button><button id="showdocs"><img src="/_admin/html/media/icons/zoom_icon16.png" width="16" height="16" title="Show Documents"></button><button id="edit" title="Edit"><img src="/_admin/html/media/icons/doc_edit_icon16.png" width="16" height="16"></button>',
items.push(['<button clas="enabled" id="delete"><img src="/_admin/html/media/icons/round_minus_icon16.png" width="16" height="16" title="Delete"></button><button class="enabled" id="unload"><img src="/_admin/html/media/icons/not_connected_icon16.png" width="16" height="16" title="Unload"></button><button class="enabled" id="showdocs"><img src="/_admin/html/media/icons/zoom_icon16.png" width="16" height="16" title="Show Documents"></button><button class="enabled" id="edit" title="Edit"><img src="/_admin/html/media/icons/doc_edit_icon16.png" width="16" height="16"></button>',
val.id, val.name, tempStatus, bytesToSize(size*1024), alive]);
}
else if (tempStatus == 4) {
@ -1654,7 +1670,7 @@ function createPrevDocPagination() {
contentType: "application/json",
success: function(data) {
$.each(data.result, function(k, v) {
$('#documentsTableID').dataTable().fnAddData(['<button id="deleteDoc"><img src="/_admin/html/media/icons/doc_delete_icon16.png" width="16" height="16"></button><button id="editDoc"><img src="/_admin/html/media/icons/doc_edit_icon16.png" width="16" height="16"></button>', v._id, v._rev, '<pre class=prettify>' + cutByResolution(JSON.stringify(v)) + '</pre>']);
$('#documentsTableID').dataTable().fnAddData(['<button class="enabled" id="deleteDoc"><img src="/_admin/html/media/icons/doc_delete_icon16.png" width="16" height="16"></button><button class="enabled" id="editDoc"><img src="/_admin/html/media/icons/doc_edit_icon16.png" width="16" height="16"></button>', v._id, v._rev, '<pre class=prettify>' + cutByResolution(JSON.stringify(v)) + '</pre>']);
});
$(".prettify").snippet("javascript", {style: "nedit", menu: false, startText: false, transparent: true, showNum: false});
},
@ -1681,7 +1697,7 @@ function createNextDocPagination () {
contentType: "application/json",
success: function(data) {
$.each(data.result, function(k, v) {
$("#documentsTableID").dataTable().fnAddData(['<button id="deleteDoc"><img src="/_admin/html/media/icons/doc_delete_icon16.png" width="16" height="16"></button><button id="editDoc"><img src="/_admin/html/media/icons/doc_edit_icon16.png" width="16" height="16"></button>', v._id, v._rev, '<pre class=prettify>' + cutByResolution(JSON.stringify(v)) + '</pre>']);
$("#documentsTableID").dataTable().fnAddData(['<button class="enabled" id="deleteDoc"><img src="/_admin/html/media/icons/doc_delete_icon16.png" width="16" height="16"></button><button class="enabled" id="editDoc"><img src="/_admin/html/media/icons/doc_edit_icon16.png" width="16" height="16"></button>', v._id, v._rev, '<pre class=prettify>' + cutByResolution(JSON.stringify(v)) + '</pre>']);
});
$(".prettify").snippet("javascript", {style: "nedit", menu: false, startText: false, transparent: true, showNum: false});
},
@ -1745,7 +1761,7 @@ function createNextPagination(checked) {
}
function showCursor() {
$(':button').mouseover(function () {
$('.enabled').mouseover(function () {
$(this).css('cursor', 'pointer');
});
}
@ -1790,7 +1806,7 @@ function createFirstPagination () {
contentType: "application/json",
success: function(data) {
$.each(data.result, function(k, v) {
$('#documentsTableID').dataTable().fnAddData(['<button id="deleteDoc"><img src="/_admin/html/media/icons/doc_delete_icon16.png" width="16" height="16"></button><button id="editDoc"><img src="/_admin/html/media/icons/doc_edit_icon16.png" width="16" height="16"></button>', v._id, v._rev, '<pre class=prettify>' + cutByResolution(JSON.stringify(v)) + '</pre>' ]);
$('#documentsTableID').dataTable().fnAddData(['<button class="enabled" id="deleteDoc"><img src="/_admin/html/media/icons/doc_delete_icon16.png" width="16" height="16"></button><button class="enabled" id="editDoc"><img src="/_admin/html/media/icons/doc_edit_icon16.png" width="16" height="16"></button>', v._id, v._rev, '<pre class=prettify>' + cutByResolution(JSON.stringify(v)) + '</pre>' ]);
});
$(".prettify").snippet("javascript", {style: "nedit", menu: false, startText: false, transparent: true, showNum: false});
collectionCurrentPage = 1;
@ -1843,7 +1859,7 @@ function createLastPagination () {
contentType: "application/json",
success: function(data) {
$.each(data.result, function(k, v) {
$('#documentsTableID').dataTable().fnAddData(['<button id="deleteDoc"><img src="/_admin/html/media/icons/doc_delete_icon16.png" width="16" height="16"></button><button id="editDoc"><img src="/_admin/html/media/icons/doc_edit_icon16.png" width="16" height="16"></button>', v._id, v._rev, '<pre class=prettify>' + cutByResolution(JSON.stringify(v)) + '</pre>' ]);
$('#documentsTableID').dataTable().fnAddData(['<button class="enabled" id="deleteDoc"><img src="/_admin/html/media/icons/doc_delete_icon16.png" width="16" height="16"></button><button class="enabled" id="editDoc"><img src="/_admin/html/media/icons/doc_edit_icon16.png" width="16" height="16"></button>', v._id, v._rev, '<pre class=prettify>' + cutByResolution(JSON.stringify(v)) + '</pre>' ]);
});
$(".prettify").snippet("javascript", {style: "nedit", menu: false, startText: false, transparent: true, showNum: false});
collectionCurrentPage = totalCollectionCount;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB