void TRI_DestroyJson (TRI_memory_zone_t* zone, TRI_json_t* object) { switch (object->_type) { case TRI_JSON_UNUSED: case TRI_JSON_NULL: case TRI_JSON_BOOLEAN: case TRI_JSON_NUMBER: case TRI_JSON_STRING_REFERENCE: break; case TRI_JSON_STRING: TRI_DestroyBlob(zone, &object->_value._string); break; case TRI_JSON_OBJECT: case TRI_JSON_ARRAY: { size_t const n = TRI_LengthVector(&object->_value._objects); for (size_t i = 0; i < n; ++i) { auto v = static_cast<TRI_json_t*>(TRI_AddressVector(&object->_value._objects, i)); TRI_DestroyJson(zone, v); } TRI_DestroyVector(&object->_value._objects); break; } } }
void TRI_DestroyJson (TRI_memory_zone_t* zone, TRI_json_t* object) { size_t n; size_t i; switch (object->_type) { case TRI_JSON_UNUSED: case TRI_JSON_NULL: case TRI_JSON_BOOLEAN: case TRI_JSON_NUMBER: break; case TRI_JSON_STRING: TRI_DestroyBlob(zone, &object->_value._string); break; case TRI_JSON_ARRAY: case TRI_JSON_LIST: n = object->_value._objects._length; for (i = 0; i < n; ++i) { TRI_json_t* v = TRI_AtVector(&object->_value._objects, i); TRI_DestroyJson(zone, v); } TRI_DestroyVector(&object->_value._objects); break; } }
void TRI_DestroyJson (TRI_memory_zone_t* zone, TRI_json_t* object) { switch (object->_type) { case TRI_JSON_UNUSED: case TRI_JSON_NULL: case TRI_JSON_BOOLEAN: case TRI_JSON_NUMBER: break; case TRI_JSON_STRING: TRI_DestroyBlob(zone, &object->_value._string); break; case TRI_JSON_STRING_REFERENCE: // we will not be destroying the string!! break; case TRI_JSON_ARRAY: case TRI_JSON_LIST: { size_t i, n; n = object->_value._objects._length; for (i = 0; i < n; ++i) { TRI_json_t* v = (TRI_json_t*) TRI_AtVector(&object->_value._objects, i); TRI_DestroyJson(zone, v); } TRI_DestroyVector(&object->_value._objects); break; } } }
bool TRI_DeleteArrayJson (TRI_memory_zone_t* zone, TRI_json_t* object, char const* name) { size_t n; size_t i; TRI_ASSERT(object->_type == TRI_JSON_ARRAY); TRI_ASSERT(name); n = object->_value._objects._length; for (i = 0; i < n; i += 2) { TRI_json_t* key; key = (TRI_json_t*) TRI_AtVector(&object->_value._objects, i); if (! IsString(key)) { continue; } if (TRI_EqualString(key->_value._string.data, name)) { TRI_json_t* old; // remove key old = (TRI_json_t*) TRI_AtVector(&object->_value._objects, i); if (old != NULL) { TRI_DestroyJson(zone, old); } TRI_RemoveVector(&object->_value._objects, i); // remove value old = (TRI_json_t*) TRI_AtVector(&object->_value._objects, i); if (old != NULL) { TRI_DestroyJson(zone, old); } TRI_RemoveVector(&object->_value._objects, i); return true; } } return false; }
void BitarrayIndex_destroy(BitarrayIndex* baIndex) { size_t j; if (baIndex == NULL) { return; } for (j = 0; j < baIndex->_values._length; ++j) { TRI_DestroyJson(TRI_UNKNOWN_MEM_ZONE, (TRI_json_t*)(TRI_AtVector(&(baIndex->_values),j))); } TRI_DestroyVector(&baIndex->_values); TRI_FreeBitarray(baIndex->_bitarray); baIndex->_bitarray = NULL; }
bool TRI_DeleteObjectJson (TRI_memory_zone_t* zone, TRI_json_t* object, char const* name) { TRI_ASSERT(object->_type == TRI_JSON_OBJECT); TRI_ASSERT(name != nullptr); size_t const n = TRI_LengthVector(&object->_value._objects); for (size_t i = 0; i < n; i += 2) { TRI_json_t* key = static_cast<TRI_json_t*>(TRI_AtVector(&object->_value._objects, i)); if (! IsString(key)) { continue; } if (TRI_EqualString(key->_value._string.data, name)) { // remove key TRI_json_t* old = static_cast<TRI_json_t*>(TRI_AtVector(&object->_value._objects, i)); if (old != nullptr) { TRI_DestroyJson(zone, old); } TRI_RemoveVector(&object->_value._objects, i); // remove value old = static_cast<TRI_json_t*>(TRI_AtVector(&object->_value._objects, i)); if (old != nullptr) { TRI_DestroyJson(zone, old); } TRI_RemoveVector(&object->_value._objects, i); return true; } } return false; }
bool TRI_DeleteArrayJson (TRI_memory_zone_t* zone, TRI_json_t* array, size_t index) { TRI_ASSERT(TRI_IsArrayJson(array)); size_t const n = TRI_LengthArrayJson(array); if (index >= n) { return false; } TRI_json_t* element = static_cast<TRI_json_t*>(TRI_AtVector(&array->_value._objects, index)); TRI_ASSERT(element != nullptr); TRI_DestroyJson(zone, element); TRI_RemoveVector(&array->_value._objects, index); return true; }
bool TRI_ReplaceArrayJson (TRI_memory_zone_t* zone, TRI_json_t* object, char const* name, TRI_json_t* replacement) { size_t n; size_t i; TRI_ASSERT(object->_type == TRI_JSON_ARRAY); TRI_ASSERT(name); n = object->_value._objects._length; for (i = 0; i < n; i += 2) { TRI_json_t* key; key = (TRI_json_t*) TRI_AtVector(&object->_value._objects, i); if (! IsString(key)) { continue; } if (TRI_EqualString(key->_value._string.data, name)) { TRI_json_t copy; // retrieve the old element TRI_json_t* old = (TRI_json_t*) TRI_AtVector(&object->_value._objects, i + 1); if (old != NULL) { TRI_DestroyJson(zone, old); } TRI_CopyToJson(zone, ©, replacement); TRI_SetVector(&object->_value._objects, i + 1, ©); return true; } } // object not found in array, now simply add it TRI_Insert2ArrayJson(zone, object, name, replacement); return false; }
bool TRI_ReplaceObjectJson (TRI_memory_zone_t* zone, TRI_json_t* object, char const* name, TRI_json_t const* replacement) { TRI_ASSERT(object->_type == TRI_JSON_OBJECT); TRI_ASSERT(name != nullptr); size_t const n = TRI_LengthVector(&object->_value._objects); for (size_t i = 0; i < n; i += 2) { TRI_json_t* key = static_cast<TRI_json_t*>(TRI_AtVector(&object->_value._objects, i)); if (! IsString(key)) { continue; } if (TRI_EqualString(key->_value._string.data, name)) { // retrieve the old element TRI_json_t* old = static_cast<TRI_json_t*>(TRI_AtVector(&object->_value._objects, i + 1)); if (old != nullptr) { TRI_DestroyJson(zone, old); } TRI_json_t copy; TRI_CopyToJson(zone, ©, replacement); TRI_SetVector(&object->_value._objects, i + 1, ©); return true; } } // object not found in array, now simply add it TRI_Insert2ObjectJson(zone, object, name, replacement); return false; }
void TRI_FreeJson (TRI_memory_zone_t* zone, TRI_json_t* object) { TRI_DestroyJson(zone, object); TRI_Free(zone, object); }