From 196441b9b4f1fc19c61c8fe9fb3641ac1c59a2e7 Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Tue, 5 Aug 2014 13:23:37 +0200 Subject: [PATCH] improved v8 object generation --- arangod/V8Server/v8-query.cpp | 38 +++---- arangod/V8Server/v8-vocbase.cpp | 80 ++++--------- arangod/V8Server/v8-vocbase.h | 11 +- arangod/VocBase/document-collection.h | 30 +---- lib/V8/v8-conv.cpp | 156 ++++++++++++++++++++++++-- lib/V8/v8-conv.h | 12 +- 6 files changed, 205 insertions(+), 122 deletions(-) diff --git a/arangod/V8Server/v8-query.cpp b/arangod/V8Server/v8-query.cpp index 2c10cfb406..34090a726c 100644 --- a/arangod/V8Server/v8-query.cpp +++ b/arangod/V8Server/v8-query.cpp @@ -1103,7 +1103,7 @@ static v8::Handle ExecuteSkiplistQuery (v8::Arguments const& argv, while (limit > 0) { TRI_skiplist_index_element_t* indexElement = skiplistIterator->_next(skiplistIterator); - if (indexElement == NULL) { + if (indexElement == nullptr) { break; } @@ -1112,7 +1112,7 @@ static v8::Handle ExecuteSkiplistQuery (v8::Arguments const& argv, if (total > skip && count < limit) { v8::Handle doc = WRAP_SHAPED_JSON(trx, col->_cid, - (TRI_doc_mptr_t const*) indexElement->_document); + ((TRI_doc_mptr_t const*) indexElement->_document)->getDataPtr()); if (doc.IsEmpty()) { error = true; @@ -1306,18 +1306,18 @@ static v8::Handle ExecuteBitarrayQuery (v8::Arguments const& argv, TRI_voc_size_t count = 0; bool error = false; - if (indexIterator != NULL) { + if (indexIterator != nullptr) { while (limit > 0) { TRI_doc_mptr_t* data = (TRI_doc_mptr_t*) indexIterator->_next(indexIterator); - if (data == NULL) { + if (data == nullptr) { break; } ++total; if (total > skip && count < limit) { - v8::Handle doc = WRAP_SHAPED_JSON(trx, col->_cid, data); + v8::Handle doc = WRAP_SHAPED_JSON(trx, col->_cid, data->getDataPtr()); if (doc.IsEmpty()) { error = true; @@ -1418,7 +1418,7 @@ static int StoreGeoResult (V8ReadTransaction& trx, // copy the documents bool error = false; for (gtr = tmp, i = 0; gtr < gnd; ++gtr, ++i) { - v8::Handle doc = WRAP_SHAPED_JSON(trx, collection->_cid, (TRI_doc_mptr_t const*) gtr->_data); + v8::Handle doc = WRAP_SHAPED_JSON(trx, collection->_cid, ((TRI_doc_mptr_t const*) gtr->_data)->getDataPtr()); if (doc.IsEmpty()) { error = true; @@ -1533,7 +1533,7 @@ static v8::Handle EdgesQuery (TRI_edge_direction_e direction, } for (size_t j = 0; j < edges.size(); ++j) { - v8::Handle doc = WRAP_SHAPED_JSON(trx, col->_cid, &edges[j]); + v8::Handle doc = WRAP_SHAPED_JSON(trx, col->_cid, edges[j].getDataPtr()); if (doc.IsEmpty()) { // error @@ -1576,7 +1576,7 @@ static v8::Handle EdgesQuery (TRI_edge_direction_e direction, } for (size_t j = 0; j < edges.size(); ++j) { - v8::Handle doc = WRAP_SHAPED_JSON(trx, col->_cid, &edges[j]); + v8::Handle doc = WRAP_SHAPED_JSON(trx, col->_cid, edges[j].getDataPtr()); if (doc.IsEmpty()) { error = true; @@ -1660,7 +1660,7 @@ static v8::Handle JS_AllQuery (v8::Arguments const& argv) { result->Set(v8::String::New("documents"), documents); for (size_t i = 0; i < n; ++i) { - v8::Handle doc = WRAP_SHAPED_JSON(trx, col->_cid, &docs[i]); + v8::Handle doc = WRAP_SHAPED_JSON(trx, col->_cid, docs[i].getDataPtr()); if (doc.IsEmpty()) { TRI_V8_EXCEPTION_MEMORY(scope); @@ -1736,7 +1736,7 @@ static v8::Handle JS_OffsetQuery (v8::Arguments const& argv) { result->Set(v8::String::New("documents"), documents); for (size_t i = 0; i < n; ++i) { - v8::Handle document = WRAP_SHAPED_JSON(trx, col->_cid, &docs[i]); + v8::Handle document = WRAP_SHAPED_JSON(trx, col->_cid, docs[i].getDataPtr()); if (document.IsEmpty()) { TRI_V8_EXCEPTION_MEMORY(scope); @@ -1802,7 +1802,7 @@ static v8::Handle JS_AnyQuery (v8::Arguments const& argv) { return scope.Close(v8::Null()); } - v8::Handle doc = WRAP_SHAPED_JSON(trx, col->_cid, &document); + v8::Handle doc = WRAP_SHAPED_JSON(trx, col->_cid, document.getDataPtr()); if (doc.IsEmpty()) { TRI_V8_EXCEPTION_MEMORY(scope); @@ -1917,9 +1917,7 @@ static v8::Handle JS_ByExampleQuery (v8::Arguments const& argv) { if (s < e) { for (size_t j = s; j < e; ++j) { - TRI_doc_mptr_copy_t* mptr = &filtered[j]; - - v8::Handle doc = WRAP_SHAPED_JSON(trx, col->_cid, mptr); + v8::Handle doc = WRAP_SHAPED_JSON(trx, col->_cid, filtered[j].getDataPtr()); if (doc.IsEmpty()) { error = true; @@ -2030,7 +2028,7 @@ static v8::Handle ByExampleHashIndexQuery (V8ReadTransaction& trx, if (s < e) { for (size_t i = s; i < e; ++i) { - v8::Handle doc = WRAP_SHAPED_JSON(trx, collection->_cid, list._documents[i]); + v8::Handle doc = WRAP_SHAPED_JSON(trx, collection->_cid, list._documents[i]->getDataPtr()); if (doc.IsEmpty()) { error = true; @@ -2434,7 +2432,7 @@ static v8::Handle JS_FirstQuery (v8::Arguments const& argv) { uint32_t j = 0; for (size_t i = 0; i < n; ++i) { - v8::Handle doc = WRAP_SHAPED_JSON(trx, col->_cid, &documents[i]); + v8::Handle doc = WRAP_SHAPED_JSON(trx, col->_cid, documents[i].getDataPtr()); if (doc.IsEmpty()) { // error @@ -2451,7 +2449,7 @@ static v8::Handle JS_FirstQuery (v8::Arguments const& argv) { return scope.Close(v8::Null()); } - v8::Handle result = WRAP_SHAPED_JSON(trx, col->_cid, &documents[0]); + v8::Handle result = WRAP_SHAPED_JSON(trx, col->_cid, documents[0].getDataPtr()); if (result.IsEmpty()) { TRI_V8_EXCEPTION_MEMORY(scope); @@ -2533,7 +2531,7 @@ static v8::Handle FulltextQuery (V8ReadTransaction& trx, bool error = false; for (uint32_t i = 0; i < queryResult->_numDocuments; ++i) { - v8::Handle doc = WRAP_SHAPED_JSON(trx, collection->_cid, (TRI_doc_mptr_t const*) queryResult->_documents[i]); + v8::Handle doc = WRAP_SHAPED_JSON(trx, collection->_cid, ((TRI_doc_mptr_t const*) queryResult->_documents[i])->getDataPtr()); if (doc.IsEmpty()) { error = true; @@ -2671,7 +2669,7 @@ static v8::Handle JS_LastQuery (v8::Arguments const& argv) { uint32_t j = 0; for (size_t i = 0; i < n; ++i) { - v8::Handle doc = WRAP_SHAPED_JSON(trx, col->_cid, &documents[i]); + v8::Handle doc = WRAP_SHAPED_JSON(trx, col->_cid, documents[i].getDataPtr()); if (doc.IsEmpty()) { // error @@ -2688,7 +2686,7 @@ static v8::Handle JS_LastQuery (v8::Arguments const& argv) { return scope.Close(v8::Null()); } - v8::Handle result = WRAP_SHAPED_JSON(trx, col->_cid, &documents[0]); + v8::Handle result = WRAP_SHAPED_JSON(trx, col->_cid, documents[0].getDataPtr()); if (result.IsEmpty()) { TRI_V8_EXCEPTION_MEMORY(scope); diff --git a/arangod/V8Server/v8-vocbase.cpp b/arangod/V8Server/v8-vocbase.cpp index 05e882c265..41cd68e812 100644 --- a/arangod/V8Server/v8-vocbase.cpp +++ b/arangod/V8Server/v8-vocbase.cpp @@ -1993,7 +1993,7 @@ static v8::Handle DocumentVocbaseCol (bool useCollection, TRI_ASSERT(trx.hasBarrier()); if (res == TRI_ERROR_NO_ERROR) { - result = TRI_WrapShapedJson(trx, col->_cid, &document); + result = TRI_WrapShapedJson(trx, col->_cid, document.getDataPtr()); } FREE_STRING(TRI_CORE_MEM_ZONE, key); @@ -10329,15 +10329,14 @@ template static v8::Handle AddBasicDocumentAttributes (T& trx, TRI_v8_global_t* v8g, TRI_voc_cid_t cid, - TRI_doc_mptr_t const* mptr, + TRI_df_marker_t const* marker, v8::Handle result) { - v8::HandleScope scope; + TRI_ASSERT(marker != nullptr); - TRI_ASSERT(mptr != nullptr); - - TRI_voc_rid_t rid = mptr->_rid; - char const* docKey = TRI_EXTRACT_MARKER_KEY(mptr); // PROTECTED by trx from above + TRI_voc_rid_t rid = TRI_EXTRACT_MARKER_RID(marker); TRI_ASSERT(rid > 0); + + char const* docKey = TRI_EXTRACT_MARKER_KEY(marker); TRI_ASSERT(docKey != nullptr); CollectionNameResolver const* resolver = trx.resolver(); @@ -10345,22 +10344,23 @@ static v8::Handle AddBasicDocumentAttributes (T& trx, result->Set(v8g->_RevKey, V8RevisionId(rid), v8::ReadOnly); result->Set(v8g->_KeyKey, v8::String::New(docKey), v8::ReadOnly); - TRI_df_marker_type_t type = static_cast(mptr->getDataPtr())->_type; // PROTECTED by trx from above + TRI_df_marker_type_t type = marker->_type; + char const* base = reinterpret_cast(marker); if (type == TRI_DOC_MARKER_KEY_EDGE) { - TRI_doc_edge_key_marker_t const* marker = static_cast(mptr->getDataPtr()); // PROTECTED by trx from above + TRI_doc_edge_key_marker_t const* m = reinterpret_cast(marker); - result->Set(v8g->_FromKey, V8DocumentId(resolver->getCollectionNameCluster(marker->_fromCid), ((char*) marker) + marker->_offsetFromKey)); - result->Set(v8g->_ToKey, V8DocumentId(resolver->getCollectionNameCluster(marker->_toCid), ((char*) marker) + marker->_offsetToKey)); + result->Set(v8g->_FromKey, V8DocumentId(resolver->getCollectionNameCluster(m->_fromCid), base + m->_offsetFromKey)); + result->Set(v8g->_ToKey, V8DocumentId(resolver->getCollectionNameCluster(m->_toCid), base + m->_offsetToKey)); } else if (type == TRI_WAL_MARKER_EDGE) { - triagens::wal::edge_marker_t const* marker = static_cast(mptr->getDataPtr()); // PROTECTED by trx from above + triagens::wal::edge_marker_t const* m = reinterpret_cast(marker); - result->Set(v8g->_FromKey, V8DocumentId(resolver->getCollectionNameCluster(marker->_fromCid), ((char const*) marker) + marker->_offsetFromKey)); - result->Set(v8g->_ToKey, V8DocumentId(resolver->getCollectionNameCluster(marker->_toCid), ((char const*) marker) + marker->_offsetToKey)); + result->Set(v8g->_FromKey, V8DocumentId(resolver->getCollectionNameCluster(m->_fromCid), base + m->_offsetFromKey)); + result->Set(v8g->_ToKey, V8DocumentId(resolver->getCollectionNameCluster(m->_toCid), base + m->_offsetToKey)); } - return scope.Close(result); + return result; } //////////////////////////////////////////////////////////////////////////////// @@ -10370,22 +10370,9 @@ static v8::Handle AddBasicDocumentAttributes (T& trx, template v8::Handle TRI_WrapShapedJson (T& trx, TRI_voc_cid_t cid, - TRI_df_marker_t const* marker) { - // TODO: implement! - return v8::Object::New(); -} - -//////////////////////////////////////////////////////////////////////////////// -/// @brief wraps a TRI_shaped_json_t -//////////////////////////////////////////////////////////////////////////////// - -template -v8::Handle TRI_WrapShapedJson (T& trx, - TRI_voc_cid_t cid, - TRI_doc_mptr_t const* document) { - v8::HandleScope scope; - - TRI_ASSERT(document != nullptr); + void const* data) { + TRI_df_marker_t const* marker = static_cast(data); + TRI_ASSERT(marker != nullptr); TRI_barrier_t* barrier = trx.barrier(); TRI_ASSERT(barrier != nullptr); @@ -10393,9 +10380,6 @@ v8::Handle TRI_WrapShapedJson (T& trx, v8::Isolate* isolate = v8::Isolate::GetCurrent(); TRI_v8_global_t* v8g = static_cast(isolate->GetData()); - void const* marker = document->getDataPtr(); - TRI_ASSERT(marker != nullptr); // PROTECTED by trx from above - bool const doCopy = TRI_IsWalDataMarkerDatafile(marker); if (doCopy) { @@ -10409,27 +10393,13 @@ v8::Handle TRI_WrapShapedJson (T& trx, TRI_shape_t const* shape = shaper->lookupShapeId(shaper, json._sid); if (shape == nullptr) { - return scope.Close(v8::Object::New()); + return v8::Object::New(); } v8::Handle result = v8::Object::New(); - result = AddBasicDocumentAttributes(trx, v8g, cid, document, result); + result = AddBasicDocumentAttributes(trx, v8g, cid, marker, result); - v8::Handle shaped = TRI_JsonShapeData(shaper, shape, json._data.data, json._data.length); - - if (! shaped.IsEmpty()) { - // now copy the shaped json attributes into the result - // this is done to ensure proper order (_key, _id, _rev etc. come first) - v8::Handle array = v8::Handle::Cast(shaped); - v8::Handle names = array->GetOwnPropertyNames(); - uint32_t const n = names->Length(); - for (uint32_t j = 0; j < n; ++j) { - v8::Handle key = names->Get(j); - result->Set(key, array->Get(key)); - } - } - - return scope.Close(result); + return TRI_JsonShapeData(result, shaper, shape, json._data.data, json._data.length); } // we'll create a document stub, with a pointer into the datafile @@ -10439,14 +10409,12 @@ v8::Handle TRI_WrapShapedJson (T& trx, if (result.IsEmpty()) { // error - return scope.Close(result); + return result; } - void* data = const_cast(marker); // PROTECTED by trx from above - // point the 0 index Field to the c++ pointer for unwrapping later result->SetInternalField(SLOT_CLASS_TYPE, v8::Integer::New(WRP_SHAPED_JSON_TYPE)); - result->SetInternalField(SLOT_CLASS, v8::External::New(data)); + result->SetInternalField(SLOT_CLASS, v8::External::New((void*) marker)); // tell everyone else that this barrier is used by an external reinterpret_cast(barrier)->_usedByExternal = true; @@ -10469,7 +10437,7 @@ v8::Handle TRI_WrapShapedJson (T& trx, result->SetInternalField(SLOT_BARRIER, i->second); } - return scope.Close(AddBasicDocumentAttributes(trx, v8g, cid, document, result)); + return AddBasicDocumentAttributes(trx, v8g, cid, marker, result); } //////////////////////////////////////////////////////////////////////////////// diff --git a/arangod/V8Server/v8-vocbase.h b/arangod/V8Server/v8-vocbase.h index c146a5cba9..b234879989 100644 --- a/arangod/V8Server/v8-vocbase.h +++ b/arangod/V8Server/v8-vocbase.h @@ -76,16 +76,7 @@ TRI_index_t* TRI_LookupIndexByHandle (triagens::arango::CollectionNameResolver c template v8::Handle TRI_WrapShapedJson (T&, TRI_voc_cid_t, - TRI_df_marker_t const*); - -//////////////////////////////////////////////////////////////////////////////// -/// @brief wraps a TRI_shaped_json_t -//////////////////////////////////////////////////////////////////////////////// - -template -v8::Handle TRI_WrapShapedJson (T&, - TRI_voc_cid_t, - TRI_doc_mptr_t const*); + void const*); //////////////////////////////////////////////////////////////////////////////// /// @brief return the private WRP_VOCBASE_COL_TYPE value diff --git a/arangod/VocBase/document-collection.h b/arangod/VocBase/document-collection.h index fec9de0cfe..4e75aeaa57 100644 --- a/arangod/VocBase/document-collection.h +++ b/arangod/VocBase/document-collection.h @@ -554,20 +554,7 @@ static inline char const* TRI_EXTRACT_MARKER_KEY (TRI_df_marker_t const* marker) static inline char const* TRI_EXTRACT_MARKER_KEY (TRI_doc_mptr_t const* mptr) { TRI_df_marker_t const* marker = static_cast(mptr->getDataPtr()); // PROTECTED by TRI_EXTRACT_MARKER_KEY search - - if (marker->_type == TRI_DOC_MARKER_KEY_DOCUMENT || marker->_type == TRI_DOC_MARKER_KEY_EDGE) { - return ((char const*) mptr->getDataPtr()) + ((TRI_doc_document_key_marker_t const*) mptr->getDataPtr())->_offsetKey; // PROTECTED by TRI_EXTRACT_MARKER_KEY search - } - else if (marker->_type == TRI_WAL_MARKER_DOCUMENT || marker->_type == TRI_WAL_MARKER_EDGE) { - return ((char const*) mptr->getDataPtr()) + ((triagens::wal::document_marker_t const*) mptr->getDataPtr())->_offsetKey; // PROTECTED by TRI_EXTRACT_MARKER_KEY search - } - -#ifdef TRI_ENABLE_MAINTAINER_MODE - // invalid marker type - TRI_ASSERT(false); -#endif - - return nullptr; + return TRI_EXTRACT_MARKER_KEY(marker); } //////////////////////////////////////////////////////////////////////////////// @@ -576,20 +563,7 @@ static inline char const* TRI_EXTRACT_MARKER_KEY (TRI_doc_mptr_t const* mptr) { static inline char const* TRI_EXTRACT_MARKER_KEY (TRI_doc_mptr_copy_t const* mptr) { TRI_df_marker_t const* marker = static_cast(mptr->getDataPtr()); // PROTECTED by TRI_EXTRACT_MARKER_KEY search - - if (marker->_type == TRI_DOC_MARKER_KEY_DOCUMENT || marker->_type == TRI_DOC_MARKER_KEY_EDGE) { - return ((char const*) mptr->getDataPtr()) + ((TRI_doc_document_key_marker_t const*) mptr->getDataPtr())->_offsetKey; // PROTECTED by TRI_EXTRACT_MARKER_KEY search - } - else if (marker->_type == TRI_WAL_MARKER_DOCUMENT || marker->_type == TRI_WAL_MARKER_EDGE) { - return ((char const*) mptr->getDataPtr()) + ((triagens::wal::document_marker_t const*) mptr->getDataPtr())->_offsetKey; // PROTECTED by TRI_EXTRACT_MARKER_KEY search - } - -#ifdef TRI_ENABLE_MAINTAINER_MODE - // invalid marker type - TRI_ASSERT(false); -#endif - - return nullptr; + return TRI_EXTRACT_MARKER_KEY(marker); } // ----------------------------------------------------------------------------- diff --git a/lib/V8/v8-conv.cpp b/lib/V8/v8-conv.cpp index 82af42d6e9..9862504078 100644 --- a/lib/V8/v8-conv.cpp +++ b/lib/V8/v8-conv.cpp @@ -55,10 +55,16 @@ static int FillShapeValueJson (TRI_shaper_t* shaper, vector< v8::Handle >& seenObjects, bool create); -static v8::Handle JsonShapeData (TRI_shaper_t* shaper, - TRI_shape_t const* shape, - char const* data, - size_t size); +static v8::Handle JsonShapeData (v8::Handle&, + TRI_shaper_t*, + TRI_shape_t const*, + char const*, + size_t); + +static v8::Handle JsonShapeData (TRI_shaper_t*, + TRI_shape_t const*, + char const*, + size_t); // ----------------------------------------------------------------------------- // --SECTION-- private types @@ -972,7 +978,114 @@ static v8::Handle JsonShapeDataLongString (TRI_shaper_t* shaper, } //////////////////////////////////////////////////////////////////////////////// -/// @brief converts a data array blob into a json object +/// @brief merges a data array blob into an existing json object +//////////////////////////////////////////////////////////////////////////////// + +static v8::Handle JsonShapeDataArray (v8::Handle& value, + TRI_shaper_t* shaper, + TRI_shape_t const* shape, + char const* data, + size_t size) { + TRI_array_shape_t const* s; + TRI_shape_aid_t const* aids; + TRI_shape_sid_t const* sids; + TRI_shape_size_t const* offsetsF; + TRI_shape_size_t const* offsetsV; + TRI_shape_size_t f; + TRI_shape_size_t i; + TRI_shape_size_t n; + TRI_shape_size_t v; + shape_cache_t shapeCache; + char const* qtr; + + v8::Handle array = v8::Handle::Cast(value); + + s = (TRI_array_shape_t const*) shape; + f = s->_fixedEntries; + v = s->_variableEntries; + n = f + v; + + qtr = (char const*) shape; + + qtr += sizeof(TRI_array_shape_t); + + sids = (TRI_shape_sid_t const*) qtr; + qtr += n * sizeof(TRI_shape_sid_t); + + aids = (TRI_shape_aid_t const*) qtr; + qtr += n * sizeof(TRI_shape_aid_t); + + offsetsF = (TRI_shape_size_t const*) qtr; + shapeCache._sid = 0; + shapeCache._shape = 0; + + for (i = 0; i < f; ++i, ++sids, ++aids, ++offsetsF) { + TRI_shape_sid_t sid = *sids; + + TRI_shape_t const* subshape; + if (sid == shapeCache._sid && shapeCache._sid > 0) { + subshape = shapeCache._shape; + } + else { + shapeCache._shape = subshape = shaper->lookupShapeId(shaper, sid); + shapeCache._sid = sid; + } + + if (subshape == 0) { + LOG_WARNING("cannot find shape #%u", (unsigned int) sid); + continue; + } + + TRI_shape_aid_t aid = *aids; + char const* name = shaper->lookupAttributeId(shaper, aid); + + if (name == 0) { + LOG_WARNING("cannot find attribute #%u", (unsigned int) aid); + continue; + } + + const TRI_shape_size_t offset = *offsetsF; + v8::Handle element = JsonShapeData(shaper, subshape, data + offset, offsetsF[1] - offset); + array->Set(v8::String::New(name), element); + } + + offsetsV = (TRI_shape_size_t const*) data; + + for (i = 0; i < v; ++i, ++sids, ++aids, ++offsetsV) { + TRI_shape_sid_t sid = *sids; + + TRI_shape_t const* subshape; + if (sid == shapeCache._sid && shapeCache._sid > 0) { + subshape = shapeCache._shape; + } + else { + shapeCache._shape = subshape = shaper->lookupShapeId(shaper, sid); + shapeCache._sid = sid; + } + + if (subshape == 0) { + LOG_WARNING("cannot find shape #%u", (unsigned int) sid); + continue; + } + + TRI_shape_aid_t aid = *aids; + char const* name = shaper->lookupAttributeId(shaper, aid); + + if (name == 0) { + LOG_WARNING("cannot find attribute #%u", (unsigned int) aid); + continue; + } + + const TRI_shape_size_t offset = *offsetsV; + v8::Handle element = JsonShapeData(shaper, subshape, data + offset, offsetsV[1] - offset); + array->Set(v8::String::New(name), element); + } + + return array; +} + +//////////////////////////////////////////////////////////////////////////////// +/// @brief converts a data array blob into a new json object //////////////////////////////////////////////////////////////////////////////// static v8::Handle JsonShapeDataArray (TRI_shaper_t* shaper, @@ -1229,7 +1342,24 @@ static v8::Handle JsonShapeDataHomogeneousSizedList (TRI_shaper_t* sh } //////////////////////////////////////////////////////////////////////////////// -/// @brief converts a data blob into a json object +/// @brief merges a data blob into an existing json object +//////////////////////////////////////////////////////////////////////////////// + +static v8::Handle JsonShapeData (v8::Handle& value, + TRI_shaper_t* shaper, + TRI_shape_t const* shape, + char const* data, + size_t size) { + if (shape == nullptr) { + return v8::Null(); + } + + TRI_ASSERT(shape->_type == TRI_SHAPE_ARRAY); + return JsonShapeDataArray(value, shaper, shape, data, size); +} + +//////////////////////////////////////////////////////////////////////////////// +/// @brief converts a data blob into a new json object //////////////////////////////////////////////////////////////////////////////// static v8::Handle JsonShapeData (TRI_shaper_t* shaper, @@ -1415,7 +1545,19 @@ v8::Handle TRI_ObjectJson (TRI_json_t const* json) { } //////////////////////////////////////////////////////////////////////////////// -/// @brief converts a TRI_shaped_json_t into a V8 object +/// @brief converts a TRI_shaped_json_t into an existing V8 object +//////////////////////////////////////////////////////////////////////////////// + +v8::Handle TRI_JsonShapeData (v8::Handle value, + TRI_shaper_t* shaper, + TRI_shape_t const* shape, + char const* data, + size_t size) { + return JsonShapeData(value, shaper, shape, data, size); +} + +//////////////////////////////////////////////////////////////////////////////// +/// @brief converts a TRI_shaped_json_t into a new V8 object //////////////////////////////////////////////////////////////////////////////// v8::Handle TRI_JsonShapeData (TRI_shaper_t* shaper, diff --git a/lib/V8/v8-conv.h b/lib/V8/v8-conv.h index f66b364da8..fb8b7992f2 100644 --- a/lib/V8/v8-conv.h +++ b/lib/V8/v8-conv.h @@ -58,7 +58,17 @@ v8::Handle TRI_ArrayAssociativePointer (TRI_associative_pointer_t con v8::Handle TRI_ObjectJson (TRI_json_t const*); //////////////////////////////////////////////////////////////////////////////// -/// @brief converts a TRI_shaped_json_t into a V8 object +/// @brief converts a TRI_shaped_json_t into an existing V8 object +//////////////////////////////////////////////////////////////////////////////// + +v8::Handle TRI_JsonShapeData (v8::Handle, + TRI_shaper_t*, + TRI_shape_t const*, + char const* data, + size_t size); + +//////////////////////////////////////////////////////////////////////////////// +/// @brief converts a TRI_shaped_json_t into a new V8 object //////////////////////////////////////////////////////////////////////////////// v8::Handle TRI_JsonShapeData (TRI_shaper_t*,