static char* ExtractStringShapedJson (TRI_shaper_t* shaper, TRI_shaped_json_t const* document, char const* path) { TRI_json_t* json; TRI_shape_pid_t pid; TRI_shape_t const* shape; TRI_shaped_json_t shaped; bool ok; char* result; pid = shaper->findAttributePathByName(shaper, path); ok = TRI_ExtractShapedJsonVocShaper(shaper, document, 0, pid, &shaped, &shape); if (! ok || shape == NULL) { return NULL; } json = TRI_JsonShapedJson(shaper, &shaped); if (json == NULL) { return NULL; } if (json->_type != TRI_JSON_STRING) { return NULL; } result = TRI_DuplicateString2(json->_value._string.data, json->_value._string.length); TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, json); return result; }
static bool ExtractDoubleArray (TRI_shaper_t* shaper, TRI_shaped_json_t const* document, TRI_shape_pid_t pid, double* result, bool* missing) { TRI_shape_t const* shape; TRI_shaped_json_t json; bool ok; *missing = false; ok = TRI_ExtractShapedJsonVocShaper(shaper, document, 0, pid, &json, &shape); if (! ok) { return false; } if (shape == NULL) { *missing = true; return false; } else if (json._sid == TRI_LookupBasicSidShaper(TRI_SHAPE_NUMBER)) { *result = * (double*) json._data.data; return true; } else if (json._sid == TRI_LookupBasicSidShaper(TRI_SHAPE_NULL)) { *missing = true; return false; } else { return false; } }
static bool ExtractBooleanShapedJson (TRI_shaper_t* shaper, TRI_shaped_json_t const* document, char const* path, bool* found) { TRI_json_t* json; TRI_shape_pid_t pid; TRI_shape_t const* shape; TRI_shaped_json_t shaped; bool result; bool ok; if (found != NULL) { *found = false; } pid = shaper->findAttributePathByName(shaper, path); ok = TRI_ExtractShapedJsonVocShaper(shaper, document, 0, pid, &shaped, &shape); if (! ok || shape == NULL) { return false; } json = TRI_JsonShapedJson(shaper, &shaped); if (json == NULL) { return false; } if (json->_type != TRI_JSON_BOOLEAN) { return false; } if (found != NULL) { *found = true; } result = json->_value._boolean; TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, json); return result; }
static bool ExtractDoubleList (TRI_shaper_t* shaper, TRI_shaped_json_t const* document, TRI_shape_pid_t pid, double* latitude, double* longitude, bool* missing) { TRI_shape_t const* shape; TRI_shaped_json_t entry; TRI_shaped_json_t list; bool ok; size_t len; *missing = false; ok = TRI_ExtractShapedJsonVocShaper(shaper, document, 0, pid, &list, &shape); if (! ok) { return false; } if (shape == NULL) { *missing = true; return false; } // in-homogenous list if (shape->_type == TRI_SHAPE_LIST) { len = TRI_LengthListShapedJson((const TRI_list_shape_t*) shape, &list); if (len < 2) { return false; } // latitude ok = TRI_AtListShapedJson((const TRI_list_shape_t*) shape, &list, 0, &entry); if (! ok || entry._sid != TRI_LookupBasicSidShaper(TRI_SHAPE_NUMBER)) { return false; } *latitude = * (double*) entry._data.data; // longitude ok = TRI_AtListShapedJson((const TRI_list_shape_t*) shape, &list, 1, &entry); if (! ok || entry._sid != TRI_LookupBasicSidShaper(TRI_SHAPE_NUMBER)) { return false; } *longitude = * (double*) entry._data.data; return true; } // homogenous list else if (shape->_type == TRI_SHAPE_HOMOGENEOUS_LIST) { const TRI_homogeneous_list_shape_t* hom; hom = (const TRI_homogeneous_list_shape_t*) shape; if (hom->_sidEntry != TRI_LookupBasicSidShaper(TRI_SHAPE_NUMBER)) { return false; } len = TRI_LengthHomogeneousListShapedJson((const TRI_homogeneous_list_shape_t*) shape, &list); if (len < 2) { return false; } // latitude ok = TRI_AtHomogeneousListShapedJson((const TRI_homogeneous_list_shape_t*) shape, &list, 0, &entry); if (! ok) { return false; } *latitude = * (double*) entry._data.data; // longitude ok = TRI_AtHomogeneousListShapedJson((const TRI_homogeneous_list_shape_t*) shape, &list, 1, &entry); if (! ok) { return false; } *longitude = * (double*) entry._data.data; return true; } // homogeneous list else if (shape->_type == TRI_SHAPE_HOMOGENEOUS_SIZED_LIST) { const TRI_homogeneous_sized_list_shape_t* hom; hom = (const TRI_homogeneous_sized_list_shape_t*) shape; if (hom->_sidEntry != TRI_LookupBasicSidShaper(TRI_SHAPE_NUMBER)) { return false; } len = TRI_LengthHomogeneousSizedListShapedJson((const TRI_homogeneous_sized_list_shape_t*) shape, &list); if (len < 2) { return false; } // latitude ok = TRI_AtHomogeneousSizedListShapedJson((const TRI_homogeneous_sized_list_shape_t*) shape, &list, 0, &entry); if (! ok) { return false; } *latitude = * (double*) entry._data.data; // longitude ok = TRI_AtHomogeneousSizedListShapedJson((const TRI_homogeneous_sized_list_shape_t*) shape, &list, 1, &entry); if (! ok) { return false; } *longitude = * (double*) entry._data.data; return true; } // null else if (shape->_type == TRI_SHAPE_NULL) { *missing = true; } // ups return false; }