mirror of https://gitee.com/bigwinds/arangodb
handle OOM
This commit is contained in:
parent
40b7f372f9
commit
5b1f9f2a14
|
@ -242,77 +242,81 @@ TRI_aql_node_t* TRI_JsonNodeAql (TRI_aql_context_t* const context,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TRI_JSON_LIST: {
|
case TRI_JSON_LIST: {
|
||||||
size_t i;
|
|
||||||
size_t n;
|
|
||||||
|
|
||||||
node = TRI_CreateNodeListAql(context);
|
node = TRI_CreateNodeListAql(context);
|
||||||
n = json->_value._objects._length;
|
|
||||||
|
|
||||||
for (i = 0; i < n; ++i) {
|
if (node != NULL) {
|
||||||
TRI_json_t* subJson;
|
size_t i, n;
|
||||||
TRI_aql_node_t* member;
|
|
||||||
|
|
||||||
subJson = (TRI_json_t*) TRI_AtVector(&json->_value._objects, i);
|
n = json->_value._objects._length;
|
||||||
member = TRI_JsonNodeAql(context, subJson);
|
|
||||||
|
|
||||||
if (member) {
|
for (i = 0; i < n; ++i) {
|
||||||
TRI_PushBackVectorPointer(&node->_members, (void*) member);
|
TRI_json_t* subJson;
|
||||||
}
|
TRI_aql_node_t* member;
|
||||||
else {
|
|
||||||
TRI_SetErrorContextAql(context, TRI_ERROR_OUT_OF_MEMORY, NULL);
|
subJson = (TRI_json_t*) TRI_AtVector(&json->_value._objects, i);
|
||||||
return NULL;
|
member = TRI_JsonNodeAql(context, subJson);
|
||||||
|
|
||||||
|
if (member) {
|
||||||
|
TRI_PushBackVectorPointer(&node->_members, (void*) member);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
TRI_SetErrorContextAql(context, TRI_ERROR_OUT_OF_MEMORY, NULL);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TRI_JSON_ARRAY: {
|
case TRI_JSON_ARRAY: {
|
||||||
size_t i;
|
|
||||||
size_t n;
|
|
||||||
|
|
||||||
node = TRI_CreateNodeArrayAql(context);
|
node = TRI_CreateNodeArrayAql(context);
|
||||||
n = json->_value._objects._length;
|
|
||||||
|
|
||||||
for (i = 0; i < n; i += 2) {
|
if (node != NULL) {
|
||||||
TRI_json_t* nameJson;
|
size_t i, n;
|
||||||
TRI_json_t* valueJson;
|
|
||||||
TRI_aql_node_t* member;
|
|
||||||
TRI_aql_node_t* valueNode;
|
|
||||||
char* name;
|
|
||||||
|
|
||||||
// json_t containing the array element name
|
n = json->_value._objects._length;
|
||||||
nameJson = (TRI_json_t*) TRI_AtVector(&json->_value._objects, i);
|
|
||||||
assert(nameJson);
|
|
||||||
assert(nameJson->_value._string.data);
|
|
||||||
name = TRI_RegisterStringAql(context, nameJson->_value._string.data, strlen(nameJson->_value._string.data), false);
|
|
||||||
if (! name) {
|
|
||||||
TRI_SetErrorContextAql(context, TRI_ERROR_OUT_OF_MEMORY, NULL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// json_t containing the array element value
|
for (i = 0; i < n; i += 2) {
|
||||||
valueJson = (TRI_json_t*) TRI_AtVector(&json->_value._objects, i + 1);
|
TRI_json_t* nameJson;
|
||||||
assert(valueJson);
|
TRI_json_t* valueJson;
|
||||||
|
TRI_aql_node_t* member;
|
||||||
|
TRI_aql_node_t* valueNode;
|
||||||
|
char* name;
|
||||||
|
|
||||||
valueNode = TRI_JsonNodeAql(context, valueJson);
|
// json_t containing the array element name
|
||||||
if (! valueNode) {
|
nameJson = (TRI_json_t*) TRI_AtVector(&json->_value._objects, i);
|
||||||
TRI_SetErrorContextAql(context, TRI_ERROR_OUT_OF_MEMORY, NULL);
|
assert(nameJson);
|
||||||
return NULL;
|
assert(nameJson->_value._string.data);
|
||||||
}
|
name = TRI_RegisterStringAql(context, nameJson->_value._string.data, strlen(nameJson->_value._string.data), false);
|
||||||
|
if (! name) {
|
||||||
|
TRI_SetErrorContextAql(context, TRI_ERROR_OUT_OF_MEMORY, NULL);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
member = TRI_CreateNodeArrayElementAql(context, name, valueNode);
|
// json_t containing the array element value
|
||||||
if (member) {
|
valueJson = (TRI_json_t*) TRI_AtVector(&json->_value._objects, i + 1);
|
||||||
TRI_PushBackVectorPointer(&node->_members, (void*) member);
|
assert(valueJson);
|
||||||
}
|
|
||||||
else {
|
valueNode = TRI_JsonNodeAql(context, valueJson);
|
||||||
TRI_SetErrorContextAql(context, TRI_ERROR_OUT_OF_MEMORY, NULL);
|
if (! valueNode) {
|
||||||
return NULL;
|
TRI_SetErrorContextAql(context, TRI_ERROR_OUT_OF_MEMORY, NULL);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
member = TRI_CreateNodeArrayElementAql(context, name, valueNode);
|
||||||
|
if (member) {
|
||||||
|
TRI_PushBackVectorPointer(&node->_members, (void*) member);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
TRI_SetErrorContextAql(context, TRI_ERROR_OUT_OF_MEMORY, NULL);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! node) {
|
if (node == NULL) {
|
||||||
TRI_SetErrorContextAql(context, TRI_ERROR_OUT_OF_MEMORY, NULL);
|
TRI_SetErrorContextAql(context, TRI_ERROR_OUT_OF_MEMORY, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue