1
0
Fork 0

use VPackDumper

This commit is contained in:
jsteemann 2016-05-02 17:32:53 +02:00
parent 5b3fd77bea
commit b9324ea2a1
5 changed files with 49 additions and 61 deletions

View File

@ -48,7 +48,7 @@ class ArrayIterator {
throw Exception(Exception::InvalidValueType, "Expecting Array slice"); throw Exception(Exception::InvalidValueType, "Expecting Array slice");
} }
if (slice.length() > 0) { if (_size > 0) {
auto h = slice.head(); auto h = slice.head();
if (h == 0x13) { if (h == 0x13) {
_current = slice.at(0).start(); _current = slice.at(0).start();
@ -162,7 +162,7 @@ class ObjectIterator {
throw Exception(Exception::InvalidValueType, "Expecting Object slice"); throw Exception(Exception::InvalidValueType, "Expecting Object slice");
} }
if (slice.length() > 0) { if (_size > 0) {
auto h = slice.head(); auto h = slice.head();
if (h == 0x14) { if (h == 0x14) {
_current = slice.keyAt(0, false).start(); _current = slice.keyAt(0, false).start();

View File

@ -27,12 +27,12 @@
#include "Basics/Exceptions.h" #include "Basics/Exceptions.h"
#include "Basics/MutexLocker.h" #include "Basics/MutexLocker.h"
#include "Basics/StaticStrings.h" #include "Basics/StaticStrings.h"
#include "Basics/VelocyPackDumper.h"
#include "Basics/VelocyPackHelper.h" #include "Basics/VelocyPackHelper.h"
#include "Basics/VPackStringBufferAdapter.h" #include "Basics/VPackStringBufferAdapter.h"
#include "Utils/Cursor.h" #include "Utils/Cursor.h"
#include "Utils/CursorRepository.h" #include "Utils/CursorRepository.h"
#include <velocypack/Dumper.h>
#include <velocypack/Iterator.h> #include <velocypack/Iterator.h>
#include <velocypack/Value.h> #include <velocypack/Value.h>
#include <velocypack/velocypack-aliases.h> #include <velocypack/velocypack-aliases.h>
@ -176,9 +176,7 @@ void RestCursorHandler::processQuery(VPackSlice const& slice) {
THROW_ARANGO_EXCEPTION(TRI_ERROR_OUT_OF_MEMORY); THROW_ARANGO_EXCEPTION(TRI_ERROR_OUT_OF_MEMORY);
} }
arangodb::basics::VPackStringBufferAdapter bufferAdapter( arangodb::basics::VelocyPackDumper dumper(&(_response->body()), queryResult.context->getVPackOptions());
_response->body().stringBuffer());
VPackDumper dumper(&bufferAdapter, queryResult.context->getVPackOptions());
dumper.dump(result.slice()); dumper.dump(result.slice());
return; return;
} }

View File

@ -22,6 +22,7 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#include "Cursor.h" #include "Cursor.h"
#include "Basics/VelocyPackDumper.h"
#include "Basics/VelocyPackHelper.h" #include "Basics/VelocyPackHelper.h"
#include "Basics/VPackStringBufferAdapter.h" #include "Basics/VPackStringBufferAdapter.h"
#include "Utils/CollectionExport.h" #include "Utils/CollectionExport.h"
@ -69,15 +70,13 @@ VelocyPackCursor::VelocyPackCursor(TRI_vocbase_t* vocbase, CursorId id,
: Cursor(id, batchSize, extra, ttl, hasCount), : Cursor(id, batchSize, extra, ttl, hasCount),
_vocbase(vocbase), _vocbase(vocbase),
_result(std::move(result)), _result(std::move(result)),
_size(_result.result->slice().length()), _iterator(_result.result->slice(), true),
_cached(_result.cached) { _cached(_result.cached) {
TRI_ASSERT(_result.result->slice().isArray()); TRI_ASSERT(_result.result->slice().isArray());
TRI_UseVocBase(vocbase); TRI_UseVocBase(vocbase);
} }
VelocyPackCursor::~VelocyPackCursor() { VelocyPackCursor::~VelocyPackCursor() {
freeJson();
TRI_ReleaseVocBase(_vocbase); TRI_ReleaseVocBase(_vocbase);
} }
@ -86,11 +85,11 @@ VelocyPackCursor::~VelocyPackCursor() {
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
bool VelocyPackCursor::hasNext() { bool VelocyPackCursor::hasNext() {
if (_position < _size) { if (_iterator.valid()) {
return true; return true;
} }
freeJson(); _isDeleted = true;
return false; return false;
} }
@ -100,16 +99,17 @@ bool VelocyPackCursor::hasNext() {
VPackSlice VelocyPackCursor::next() { VPackSlice VelocyPackCursor::next() {
TRI_ASSERT(_result.result != nullptr); TRI_ASSERT(_result.result != nullptr);
TRI_ASSERT(_position < _size); TRI_ASSERT(_iterator.valid());
VPackSlice slice = _result.result->slice(); VPackSlice slice = _iterator.value();
return slice.at(_position++); _iterator.next();
return slice;
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief return the cursor size /// @brief return the cursor size
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
size_t VelocyPackCursor::count() const { return _size; } size_t VelocyPackCursor::count() const { return _iterator.size(); }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief dump the cursor contents into a string buffer /// @brief dump the cursor contents into a string buffer
@ -124,39 +124,45 @@ void VelocyPackCursor::dump(arangodb::basics::StringBuffer& buffer) {
// if the specified batch size does not get out of hand // if the specified batch size does not get out of hand
// otherwise specifying a very high batch size would make the allocation fail // otherwise specifying a very high batch size would make the allocation fail
// in every case, even if there were much less documents in the collection // in every case, even if there were much less documents in the collection
auto transactionContext = std::make_shared<StandaloneTransactionContext>(_vocbase); size_t num = n;
if (num == 0) {
num = 1;
} else if (num >= 50000) {
num = 50000;
}
int res = buffer.reserve(num * 48);
if (n <= 50000) { if (res != TRI_ERROR_NO_ERROR) {
int res = buffer.reserve(n * 48); THROW_ARANGO_EXCEPTION(res);
if (res != TRI_ERROR_NO_ERROR) {
THROW_ARANGO_EXCEPTION(res);
}
} }
arangodb::basics::VPackStringBufferAdapter bufferAdapter( arangodb::basics::VelocyPackDumper dumper(&buffer, _result.context->getVPackOptions());
buffer.stringBuffer());
VPackDumper dumper(&bufferAdapter, transactionContext->getVPackOptions());
for (size_t i = 0; i < n; ++i) {
if (!hasNext()) {
break;
}
if (i > 0) { try {
buffer.appendChar(',');
}
auto row = next(); for (size_t i = 0; i < n; ++i) {
if (row.isNone()) { if (!hasNext()) {
THROW_ARANGO_EXCEPTION(TRI_ERROR_OUT_OF_MEMORY); break;
} }
if (i > 0) {
buffer.appendChar(',');
}
auto row = next();
if (row.isNone()) {
THROW_ARANGO_EXCEPTION(TRI_ERROR_OUT_OF_MEMORY);
}
try {
dumper.dump(row); dumper.dump(row);
} catch (...) {
/// TODO correct error Handling!
THROW_ARANGO_EXCEPTION(TRI_ERROR_INTERNAL);
} }
} catch (arangodb::basics::Exception const& ex) {
THROW_ARANGO_EXCEPTION_MESSAGE(ex.code(), ex.what());
} catch (std::exception const& ex) {
THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_INTERNAL, ex.what());
} catch (...) {
THROW_ARANGO_EXCEPTION(TRI_ERROR_INTERNAL);
} }
buffer.appendText("],\"hasMore\":"); buffer.appendText("],\"hasMore\":");
@ -177,9 +183,6 @@ void VelocyPackCursor::dump(arangodb::basics::StringBuffer& buffer) {
VPackSlice const extraSlice = extra(); VPackSlice const extraSlice = extra();
if (extraSlice.isObject()) { if (extraSlice.isObject()) {
arangodb::basics::VPackStringBufferAdapter bufferAdapter(
buffer.stringBuffer());
VPackDumper dumper(&bufferAdapter);
buffer.appendText(",\"extra\":"); buffer.appendText(",\"extra\":");
dumper.dump(extraSlice); dumper.dump(extraSlice);
} }
@ -193,14 +196,6 @@ void VelocyPackCursor::dump(arangodb::basics::StringBuffer& buffer) {
} }
} }
////////////////////////////////////////////////////////////////////////////////
/// @brief free the internals
////////////////////////////////////////////////////////////////////////////////
void VelocyPackCursor::freeJson() {
_isDeleted = true;
}
ExportCursor::ExportCursor(TRI_vocbase_t* vocbase, CursorId id, ExportCursor::ExportCursor(TRI_vocbase_t* vocbase, CursorId id,
arangodb::CollectionExport* ex, size_t batchSize, arangodb::CollectionExport* ex, size_t batchSize,
double ttl, bool hasCount) double ttl, bool hasCount)

View File

@ -29,6 +29,8 @@
#include "Aql/QueryResult.h" #include "Aql/QueryResult.h"
#include "VocBase/voc-types.h" #include "VocBase/voc-types.h"
#include <velocypack/Iterator.h>
struct TRI_vocbase_t; struct TRI_vocbase_t;
namespace arangodb { namespace arangodb {
@ -125,13 +127,10 @@ class VelocyPackCursor : public Cursor {
void dump(arangodb::basics::StringBuffer&) override final; void dump(arangodb::basics::StringBuffer&) override final;
private:
void freeJson();
private: private:
TRI_vocbase_t* _vocbase; TRI_vocbase_t* _vocbase;
aql::QueryResult _result; aql::QueryResult _result;
size_t const _size; arangodb::velocypack::ArrayIterator _iterator;
bool _cached; bool _cached;
}; };

View File

@ -25,12 +25,6 @@
#include "Basics/Exceptions.h" #include "Basics/Exceptions.h"
#include "Basics/fpconv.h" #include "Basics/fpconv.h"
#include "Logger/Logger.h" #include "Logger/Logger.h"
//#include "Basics/StringUtils.h"
//#include "Basics/Utf8Helper.h"
//#include "Basics/VPackStringBufferAdapter.h"
//#include "Basics/files.h"
//#include "Basics/hashes.h"
//#include "Basics/tri-strings.h"
#include <velocypack/velocypack-common.h> #include <velocypack/velocypack-common.h>
#include <velocypack/AttributeTranslator.h> #include <velocypack/AttributeTranslator.h>
@ -386,7 +380,9 @@ void VelocyPackDumper::dumpValue(VPackSlice const* slice, VPackSlice const* base
throw VPackException(VPackException::NeedCustomTypeHandler); throw VPackException(VPackException::NeedCustomTypeHandler);
} else { } else {
std::string v = options->customTypeHandler->toString(*slice, nullptr, *base); std::string v = options->customTypeHandler->toString(*slice, nullptr, *base);
_buffer->appendChar('"');
dumpString(v.c_str(), v.size()); dumpString(v.c_str(), v.size());
_buffer->appendChar('"');
} }
break; break;
} }