1
0
Fork 0

handle OOM

This commit is contained in:
Jan Steemann 2013-07-02 17:21:07 +02:00
parent 40b7f372f9
commit 5b1f9f2a14
1 changed files with 54 additions and 50 deletions

View File

@ -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);
} }