diff --git a/lib/Basics/VelocyPackHelper.cpp b/lib/Basics/VelocyPackHelper.cpp index cee6378b0b..09780481e1 100644 --- a/lib/Basics/VelocyPackHelper.cpp +++ b/lib/Basics/VelocyPackHelper.cpp @@ -58,6 +58,7 @@ static arangodb::velocypack::StringRef const cidRef("cid"); static std::unique_ptr translator; static std::unique_ptrcustomTypeHandler; +static VPackOptions optionsWithUniquenessCheck; template int compareObjects(VPackSlice const& lhs, @@ -197,6 +198,9 @@ void VelocyPackHelper::initialize() { // allow dumping of Object attributes in "arbitrary" order (i.e. non-sorted // order) VPackOptions::Defaults.dumpAttributesInIndexOrder = false; + + ::optionsWithUniquenessCheck = VPackOptions::Defaults; + ::optionsWithUniquenessCheck.checkAttributeUniqueness = true; // run quick selfs test with the attribute translator TRI_ASSERT(VPackSlice(::translator->translate(StaticStrings::KeyString)).getUInt() == @@ -232,6 +236,11 @@ arangodb::velocypack::AttributeTranslator* VelocyPackHelper::getTranslator() { return ::translator.get(); } +/// @brief return the (global) attribute translator instance +arangodb::velocypack::Options* VelocyPackHelper::optionsWithUniquenessCheck() { + return &::optionsWithUniquenessCheck; +} + bool VelocyPackHelper::AttributeSorterUTF8::operator()(std::string const& l, std::string const& r) const { // use UTF-8-based comparison of attribute names diff --git a/lib/Basics/VelocyPackHelper.h b/lib/Basics/VelocyPackHelper.h index 6e75895964..3b0e292961 100644 --- a/lib/Basics/VelocyPackHelper.h +++ b/lib/Basics/VelocyPackHelper.h @@ -82,6 +82,8 @@ class VelocyPackHelper { static void disableAssemblerFunctions(); static arangodb::velocypack::AttributeTranslator* getTranslator(); + + static arangodb::velocypack::Options* optionsWithUniquenessCheck(); struct VPackHash { size_t operator()(arangodb::velocypack::Slice const&) const; diff --git a/lib/Rest/GeneralRequest.cpp b/lib/Rest/GeneralRequest.cpp index 63a650edf6..48186a3845 100644 --- a/lib/Rest/GeneralRequest.cpp +++ b/lib/Rest/GeneralRequest.cpp @@ -28,6 +28,7 @@ #include "Basics/StringBuffer.h" #include "Basics/StringUtils.h" #include "Basics/Utf8Helper.h" +#include "Basics/VelocyPackHelper.h" #include "Logger/Logger.h" using namespace arangodb; @@ -294,4 +295,9 @@ double GeneralRequest::parsedValue(std::string const& key, double valueNotFound) } return valueNotFound; } + +std::shared_ptr GeneralRequest::toVelocyPackBuilderPtr() { + auto* opts = VelocyPackHelper::optionsWithUniquenessCheck(); + return std::make_shared(payload(opts), opts); +}; } // namespace arangodb diff --git a/lib/Rest/GeneralRequest.h b/lib/Rest/GeneralRequest.h index 0d3a6c7f7f..e1eed8d91d 100644 --- a/lib/Rest/GeneralRequest.h +++ b/lib/Rest/GeneralRequest.h @@ -196,13 +196,7 @@ class GeneralRequest { /// @brief parsed request payload virtual VPackSlice payload(arangodb::velocypack::Options const* options = &VPackOptions::Defaults) = 0; - TEST_VIRTUAL std::shared_ptr toVelocyPackBuilderPtr() { - VPackOptions optionsWithUniquenessCheck = VPackOptions::Defaults; - optionsWithUniquenessCheck.checkAttributeUniqueness = true; - return std::make_shared(payload(&optionsWithUniquenessCheck), - &optionsWithUniquenessCheck); - }; - + TEST_VIRTUAL std::shared_ptr toVelocyPackBuilderPtr(); std::shared_ptr toVelocyPackBuilderPtrNoUniquenessChecks() { return std::make_shared(payload()); }; diff --git a/lib/SimpleHttpClient/SimpleHttpResult.cpp b/lib/SimpleHttpClient/SimpleHttpResult.cpp index 4d79dd8a49..0d44257048 100644 --- a/lib/SimpleHttpClient/SimpleHttpResult.cpp +++ b/lib/SimpleHttpClient/SimpleHttpResult.cpp @@ -26,6 +26,7 @@ #include "Basics/NumberUtils.h" #include "Basics/StaticStrings.h" #include "Basics/StringUtils.h" +#include "Basics/VelocyPackHelper.h" #include #include @@ -87,9 +88,7 @@ std::shared_ptr SimpleHttpResult::getBodyVelocyPack(VPackOptions c // Default case std::shared_ptr SimpleHttpResult::getBodyVelocyPack() const { - VPackOptions options; - options.checkAttributeUniqueness = true; - return getBodyVelocyPack(options); + return getBodyVelocyPack(*VelocyPackHelper::optionsWithUniquenessCheck()); } std::string SimpleHttpResult::getResultTypeMessage() const {