1
0
Fork 0

some json / shaped-json and string handling improvements

This commit is contained in:
Jan Steemann 2013-05-13 09:01:07 +02:00
parent 8d329e3ab0
commit c7d2f8f8cd
8 changed files with 255 additions and 113 deletions

View File

@ -34,10 +34,10 @@
// -----------------------------------------------------------------------------
#define TEST_STRING(str) \
TRI_EscapeUtf8String(str, strlen(str), true, &outLength);
TRI_EscapeUtf8String(str, strlen(str), true, &outLength, true);
#define TEST_STRING_L(str, len) \
TRI_EscapeUtf8String(str, len, true, &outLength);
TRI_EscapeUtf8String(str, len, true, &outLength, true);
// -----------------------------------------------------------------------------
// --SECTION-- private constants

View File

@ -161,6 +161,16 @@ static inline bool OutputString (TRI_string_buffer_t* const buffer,
return (TRI_AppendStringStringBuffer(buffer, value) == TRI_ERROR_NO_ERROR);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief append a string to the buffer
////////////////////////////////////////////////////////////////////////////////
static inline bool OutputString2 (TRI_string_buffer_t* const buffer,
const char* const value,
size_t length) {
return (TRI_AppendString2StringBuffer(buffer, value, length) == TRI_ERROR_NO_ERROR);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief append a single character to the buffer
////////////////////////////////////////////////////////////////////////////////
@ -259,9 +269,10 @@ static inline void ScopeOutputQuoted2 (TRI_aql_codegen_js_t* const generator,
generator->_errorCode = TRI_ERROR_OUT_OF_MEMORY;
}
escaped = TRI_EscapeUtf8StringZ(TRI_UNKNOWN_MEM_ZONE, value, strlen(value), false, &outLength);
if (escaped) {
if (! OutputString(scope->_buffer, escaped)) {
escaped = TRI_EscapeUtf8StringZ(TRI_UNKNOWN_MEM_ZONE, value, strlen(value), false, &outLength, false);
if (escaped != NULL) {
if (! OutputString2(scope->_buffer, escaped, outLength)) {
generator->_errorCode = TRI_ERROR_OUT_OF_MEMORY;
}

View File

@ -119,7 +119,7 @@ static bool AppendListValues (TRI_string_buffer_t* const buffer,
n = node->_members._length;
for (i = 0; i < n; ++i) {
if (i > 0) {
if (TRI_AppendStringStringBuffer(buffer, ", ") != TRI_ERROR_NO_ERROR) {
if (TRI_AppendString2StringBuffer(buffer, ", ", 2) != TRI_ERROR_NO_ERROR) {
return false;
}
}
@ -327,20 +327,30 @@ bool TRI_ValueJavascriptAql (TRI_string_buffer_t* const buffer,
const TRI_aql_value_t* const value,
const TRI_aql_value_type_e type) {
switch (type) {
case TRI_AQL_TYPE_FAIL:
return (TRI_AppendStringStringBuffer(buffer, "fail") == TRI_ERROR_NO_ERROR);
case TRI_AQL_TYPE_FAIL: {
return (TRI_AppendString2StringBuffer(buffer, "fail", 4) == TRI_ERROR_NO_ERROR);
}
case TRI_AQL_TYPE_NULL:
return (TRI_AppendStringStringBuffer(buffer, "null") == TRI_ERROR_NO_ERROR);
case TRI_AQL_TYPE_NULL: {
return (TRI_AppendString2StringBuffer(buffer, "null", 4) == TRI_ERROR_NO_ERROR);
}
case TRI_AQL_TYPE_BOOL:
return (TRI_AppendStringStringBuffer(buffer, value->_value._bool ? "true" : "false") == TRI_ERROR_NO_ERROR);
case TRI_AQL_TYPE_BOOL: {
if (value->_value._bool) {
return (TRI_AppendString2StringBuffer(buffer, "true", 4) == TRI_ERROR_NO_ERROR);
}
else {
return (TRI_AppendString2StringBuffer(buffer, "false", 5) == TRI_ERROR_NO_ERROR);
}
}
case TRI_AQL_TYPE_INT:
case TRI_AQL_TYPE_INT: {
return (TRI_AppendInt64StringBuffer(buffer, value->_value._int) == TRI_ERROR_NO_ERROR);
}
case TRI_AQL_TYPE_DOUBLE:
case TRI_AQL_TYPE_DOUBLE: {
return (TRI_AppendDoubleStringBuffer(buffer, value->_value._double) == TRI_ERROR_NO_ERROR);
}
case TRI_AQL_TYPE_STRING: {
char* escapedString;
@ -354,12 +364,13 @@ bool TRI_ValueJavascriptAql (TRI_string_buffer_t* const buffer,
value->_value._string,
strlen(value->_value._string),
false,
&outLength);
&outLength,
false);
if (escapedString == NULL) {
return false;
}
if (TRI_AppendStringStringBuffer(buffer, escapedString) != TRI_ERROR_NO_ERROR) {
if (TRI_AppendString2StringBuffer(buffer, escapedString, outLength) != TRI_ERROR_NO_ERROR) {
TRI_Free(TRI_UNKNOWN_MEM_ZONE, escapedString);
return false;
@ -426,20 +437,30 @@ bool TRI_ValueStringAql (TRI_string_buffer_t* const buffer,
const TRI_aql_value_t* const value,
const TRI_aql_value_type_e type) {
switch (type) {
case TRI_AQL_TYPE_FAIL:
return (TRI_AppendStringStringBuffer(buffer, "fail") == TRI_ERROR_NO_ERROR);
case TRI_AQL_TYPE_FAIL: {
return (TRI_AppendString2StringBuffer(buffer, "fail", 4) == TRI_ERROR_NO_ERROR);
}
case TRI_AQL_TYPE_NULL:
return (TRI_AppendStringStringBuffer(buffer, "null") == TRI_ERROR_NO_ERROR);
case TRI_AQL_TYPE_NULL: {
return (TRI_AppendString2StringBuffer(buffer, "null", 4) == TRI_ERROR_NO_ERROR);
}
case TRI_AQL_TYPE_BOOL:
return (TRI_AppendStringStringBuffer(buffer, value->_value._bool ? "true" : "false") == TRI_ERROR_NO_ERROR);
case TRI_AQL_TYPE_BOOL: {
if (value->_value._bool) {
return (TRI_AppendString2StringBuffer(buffer, "true", 4) == TRI_ERROR_NO_ERROR);
}
else {
return (TRI_AppendString2StringBuffer(buffer, "false", 5) == TRI_ERROR_NO_ERROR);
}
}
case TRI_AQL_TYPE_INT:
case TRI_AQL_TYPE_INT: {
return (TRI_AppendInt64StringBuffer(buffer, value->_value._int) == TRI_ERROR_NO_ERROR);
}
case TRI_AQL_TYPE_DOUBLE:
case TRI_AQL_TYPE_DOUBLE: {
return (TRI_AppendDoubleStringBuffer(buffer, value->_value._double) == TRI_ERROR_NO_ERROR);
}
case TRI_AQL_TYPE_STRING: {
if (TRI_AppendCharStringBuffer(buffer, '"') != TRI_ERROR_NO_ERROR) {
@ -473,7 +494,7 @@ bool TRI_NodeStringAql (TRI_string_buffer_t* const buffer,
return false;
}
if (TRI_AppendStringStringBuffer(buffer, " : ") != TRI_ERROR_NO_ERROR) {
if (TRI_AppendString2StringBuffer(buffer, " : ", 3) != TRI_ERROR_NO_ERROR) {
return false;
}
@ -481,7 +502,7 @@ bool TRI_NodeStringAql (TRI_string_buffer_t* const buffer,
}
case TRI_AQL_NODE_LIST: {
if (TRI_AppendStringStringBuffer(buffer, "[ ") != TRI_ERROR_NO_ERROR) {
if (TRI_AppendString2StringBuffer(buffer, "[ ", 2) != TRI_ERROR_NO_ERROR) {
return false;
}
@ -489,11 +510,11 @@ bool TRI_NodeStringAql (TRI_string_buffer_t* const buffer,
return false;
}
return (TRI_AppendStringStringBuffer(buffer, " ]") == TRI_ERROR_NO_ERROR);
return (TRI_AppendString2StringBuffer(buffer, " ]", 2) == TRI_ERROR_NO_ERROR);
}
case TRI_AQL_NODE_ARRAY: {
if (TRI_AppendStringStringBuffer(buffer, "{ ") != TRI_ERROR_NO_ERROR) {
if (TRI_AppendString2StringBuffer(buffer, "{ ", 2) != TRI_ERROR_NO_ERROR) {
return false;
}
@ -501,7 +522,7 @@ bool TRI_NodeStringAql (TRI_string_buffer_t* const buffer,
return false;
}
return (TRI_AppendStringStringBuffer(buffer, " }") == TRI_ERROR_NO_ERROR);
return (TRI_AppendString2StringBuffer(buffer, " }", 2) == TRI_ERROR_NO_ERROR);
}
case TRI_AQL_NODE_OPERATOR_UNARY_PLUS:
@ -542,7 +563,7 @@ bool TRI_NodeStringAql (TRI_string_buffer_t* const buffer,
return false;
}
if (TRI_AppendStringStringBuffer(buffer, " ? ") != TRI_ERROR_NO_ERROR) {
if (TRI_AppendString2StringBuffer(buffer, " ? ", 3) != TRI_ERROR_NO_ERROR) {
return false;
}
@ -550,7 +571,7 @@ bool TRI_NodeStringAql (TRI_string_buffer_t* const buffer,
return false;
}
if (TRI_AppendStringStringBuffer(buffer, " : ") != TRI_ERROR_NO_ERROR) {
if (TRI_AppendString2StringBuffer(buffer, " : ", 3) != TRI_ERROR_NO_ERROR) {
return false;
}
@ -562,7 +583,7 @@ bool TRI_NodeStringAql (TRI_string_buffer_t* const buffer,
return false;
}
if (TRI_AppendStringStringBuffer(buffer, ".") != TRI_ERROR_NO_ERROR) {
if (TRI_AppendCharStringBuffer(buffer, '.') != TRI_ERROR_NO_ERROR) {
return false;
}
@ -574,7 +595,7 @@ bool TRI_NodeStringAql (TRI_string_buffer_t* const buffer,
return false;
}
if (TRI_AppendStringStringBuffer(buffer, "[") != TRI_ERROR_NO_ERROR) {
if (TRI_AppendCharStringBuffer(buffer, '[') != TRI_ERROR_NO_ERROR) {
return false;
}
@ -582,7 +603,7 @@ bool TRI_NodeStringAql (TRI_string_buffer_t* const buffer,
return false;
}
return TRI_AppendStringStringBuffer(buffer, "]") == TRI_ERROR_NO_ERROR;
return TRI_AppendCharStringBuffer(buffer, ']') == TRI_ERROR_NO_ERROR;
}
case TRI_AQL_NODE_FCALL: {
@ -592,7 +613,7 @@ bool TRI_NodeStringAql (TRI_string_buffer_t* const buffer,
return false;
}
if (TRI_AppendStringStringBuffer(buffer, "(") != TRI_ERROR_NO_ERROR) {
if (TRI_AppendCharStringBuffer(buffer, '(') != TRI_ERROR_NO_ERROR) {
return false;
}
@ -600,7 +621,7 @@ bool TRI_NodeStringAql (TRI_string_buffer_t* const buffer,
return false;
}
return TRI_AppendStringStringBuffer(buffer, ")") == TRI_ERROR_NO_ERROR;
return TRI_AppendCharStringBuffer(buffer, ')') == TRI_ERROR_NO_ERROR;
}
case TRI_AQL_NODE_FCALL_USER: {
@ -608,7 +629,7 @@ bool TRI_NodeStringAql (TRI_string_buffer_t* const buffer,
return false;
}
if (TRI_AppendStringStringBuffer(buffer, "(") != TRI_ERROR_NO_ERROR) {
if (TRI_AppendCharStringBuffer(buffer, '(') != TRI_ERROR_NO_ERROR) {
return false;
}
@ -616,7 +637,7 @@ bool TRI_NodeStringAql (TRI_string_buffer_t* const buffer,
return false;
}
return TRI_AppendStringStringBuffer(buffer, ")") == TRI_ERROR_NO_ERROR;
return TRI_AppendCharStringBuffer(buffer, ')') == TRI_ERROR_NO_ERROR;
}
case TRI_AQL_NODE_EXPAND: {
@ -654,7 +675,7 @@ bool TRI_NodeStringAql (TRI_string_buffer_t* const buffer,
return false;
}
if (TRI_AppendStringStringBuffer(buffer, " = ") != TRI_ERROR_NO_ERROR) {
if (TRI_AppendString2StringBuffer(buffer, " = ", 3) != TRI_ERROR_NO_ERROR) {
return false;
}
@ -662,7 +683,7 @@ bool TRI_NodeStringAql (TRI_string_buffer_t* const buffer,
}
default: {
// nadata
// nada
}
}

View File

@ -380,7 +380,7 @@ void RestVocbaseBaseHandler::generateDocument (const TRI_voc_cid_t cid,
_response->headResponse(TRI_LengthStringBuffer(&buffer));
}
TRI_AnnihilateStringBuffer(&buffer);
TRI_DestroyStringBuffer(&buffer);
}
////////////////////////////////////////////////////////////////////////////////

View File

@ -107,7 +107,8 @@ static int StringifyJson (TRI_memory_zone_t* zone,
object->_value._string.data,
object->_value._string.length - 1,
false,
&outLength);
&outLength,
false);
if (ptr == NULL) {
return TRI_ERROR_OUT_OF_MEMORY;
@ -288,7 +289,9 @@ static inline void InitArray (TRI_memory_zone_t* zone,
TRI_InitVector(&result->_value._objects, zone, sizeof(TRI_json_t));
}
else {
TRI_InitVector2(&result->_value._objects, zone, sizeof(TRI_json_t), initialSize);
// need to allocate twice the space because for each array entry,
// we need one object for the attribute key, and one for the attribute value
TRI_InitVector2(&result->_value._objects, zone, 2 * sizeof(TRI_json_t), initialSize);
}
}

View File

@ -1164,8 +1164,12 @@ char* TRI_EscapeControlsCString (char const* in, size_t inLength, size_t* outLen
/// @brief escapes special characters using unicode escapes
////////////////////////////////////////////////////////////////////////////////
char* TRI_EscapeUtf8String (char const* in, size_t inLength, bool escapeSlash, size_t* outLength) {
return TRI_EscapeUtf8StringZ(TRI_CORE_MEM_ZONE, in, inLength, escapeSlash, outLength);
char* TRI_EscapeUtf8String (char const* in,
size_t inLength,
bool escapeSlash,
size_t* outLength,
bool compactResult) {
return TRI_EscapeUtf8StringZ(TRI_CORE_MEM_ZONE, in, inLength, escapeSlash, outLength, compactResult);
}
////////////////////////////////////////////////////////////////////////////////
@ -1176,7 +1180,8 @@ char* TRI_EscapeUtf8StringZ (TRI_memory_zone_t* zone,
char const* in,
size_t inLength,
bool escapeSlash,
size_t* outLength) {
size_t* outLength,
bool compactResult) {
char * buffer;
char * qtr;
char const * ptr;
@ -1316,13 +1321,18 @@ char* TRI_EscapeUtf8StringZ (TRI_memory_zone_t* zone,
*qtr = '\0';
*outLength = (size_t) (qtr - buffer);
if (! compactResult) {
return buffer;
}
qtr = TRI_Allocate(zone, *outLength + 1, false);
if (qtr != NULL) {
memcpy(qtr, buffer, *outLength + 1);
}
TRI_Free(zone, buffer);
}
return qtr;
}

View File

@ -287,13 +287,22 @@ char* TRI_EscapeCString (char const* in, size_t inLength, size_t* outLength);
/// escape the character '/'.
////////////////////////////////////////////////////////////////////////////////
char* TRI_EscapeUtf8String (char const* in, size_t inLength, bool escapeSlash, size_t* outLength);
char* TRI_EscapeUtf8String (char const* in,
size_t inLength,
bool escapeSlash,
size_t* outLength,
bool);
////////////////////////////////////////////////////////////////////////////////
/// @brief escapes special characters using unicode escapes
////////////////////////////////////////////////////////////////////////////////
char* TRI_EscapeUtf8StringZ (TRI_memory_zone_t*, char const* in, size_t inLength, bool escapeSlash, size_t* outLength);
char* TRI_EscapeUtf8StringZ (TRI_memory_zone_t*,
char const* in,
size_t inLength,
bool escapeSlash,
size_t* outLength,
bool);
////////////////////////////////////////////////////////////////////////////////
/// @brief unescapes unicode escape sequences

View File

@ -853,7 +853,9 @@ static bool FillShapeValueArray (TRI_shaper_t* shaper, TRI_shape_value_t* dst, T
n = f + v;
// now sort the shape entries
if (n > 1) {
TRI_SortShapeValues(values, n);
}
#ifdef DEBUG_JSON_SHAPER
printf("shape values\n------------\ntotal: %u, fixed: %u, variable: %u\n",
@ -1106,17 +1108,21 @@ static TRI_json_t* JsonShapeDataArray (TRI_shaper_t* shaper,
TRI_shape_size_t const* offsetsF;
TRI_shape_size_t const* offsetsV;
array = TRI_CreateArrayJson(shaper->_memoryZone);
if (array == NULL) {
return NULL;
}
TRI_shape_sid_t cachedSid;
TRI_shape_t const* cachedShape;
s = (TRI_array_shape_t const*) shape;
f = s->_fixedEntries;
v = s->_variableEntries;
n = f + v;
// create an array with the appropriate size
array = TRI_CreateArray2Json(shaper->_memoryZone, (size_t) n);
if (array == NULL) {
return NULL;
}
qtr = (char const*) shape;
qtr += sizeof(TRI_array_shape_t);
@ -1128,6 +1134,9 @@ static TRI_json_t* JsonShapeDataArray (TRI_shaper_t* shaper,
offsetsF = (TRI_shape_size_t const*) qtr;
cachedSid = 0;
cachedShape = NULL;
for (i = 0; i < f; ++i, ++sids, ++aids, ++offsetsF) {
TRI_shape_sid_t sid = *sids;
TRI_shape_aid_t aid = *aids;
@ -1137,9 +1146,17 @@ static TRI_json_t* JsonShapeDataArray (TRI_shaper_t* shaper,
TRI_json_t* element;
offset = *offsetsF;
subshape = shaper->lookupShapeId(shaper, sid);
name = shaper->lookupAttributeId(shaper, aid);
// use last sid if in cache
if (sid == cachedSid && cachedSid > 0) {
subshape = cachedShape;
}
else {
cachedShape = subshape = shaper->lookupShapeId(shaper, sid);
cachedSid = sid;
}
if (subshape == NULL) {
LOG_WARNING("cannot find shape #%u", (unsigned int) sid);
continue;
@ -1172,9 +1189,17 @@ static TRI_json_t* JsonShapeDataArray (TRI_shaper_t* shaper,
TRI_json_t* element;
offset = *offsetsV;
subshape = shaper->lookupShapeId(shaper, sid);
name = shaper->lookupAttributeId(shaper, aid);
// use last sid if in cache
if (sid == cachedSid && cachedSid > 0) {
subshape = cachedShape;
}
else {
cachedShape = subshape = shaper->lookupShapeId(shaper, sid);
cachedSid = sid;
}
if (subshape == NULL) {
LOG_WARNING("cannot find shape #%u", (unsigned int) sid);
continue;
@ -1220,14 +1245,19 @@ static TRI_json_t* JsonShapeDataList (TRI_shaper_t* shaper,
TRI_shape_length_list_t l;
TRI_shape_length_list_t i;
list = TRI_CreateListJson(shaper->_memoryZone);
TRI_shape_sid_t cachedSid;
TRI_shape_t const* cachedShape;
ptr = data;
l = * (TRI_shape_length_list_t const*) ptr;
// create a list with the appropriate size
list = TRI_CreateList2Json(shaper->_memoryZone, (size_t) l);
if (list == NULL) {
return NULL;
}
ptr = data;
l = * (TRI_shape_length_list_t const*) ptr;
ptr += sizeof(TRI_shape_length_list_t);
sids = (TRI_shape_sid_t const*) ptr;
@ -1235,6 +1265,9 @@ static TRI_json_t* JsonShapeDataList (TRI_shaper_t* shaper,
ptr += l * sizeof(TRI_shape_sid_t);
offsets = (TRI_shape_size_t const*) ptr;
cachedSid = 0;
cachedShape = NULL;
for (i = 0; i < l; ++i, ++sids, ++offsets) {
TRI_shape_sid_t sid = *sids;
TRI_shape_size_t offset;
@ -1242,7 +1275,15 @@ static TRI_json_t* JsonShapeDataList (TRI_shaper_t* shaper,
TRI_json_t* element;
offset = *offsets;
subshape = shaper->lookupShapeId(shaper, sid);
// use last sid if in cache
if (sid == cachedSid && cachedSid > 0) {
subshape = cachedShape;
}
else {
cachedShape = subshape = shaper->lookupShapeId(shaper, sid);
cachedSid = sid;
}
if (subshape == NULL) {
LOG_WARNING("cannot find shape #%u", (unsigned int) sid);
@ -1281,35 +1322,38 @@ static TRI_json_t* JsonShapeDataHomogeneousList (TRI_shaper_t* shaper,
TRI_shape_length_list_t l;
TRI_shape_sid_t sid;
TRI_shape_size_t const* offsets;
TRI_shape_t const* subshape;
char const* ptr;
s = (TRI_homogeneous_list_shape_t const*) shape;
sid = s->_sidEntry;
subshape = shaper->lookupShapeId(shaper, sid);
if (subshape == NULL) {
LOG_WARNING("cannot find shape #%u", (unsigned int) sid);
return NULL;
}
ptr = data;
list = TRI_CreateListJson(shaper->_memoryZone);
l = * (TRI_shape_length_list_t const*) ptr;
// create a list with the appropriate size
list = TRI_CreateList2Json(shaper->_memoryZone, (size_t) l);
if (list == NULL) {
return NULL;
}
l = * (TRI_shape_length_list_t const*) ptr;
ptr += sizeof(TRI_shape_length_list_t);
offsets = (TRI_shape_size_t const*) ptr;
for (i = 0; i < l; ++i, ++offsets) {
TRI_shape_size_t offset;
TRI_shape_t const* subshape;
TRI_json_t* element;
offset = *offsets;
subshape = shaper->lookupShapeId(shaper, sid);
if (subshape == NULL) {
LOG_WARNING("cannot find shape #%u", (unsigned int) sid);
continue;
}
element = JsonShapeData(shaper, subshape, data + offset, offsets[1] - offset);
@ -1344,30 +1388,36 @@ static TRI_json_t* JsonShapeDataHomogeneousSizedList (TRI_shaper_t* shaper,
TRI_shape_sid_t sid;
TRI_shape_size_t length;
TRI_shape_size_t offset;
TRI_shape_t const* subshape;
char const* ptr;
s = (TRI_homogeneous_sized_list_shape_t const*) shape;
sid = s->_sidEntry;
ptr = data;
list = TRI_CreateListJson(shaper->_memoryZone);
length = s->_sizeEntry;
offset = sizeof(TRI_shape_length_list_t);
l = * (TRI_shape_length_list_t const*) ptr;
for (i = 0; i < l; ++i, offset += length) {
TRI_shape_t const* subshape;
TRI_json_t* element;
subshape = shaper->lookupShapeId(shaper, sid);
if (subshape == NULL) {
LOG_WARNING("cannot find shape #%u", (unsigned int) sid);
continue;
return NULL;
}
ptr = data;
l = * (TRI_shape_length_list_t const*) ptr;
// create a list with the appropriate size
list = TRI_CreateList2Json(shaper->_memoryZone, (size_t) l);
if (list == NULL) {
return NULL;
}
length = s->_sizeEntry;
offset = sizeof(TRI_shape_length_list_t);
for (i = 0; i < l; ++i, offset += length) {
TRI_json_t* element;
element = JsonShapeData(shaper, subshape, data + offset, length);
if (element == NULL) {
@ -1491,15 +1541,15 @@ static bool StringifyJsonShapeDataNumber (TRI_shaper_t* shaper,
if (v != v) {
// NaN
res = TRI_AppendStringStringBuffer(buffer, "null");
res = TRI_AppendString2StringBuffer(buffer, "null", 4);
}
else if (v == HUGE_VAL) {
// +inf
res = TRI_AppendStringStringBuffer(buffer, "null");
res = TRI_AppendString2StringBuffer(buffer, "null", 4);
}
else if (v == -HUGE_VAL) {
// -inf
res = TRI_AppendStringStringBuffer(buffer, "null");
res = TRI_AppendString2StringBuffer(buffer, "null", 4);
}
else {
res = TRI_AppendDoubleStringBuffer(buffer, v);
@ -1536,7 +1586,7 @@ static bool StringifyJsonShapeDataShortString (TRI_shaper_t* shaper,
}
if (l > 1) {
unicoded = TRI_EscapeUtf8StringZ(shaper->_memoryZone, data, (size_t) (l - 1), true, &out);
unicoded = TRI_EscapeUtf8StringZ(shaper->_memoryZone, data, (size_t) (l - 1), true, &out, false);
if (unicoded == NULL) {
return false;
@ -1582,7 +1632,7 @@ static bool StringifyJsonShapeDataLongString (TRI_shaper_t* shaper,
return false;
}
unicoded = TRI_EscapeUtf8StringZ(buffer->_memoryZone, data, l - 1, true, &out);
unicoded = TRI_EscapeUtf8StringZ(buffer->_memoryZone, data, l - 1, true, &out, false);
if (unicoded == NULL) {
return false;
@ -1624,6 +1674,8 @@ static bool StringifyJsonShapeDataArray (TRI_shaper_t* shaper,
TRI_shape_size_t i;
TRI_shape_size_t n;
TRI_shape_size_t v;
TRI_shape_sid_t cachedSid;
TRI_shape_t const* cachedShape;
bool first;
char const* qtr;
char* unicoded;
@ -1660,6 +1712,9 @@ static bool StringifyJsonShapeDataArray (TRI_shaper_t* shaper,
offsetsF = (TRI_shape_size_t const*) qtr;
cachedSid = 0;
cachedShape = NULL;
for (i = 0; i < f; ++i, ++sids, ++aids, ++offsetsF) {
TRI_shape_aid_t aid;
TRI_shape_sid_t sid;
@ -1671,7 +1726,16 @@ static bool StringifyJsonShapeDataArray (TRI_shaper_t* shaper,
sid = *sids;
aid = *aids;
offset = *offsetsF;
subshape = shaper->lookupShapeId(shaper, sid);
// use last sid if in cache
if (sid == cachedSid && cachedSid > 0) {
subshape = cachedShape;
}
else {
cachedShape = subshape = shaper->lookupShapeId(shaper, sid);
cachedSid = sid;
}
name = shaper->lookupAttributeId(shaper, aid);
if (subshape == NULL) {
@ -1701,7 +1765,7 @@ static bool StringifyJsonShapeDataArray (TRI_shaper_t* shaper,
return false;
}
unicoded = TRI_EscapeUtf8StringZ(shaper->_memoryZone, name, strlen(name), true, &out);
unicoded = TRI_EscapeUtf8StringZ(shaper->_memoryZone, name, strlen(name), true, &out, false);
if (unicoded == NULL) {
return false;
@ -1747,7 +1811,16 @@ static bool StringifyJsonShapeDataArray (TRI_shaper_t* shaper,
sid = *sids;
aid = *aids;
offset = *offsetsV;
subshape = shaper->lookupShapeId(shaper, sid);
// use last sid if in cache
if (sid == cachedSid && cachedSid > 0) {
subshape = cachedShape;
}
else {
cachedShape = subshape = shaper->lookupShapeId(shaper, sid);
cachedSid = sid;
}
name = shaper->lookupAttributeId(shaper, aid);
if (subshape == NULL) {
@ -1777,7 +1850,7 @@ static bool StringifyJsonShapeDataArray (TRI_shaper_t* shaper,
return false;
}
unicoded = TRI_EscapeUtf8StringZ(shaper->_memoryZone, name, strlen(name), true, &out);
unicoded = TRI_EscapeUtf8StringZ(shaper->_memoryZone, name, strlen(name), true, &out, false);
if (unicoded == NULL) {
return false;
@ -1834,6 +1907,8 @@ static bool StringifyJsonShapeDataList (TRI_shaper_t* shaper,
TRI_shape_length_list_t l;
TRI_shape_sid_t const* sids;
TRI_shape_size_t const* offsets;
TRI_shape_sid_t cachedSid;
TRI_shape_t const* cachedShape;
bool first;
char const* ptr;
int res;
@ -1854,6 +1929,9 @@ static bool StringifyJsonShapeDataList (TRI_shaper_t* shaper,
return false;
}
cachedSid = 0;
cachedShape = NULL;
for (i = 0; i < l; ++i, ++sids, ++offsets) {
TRI_shape_sid_t sid;
TRI_shape_size_t offset;
@ -1862,7 +1940,15 @@ static bool StringifyJsonShapeDataList (TRI_shaper_t* shaper,
sid = *sids;
offset = *offsets;
subshape = shaper->lookupShapeId(shaper, sid);
// use last sid if in cache
if (sid == cachedSid && cachedSid > 0) {
subshape = cachedShape;
}
else {
cachedShape = subshape = shaper->lookupShapeId(shaper, sid);
cachedSid = sid;
}
if (subshape == NULL) {
LOG_WARNING("cannot find shape #%u", (unsigned int) sid);
@ -1911,6 +1997,7 @@ static bool StringifyJsonShapeDataHomogeneousList (TRI_shaper_t* shaper,
TRI_shape_length_list_t l;
TRI_shape_sid_t sid;
TRI_shape_size_t const* offsets;
TRI_shape_t const* subshape;
bool first;
char const* ptr;
int res;
@ -1918,6 +2005,14 @@ static bool StringifyJsonShapeDataHomogeneousList (TRI_shaper_t* shaper,
s = (TRI_homogeneous_list_shape_t const*) shape;
sid = s->_sidEntry;
subshape = shaper->lookupShapeId(shaper, sid);
if (subshape == NULL) {
LOG_WARNING("cannot find shape #%u", (unsigned int) sid);
return false;
}
ptr = data;
first = true;
@ -1934,16 +2029,9 @@ static bool StringifyJsonShapeDataHomogeneousList (TRI_shaper_t* shaper,
for (i = 0; i < l; ++i, ++offsets) {
TRI_shape_size_t offset;
TRI_shape_t const* subshape;
bool ok;
offset = *offsets;
subshape = shaper->lookupShapeId(shaper, sid);
if (subshape == NULL) {
LOG_WARNING("cannot find shape #%u", (unsigned int) sid);
continue;
}
if (first) {
first = false;
@ -1988,12 +2076,20 @@ static bool StringifyJsonShapeDataHomogeneousSizedList (TRI_shaper_t* shaper,
TRI_shape_sid_t sid;
TRI_shape_size_t length;
TRI_shape_size_t offset;
TRI_shape_t const* subshape;
bool first;
char const* ptr;
int res;
s = (TRI_homogeneous_sized_list_shape_t const*) shape;
sid = s->_sidEntry;
subshape = shaper->lookupShapeId(shaper, sid);
if (subshape == NULL) {
LOG_WARNING("cannot find shape #%u", (unsigned int) sid);
return false;
}
ptr = data;
first = true;
@ -2010,16 +2106,8 @@ static bool StringifyJsonShapeDataHomogeneousSizedList (TRI_shaper_t* shaper,
}
for (i = 0; i < l; ++i, offset += length) {
TRI_shape_t const* subshape = shaper->lookupShapeId(shaper, sid);
bool ok;
subshape = shaper->lookupShapeId(shaper, sid);
if (subshape == NULL) {
LOG_WARNING("cannot find shape #%u", (unsigned int) sid);
continue;
}
if (first) {
first = false;
}