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

View File

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

View File

@ -22,6 +22,7 @@
////////////////////////////////////////////////////////////////////////////////
#include "Cursor.h"
#include "Basics/VelocyPackDumper.h"
#include "Basics/VelocyPackHelper.h"
#include "Basics/VPackStringBufferAdapter.h"
#include "Utils/CollectionExport.h"
@ -69,15 +70,13 @@ VelocyPackCursor::VelocyPackCursor(TRI_vocbase_t* vocbase, CursorId id,
: Cursor(id, batchSize, extra, ttl, hasCount),
_vocbase(vocbase),
_result(std::move(result)),
_size(_result.result->slice().length()),
_iterator(_result.result->slice(), true),
_cached(_result.cached) {
TRI_ASSERT(_result.result->slice().isArray());
TRI_UseVocBase(vocbase);
}
VelocyPackCursor::~VelocyPackCursor() {
freeJson();
TRI_ReleaseVocBase(_vocbase);
}
@ -86,11 +85,11 @@ VelocyPackCursor::~VelocyPackCursor() {
////////////////////////////////////////////////////////////////////////////////
bool VelocyPackCursor::hasNext() {
if (_position < _size) {
if (_iterator.valid()) {
return true;
}
freeJson();
_isDeleted = true;
return false;
}
@ -100,16 +99,17 @@ bool VelocyPackCursor::hasNext() {
VPackSlice VelocyPackCursor::next() {
TRI_ASSERT(_result.result != nullptr);
TRI_ASSERT(_position < _size);
VPackSlice slice = _result.result->slice();
return slice.at(_position++);
TRI_ASSERT(_iterator.valid());
VPackSlice slice = _iterator.value();
_iterator.next();
return slice;
}
////////////////////////////////////////////////////////////////////////////////
/// @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
@ -124,39 +124,45 @@ void VelocyPackCursor::dump(arangodb::basics::StringBuffer& buffer) {
// if the specified batch size does not get out of hand
// 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
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) {
int res = buffer.reserve(n * 48);
if (res != TRI_ERROR_NO_ERROR) {
THROW_ARANGO_EXCEPTION(res);
}
if (res != TRI_ERROR_NO_ERROR) {
THROW_ARANGO_EXCEPTION(res);
}
arangodb::basics::VPackStringBufferAdapter bufferAdapter(
buffer.stringBuffer());
VPackDumper dumper(&bufferAdapter, transactionContext->getVPackOptions());
for (size_t i = 0; i < n; ++i) {
if (!hasNext()) {
break;
}
arangodb::basics::VelocyPackDumper dumper(&buffer, _result.context->getVPackOptions());
if (i > 0) {
buffer.appendChar(',');
}
try {
auto row = next();
if (row.isNone()) {
THROW_ARANGO_EXCEPTION(TRI_ERROR_OUT_OF_MEMORY);
}
for (size_t i = 0; i < n; ++i) {
if (!hasNext()) {
break;
}
if (i > 0) {
buffer.appendChar(',');
}
auto row = next();
if (row.isNone()) {
THROW_ARANGO_EXCEPTION(TRI_ERROR_OUT_OF_MEMORY);
}
try {
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\":");
@ -177,9 +183,6 @@ void VelocyPackCursor::dump(arangodb::basics::StringBuffer& buffer) {
VPackSlice const extraSlice = extra();
if (extraSlice.isObject()) {
arangodb::basics::VPackStringBufferAdapter bufferAdapter(
buffer.stringBuffer());
VPackDumper dumper(&bufferAdapter);
buffer.appendText(",\"extra\":");
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,
arangodb::CollectionExport* ex, size_t batchSize,
double ttl, bool hasCount)

View File

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

View File

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