@@ -174,10 +174,12 @@ std::string RestImportHandler::buildParseError(size_t i,
174
174
// //////////////////////////////////////////////////////////////////////////////
175
175
176
176
int RestImportHandler::handleSingleDocument (SingleCollectionTransaction& trx,
177
+ VPackBuilder& tempBuilder,
177
178
10000
RestImportResult& result,
178
179
VPackBuilder& babies,
179
180
VPackSlice slice,
180
181
bool isEdgeCollection, size_t i) {
182
+
181
183
if (!slice.isObject ()) {
182
184
std::string part = VPackDumper::toString (slice);
183
185
if (part.size () > 255 ) {
@@ -193,7 +195,7 @@ int RestImportHandler::handleSingleDocument(SingleCollectionTransaction& trx,
193
195
registerError (result, errorMsg);
194
196
return TRI_ERROR_ARANGO_DOCUMENT_TYPE_INVALID;
195
197
}
196
-
198
+
197
199
if (!isEdgeCollection) {
198
200
babies.add (slice);
199
201
return TRI_ERROR_NO_ERROR;
@@ -202,23 +204,22 @@ int RestImportHandler::handleSingleDocument(SingleCollectionTransaction& trx,
202
204
203
205
// document ok, now import it
204
206
transaction::BuilderLeaser newBuilder (&trx);
207
+ tempBuilder.clear ();
205
208
206
209
// add prefixes to _from and _to
207
210
if (!_fromPrefix.empty () || !_toPrefix.empty ()) {
208
- transaction::BuilderLeaser tempBuilder (&trx);
209
-
210
- tempBuilder->openObject ();
211
+ tempBuilder.openObject ();
211
212
if (!_fromPrefix.empty ()) {
212
213
VPackSlice from = slice.get (StaticStrings::FromString);
213
214
if (from.isString ()) {
214
215
std::string f = from.copyString ();
215
216
if (f.find (' /' ) == std::string::npos) {
216
- tempBuilder-> add (StaticStrings::FromString,
217
+ tempBuilder. add (StaticStrings::FromString,
217
218
VPackValue (_fromPrefix + f));
218
219
}
219
220
} else if (from.isInteger ()) {
220
221
uint64_t f = from.getNumber <uint64_t >();
221
- tempBuilder-> add (StaticStrings::FromString,
222
+ tempBuilder. add (StaticStrings::FromString,
222
223
VPackValue (_fromPrefix + std::to_string (f)));
223
224
}
224
225
}
@@ -227,19 +228,19 @@ int RestImportHandler::handleSingleDocument(SingleCollectionTransaction& trx,
227
228
if (to.isString ()) {
228
229
std::string t = to.copyString ();
229
230
if (t.find (' /' ) == std::string::npos) {
230
- tempBuilder-> add (StaticStrings::ToString,
231
+ tempBuilder. add (StaticStrings::ToString,
231
232
VPackValue (_toPrefix + t));
232
233
}
233
234
} else if (to.isInteger ()) {
234
235
uint64_t t = to.getNumber <uint64_t >();
235
- tempBuilder-> add (StaticStrings::ToString,
236
+ tempBuilder. add (StaticStrings::ToString,
236
237
VPackValue (_toPrefix + std::to_string (t)));
237
238
}
238
239
}
239
- tempBuilder-> close ();
240
+ tempBuilder. close ();
240
241
241
- if (tempBuilder-> slice ().length () > 0 ) {
242
- VPackCollection::merge (*(newBuilder.builder ()), slice, tempBuilder-> slice (), false , false );
242
+ if (tempBuilder. slice ().length () > 0 ) {
243
+ VPackCollection::merge (*(newBuilder.builder ()), slice, tempBuilder. slice (), false , false );
243
244
slice = newBuilder->slice ();
244
245
}
245
246
}
@@ -383,6 +384,8 @@ bool RestImportHandler::createFromJson(std::string const& type) {
383
384
VPackBuilder babies;
384
385
babies.openArray ();
385
386
387
+ VPackBuilder tmpBuilder;
388
+
386
389
if (linewise) {
387
390
// http required here
388
391
HttpRequest* req = dynamic_cast <HttpRequest*>(_request.get ());
@@ -396,7 +399,8 @@ bool RestImportHandler::createFromJson(std::string const& type) {
396
399
char const * ptr = body.c_str ();
397
400
char const * end = ptr + body.size ();
398
401
size_t i = 0 ;
399
-
402
+
403
+ VPackBuilder lineBuilder;
400
404
while (ptr < end) {
401
405
// read line until done
402
406
i++;
@@ -416,9 +420,6 @@ bool RestImportHandler::createFromJson(std::string const& type) {
416
420
// now find end of line
417
421
char const * pos = static_cast <char const *>(memchr (ptr, ' \n ' , end - ptr));
418
422
char const * oldPtr = nullptr ;
419
-
420
- std::shared_ptr<VPackBuilder> builder;
421
-
422
423
bool success = false ;
423
424
424
425
if (pos == ptr) {
@@ -428,19 +429,20 @@ bool RestImportHandler::createFromJson(std::string const& type) {
428
429
continue ;
429
430
}
430
431
432
+ tmpBuilder.clear ();
431
433
if (pos != nullptr ) {
432
434
// non-empty line
433
435
*(const_cast <char *>(pos)) = ' \0 ' ;
434
436
TRI_ASSERT (ptr != nullptr );
435
437
oldPtr = ptr;
436
- builder = parseVelocyPackLine (ptr, pos, success);
438
+ parseVelocyPackLine (tmpBuilder, ptr, pos, success);
437
439
ptr = pos + 1 ;
438
440
} else {
439
441
// last-line, non-empty
440
442
TRI_ASSERT (pos == nullptr );
441
443
TRI_ASSERT (ptr != nullptr );
442
444
oldPtr = ptr;
443
- builder = parseVelocyPackLine (ptr, success);
445
+ parseVelocyPackLine (tmpBuilder, ptr, success);
444
446
ptr = end;
445
447
}
446
448
@@ -455,7 +457,7 @@ bool RestImportHandler::createFromJson(std::string const& type) {
455
457
continue ;
456
458
}
457
459
458
- res = handleSingleDocument (trx, result, babies, builder-> slice (),
460
+ res = handleSingleDocument (trx, lineBuilder, result, babies, tmpBuilder. slice (),
459
461
isEdgeCollection, i);
460
462
461
463
if (res.fail ()) {
@@ -491,11 +493,11 @@ bool RestImportHandler::createFromJson(std::string const& type) {
491
493
}
492
494
493
495
VPackValueLength const n = documents.length ();
494
-
496
+ VPackBuilder lineBuilder;
495
497
for (VPackValueLength i = 0 ; i < n; ++i) {
496
498
VPackSlice const slice = documents.at (i);
497
499
498
- res = handleSingleDocument (trx, result, babies, slice, isEdgeCollection,
500
+ res = handleSingleDocument (trx, lineBuilder, result, babies, slice, isEdgeCollection,
499
501
static_cast <size_t >(i + 1 ));
500
502
501
503
if (res.fail ()) {
@@ -597,10 +599,11 @@ bool RestImportHandler::createFromVPack(std::string const& type) {
597
599
598
600
VPackValueLength const n = documents.length ();
599
601
602
+ VPackBuilder lineBuilder;
600
603
for (VPackValueLength i = 0 ; i < n; ++i) {
601
604
VPackSlice const slice = documents.at (i);
602
605
603
- res = handleSingleDocument (trx, result, babies, slice, isEdgeCollection,
606
+ res = handleSingleDocument (trx, lineBuilder, result, babies, slice, isEdgeCollection,
604
607
static_cast <size_t >(i + 1 ));
605
608
606
609
if (res.fail ()) {
@@ -715,18 +718,24 @@ bool RestImportHandler::createFromKeyValueList() {
715
718
716
719
*(const_cast <char *>(lineEnd)) = ' \0 ' ;
717
720
bool success = false ;
718
- std::shared_ptr< VPackBuilder> parsedKeys;
721
+ VPackBuilder parsedKeys;
719
722
try {
720
- parsedKeys = parseVelocyPackLine (lineStart, lineEnd, success);
723
+ parseVelocyPackLine (parsedKeys, lineStart, lineEnd, success);
721
724
} catch (...) {
722
725
// This throws if the body is not parseable
723
726
generateError (rest::ResponseCode::BAD, TRI_ERROR_HTTP_BAD_PARAMETER,
724
727
" no JSON string array found in first line" );
725
728
return false ;
726
729
}
727
- VPackSlice const keys = parsedKeys->slice ();
730
+ if (!success) {
731
+ generateError (rest::ResponseCode::BAD, TRI_ERROR_HTTP_BAD_PARAMETER,
732
+ " no JSON string array found in first line" );
733
+ return false ;
734
+ }
735
+
736
+ VPackSlice const keys = parsedKeys.slice ();
728
737
729
- if (!success || ! checkKeys (keys)) {
738
+ if (!checkKeys (keys)) {
730
739
generateError (rest::ResponseCode::BAD, TRI_ERROR_HTTP_BAD_PARAMETER,
731
740
" no JSON string array found in first line" );
732
741
return false ;
@@ -760,10 +769,13 @@ bool RestImportHandler::createFromKeyValueList() {
760
769
// Ignore the result ...
761
770
}
762
771
772
+ VPackBuilder parsedValues;
763
773
VPackBuilder babies;
764
774
babies.openArray ();
765
775
766
776
size_t i = static_cast <size_t >(lineNumber);
777
+ VPackBuilder lineBuilder;
778
+ VPackBuilder objectBuilder;
767
779
768
780
while (current != nullptr && current < bodyEnd) {
769
781
i++;
@@ -803,8 +815,8 @@ bool RestImportHandler::createFromKeyValueList() {
803
815
}
804
816
805
817
bool success;
806
- std::shared_ptr<VPackBuilder> parsedValues =
807
- parseVelocyPackLine (lineStart, lineEnd, success);
818
+ parsedValues. clear ();
819
+ parseVelocyPackLine (parsedValues, lineStart, lineEnd, success);
808
820
809
821
// build the json object from the array
810
822
std::string errorMsg;
@@ -813,11 +825,11 @@ bool RestImportHandler::createFromKeyValueList() {
813
825
registerError (result, errorMsg);
814
826
res = TRI_ERROR_INTERNAL;
815
827
} else {
816
- VPackSlice const values = parsedValues-> slice ();
828
+ VPackSlice const values = parsedValues. slice ();
817
829
try {
818
- std::shared_ptr<VPackBuilder> objectBuilder =
819
- createVelocyPackObject (keys, values, errorMsg, i);
820
- res = handleSingleDocument (trx, result, babies, objectBuilder-> slice (),
830
+ objectBuilder. clear ();
831
+ createVelocyPackObject (objectBuilder, keys, values, errorMsg, i);
832
+ res = handleSingleDocument (trx, lineBuilder, result, babies, objectBuilder. slice (),
821
833
isEdgeCollection, i);
822
834
} catch (...) {
823
835
// raise any error
@@ -1030,40 +1042,40 @@ void RestImportHandler::generateDocumentsCreated(
1030
1042
// / @brief parse a single document line
1031
1043
// //////////////////////////////////////////////////////////////////////////////
1032
1044
1033
- std::shared_ptr<VPackBuilder> RestImportHandler::parseVelocyPackLine (
1045
+ void RestImportHandler::parseVelocyPackLine (
1046
+ VPackBuilder& builder,
1034
1047
std::string const & line, bool & success) {
1035
1048
try {
1036
1049
success = true ;
1037
- return VPackParser::fromJson (line);
1050
+ VPackParser parser (builder);
1051
+ parser.parse (line);
1038
1052
} catch (VPackException const &) {
1039
1053
success = false ;
1040
- VPackParser p;
1041
- return p.steal ();
1042
1054
}
1043
1055
}
1044
1056
1045
1057
// //////////////////////////////////////////////////////////////////////////////
1046
1058
// / @brief parse a single document line
1047
1059
// //////////////////////////////////////////////////////////////////////////////
1048
1060
1049
- std::shared_ptr<VPackBuilder> RestImportHandler::parseVelocyPackLine (
1061
+ void RestImportHandler::parseVelocyPackLine (VPackBuilder& builder,
1050
1062
char const * start, char const * end, bool & success) {
1051
1063
try {
1052
- std::string tmp (start, end);
1053
- return parseVelocyPackLine (tmp, success);
1064
+ success = true ;
1065
+ VPackParser parser (builder);
1066
+ parser.parse (start,std::distance (start, end));
1054
1067
} catch (std::exception const &) {
1055
1068
// The line is invalid and could not be transformed into a string
1056
1069
success = false ;
1057
- VPackParser p;
1058
- return p.steal ();
1059
1070
}
1060
1071
}
1061
1072
1062
1073
// //////////////////////////////////////////////////////////////////////////////
1063
1074
// / @brief create a VelocyPack object from a key and value list
1064
1075
// //////////////////////////////////////////////////////////////////////////////
1065
1076
1066
- std::shared_ptr<VPackBuilder> RestImportHandler::createVelocyPackObject (
1077
+ void RestImportHandler::createVelocyPackObject (
1078
+ VPackBuilder& result,
1067
1079
VPackSlice const & keys, VPackSlice const & values, std::string& errorMsg,
1068
1080
size_t lineNumber) {
1069
1081
if (!values.isArray ()) {
@@ -1082,28 +1094,26 @@ std::shared_ptr<VPackBuilder> RestImportHandler::createVelocyPackObject(
1082
1094
THROW_ARANGO_EXCEPTION_MESSAGE (TRI_ERROR_BAD_PARAMETER, errorMsg);
1083
1095
}
1084
1096
1085
- auto result = std::make_shared<VPackBuilder>();
1086
- result->openObject ();
1097
+ result.openObject ();
1087
1098
1088
1099
while (itKeys.valid ()) {
1089
1100
TRI_ASSERT (itValues.valid ());
1090
-
1101
+
1091
1102
VPackSlice const key = itKeys.value ();
1092
1103
VPackSlice const value = itValues.value ();
1093
1104
1094
1105
if (key.isString () && !value.isNone () && !value.isNull ()) {
1095
1106
VPackValueLength l;
1096
1107
char const * p = key.getString (l);
1097
- result-> add (p, l, value);
1108
+ result. add (p, l, value);
1098
1109
}
1099
1110
1100
1111
itKeys.next ();
1101
1112
itValues.next ();
1102
1113
}
1103
1114
1104
- result-> close ();
1115
+ result. close ();
1105
1116
1106
- return result;
1107
1117
}
1108
1118
1109
1119
// //////////////////////////////////////////////////////////////////////////////
0 commit comments