1
0
Fork 0

returnNew and returnOld, progress.

This commit is contained in:
Max Neunhoeffer 2016-03-11 15:12:58 +01:00
parent 968d1cfd1f
commit 1c94f8d1be
4 changed files with 37 additions and 21 deletions

View File

@ -1103,7 +1103,7 @@ OperationResult Transaction::modifyLocal(
} }
TRI_doc_mptr_t mptr; TRI_doc_mptr_t mptr;
VPackSlice actualRevision; VPackSlice actualRevision;
TRI_doc_mptr_t* previous = nullptr; TRI_doc_mptr_t previous;
if (operation == TRI_VOC_DOCUMENT_OPERATION_REPLACE) { if (operation == TRI_VOC_DOCUMENT_OPERATION_REPLACE) {
res = document->replace(this, newVal, &mptr, options, res = document->replace(this, newVal, &mptr, options,
@ -1120,7 +1120,7 @@ OperationResult Transaction::modifyLocal(
std::string key = newVal.get(TRI_VOC_ATTRIBUTE_KEY).copyString(); std::string key = newVal.get(TRI_VOC_ATTRIBUTE_KEY).copyString();
buildDocumentIdentity(resultBuilder, cid, key, actualRevision, buildDocumentIdentity(resultBuilder, cid, key, actualRevision,
VPackSlice(), VPackSlice(),
options.returnOld ? previous : nullptr, nullptr); options.returnOld ? &previous : nullptr, nullptr);
return TRI_ERROR_ARANGO_CONFLICT; return TRI_ERROR_ARANGO_CONFLICT;
} else if (res != TRI_ERROR_NO_ERROR) { } else if (res != TRI_ERROR_NO_ERROR) {
return res; return res;
@ -1132,7 +1132,7 @@ OperationResult Transaction::modifyLocal(
std::string key = newVal.get(TRI_VOC_ATTRIBUTE_KEY).copyString(); std::string key = newVal.get(TRI_VOC_ATTRIBUTE_KEY).copyString();
buildDocumentIdentity(resultBuilder, cid, key, buildDocumentIdentity(resultBuilder, cid, key,
mptr.revisionIdAsSlice(), actualRevision, mptr.revisionIdAsSlice(), actualRevision,
options.returnOld ? previous : nullptr , options.returnOld ? &previous : nullptr ,
options.returnNew ? &mptr : nullptr); options.returnNew ? &mptr : nullptr);
} }
return TRI_ERROR_NO_ERROR; return TRI_ERROR_NO_ERROR;

View File

@ -553,10 +553,8 @@ static void DocumentVocbase(
TRI_V8_THROW_EXCEPTION(res); TRI_V8_THROW_EXCEPTION(res);
} }
VPackOptions resultOptions = VPackOptions::Defaults; v8::Handle<v8::Value> result = TRI_VPackToV8(isolate, opResult.slice(),
resultOptions.customTypeHandler = opResult.customTypeHandler.get(); transactionContext->getVPackOptions());
v8::Handle<v8::Value> result = TRI_VPackToV8(isolate, opResult.slice(), &resultOptions);
TRI_V8_RETURN(result); TRI_V8_RETURN(result);
} }
@ -703,6 +701,14 @@ static void RemoveVocbase(v8::FunctionCallbackInfo<v8::Value> const& args) {
options.waitForSync = options.waitForSync =
TRI_ObjectToBoolean(optionsObject->Get(WaitForSyncKey)); TRI_ObjectToBoolean(optionsObject->Get(WaitForSyncKey));
} }
TRI_GET_GLOBAL_STRING(ReturnNewKey);
if (optionsObject->Has(ReturnNewKey)) {
options.returnNew = TRI_ObjectToBoolean(optionsObject->Get(ReturnNewKey));
}
TRI_GET_GLOBAL_STRING(ReturnOldKey);
if (optionsObject->Has(ReturnOldKey)) {
options.returnOld = TRI_ObjectToBoolean(optionsObject->Get(ReturnOldKey));
}
} else { // old variant replace(<document>, <data>, <overwrite>, } else { // old variant replace(<document>, <data>, <overwrite>,
// <waitForSync>) // <waitForSync>)
options.ignoreRevs = TRI_ObjectToBoolean(args[1]); options.ignoreRevs = TRI_ObjectToBoolean(args[1]);
@ -1546,6 +1552,14 @@ static void parseReplaceAndUpdateOptions(
if (optionsObject->Has(SilentKey)) { if (optionsObject->Has(SilentKey)) {
options.silent = TRI_ObjectToBoolean(optionsObject->Get(SilentKey)); options.silent = TRI_ObjectToBoolean(optionsObject->Get(SilentKey));
} }
TRI_GET_GLOBAL_STRING(ReturnNewKey);
if (optionsObject->Has(ReturnNewKey)) {
options.returnNew = TRI_ObjectToBoolean(optionsObject->Get(ReturnNewKey));
}
TRI_GET_GLOBAL_STRING(ReturnOldKey);
if (optionsObject->Has(ReturnOldKey)) {
options.returnOld = TRI_ObjectToBoolean(optionsObject->Get(ReturnOldKey));
}
if (operation == TRI_VOC_DOCUMENT_OPERATION_UPDATE) { if (operation == TRI_VOC_DOCUMENT_OPERATION_UPDATE) {
// intentionally not called for TRI_VOC_DOCUMENT_OPERATION_REPLACE // intentionally not called for TRI_VOC_DOCUMENT_OPERATION_REPLACE
TRI_GET_GLOBAL_STRING(KeepNullKey); TRI_GET_GLOBAL_STRING(KeepNullKey);
@ -1716,7 +1730,8 @@ static void ModifyVocbaseCol(TRI_voc_document_operation_e operation,
} }
VPackSlice resultSlice = opResult.slice(); VPackSlice resultSlice = opResult.slice();
TRI_V8_RETURN(TRI_VPackToV8(isolate, resultSlice)); TRI_V8_RETURN(TRI_VPackToV8(isolate, resultSlice,
transactionContext->getVPackOptions()));
TRI_V8_TRY_CATCH_END TRI_V8_TRY_CATCH_END
} }
@ -1840,7 +1855,8 @@ static void ModifyVocbase(TRI_voc_document_operation_e operation,
} }
VPackSlice resultSlice = opResult.slice(); VPackSlice resultSlice = opResult.slice();
TRI_V8_RETURN(TRI_VPackToV8(isolate, resultSlice)); TRI_V8_RETURN(TRI_VPackToV8(isolate, resultSlice,
transactionContext->getVPackOptions()));
TRI_V8_TRY_CATCH_END TRI_V8_TRY_CATCH_END
} }
@ -2041,8 +2057,9 @@ static void JS_SaveVocbase(v8::FunctionCallbackInfo<v8::Value> const& args) {
} }
// load collection // load collection
SingleCollectionTransaction trx(V8TransactionContext::Create(vocbase, true), auto transactionContext(V8TransactionContext::Create(vocbase, true));
collectionName, TRI_TRANSACTION_WRITE); SingleCollectionTransaction trx(transactionContext,
collectionName, TRI_TRANSACTION_WRITE);
trx.addHint(TRI_TRANSACTION_HINT_SINGLE_OPERATION, false); trx.addHint(TRI_TRANSACTION_HINT_SINGLE_OPERATION, false);
res = trx.begin(); res = trx.begin();
@ -2061,7 +2078,8 @@ static void JS_SaveVocbase(v8::FunctionCallbackInfo<v8::Value> const& args) {
VPackSlice resultSlice = result.slice(); VPackSlice resultSlice = result.slice();
TRI_V8_RETURN(TRI_VPackToV8(isolate, resultSlice)); TRI_V8_RETURN(TRI_VPackToV8(isolate, resultSlice,
transactionContext->getVPackOptions()));
TRI_V8_TRY_CATCH_END TRI_V8_TRY_CATCH_END
} }
@ -2202,7 +2220,7 @@ static void JS_InsertVocbaseVPack(
VPackSlice resultSlice = result.slice(); VPackSlice resultSlice = result.slice();
TRI_V8_RETURN(TRI_VPackToV8(isolate, resultSlice, TRI_V8_RETURN(TRI_VPackToV8(isolate, resultSlice,
transactionContext->getVPackOptions())); transactionContext->getVPackOptions()));
TRI_V8_TRY_CATCH_END TRI_V8_TRY_CATCH_END
} }

View File

@ -3371,12 +3371,11 @@ int TRI_document_collection_t::update(Transaction* trx,
OperationOptions& options, OperationOptions& options,
bool lock, bool lock,
VPackSlice& prevRev, VPackSlice& prevRev,
TRI_doc_mptr_t*& previous) { TRI_doc_mptr_t& previous) {
// initialize the result // initialize the result
TRI_ASSERT(mptr != nullptr); TRI_ASSERT(mptr != nullptr);
mptr->setDataPtr(nullptr); mptr->setDataPtr(nullptr);
prevRev = VPackSlice(); prevRev = VPackSlice();
previous = nullptr;
TRI_voc_rid_t revisionId = TRI_NewTickServer(); TRI_voc_rid_t revisionId = TRI_NewTickServer();
@ -3407,7 +3406,7 @@ int TRI_document_collection_t::update(Transaction* trx,
} }
prevRev = oldHeader->revisionIdAsSlice(); prevRev = oldHeader->revisionIdAsSlice();
previous = oldHeader; previous = *oldHeader;
// Check old revision: // Check old revision:
if (!options.ignoreRevs) { if (!options.ignoreRevs) {
@ -3477,9 +3476,8 @@ int TRI_document_collection_t::replace(Transaction* trx,
OperationOptions& options, OperationOptions& options,
bool lock, bool lock,
VPackSlice& prevRev, VPackSlice& prevRev,
TRI_doc_mptr_t*& previous) { TRI_doc_mptr_t& previous) {
prevRev = VPackSlice(); prevRev = VPackSlice();
previous = nullptr;
if (_info.type() == TRI_COL_TYPE_EDGE) { if (_info.type() == TRI_COL_TYPE_EDGE) {
VPackSlice s = newSlice.get(TRI_VOC_ATTRIBUTE_FROM); VPackSlice s = newSlice.get(TRI_VOC_ATTRIBUTE_FROM);
@ -3525,7 +3523,7 @@ int TRI_document_collection_t::replace(Transaction* trx,
} }
prevRev = oldHeader->revisionIdAsSlice(); prevRev = oldHeader->revisionIdAsSlice();
previous = oldHeader; previous = *oldHeader;
// Check old revision: // Check old revision:
if (!options.ignoreRevs) { if (!options.ignoreRevs) {

View File

@ -219,10 +219,10 @@ struct TRI_document_collection_t : public TRI_collection_t {
TRI_doc_mptr_t*, arangodb::OperationOptions&, bool); TRI_doc_mptr_t*, arangodb::OperationOptions&, bool);
int update(arangodb::Transaction*, arangodb::velocypack::Slice const, int update(arangodb::Transaction*, arangodb::velocypack::Slice const,
TRI_doc_mptr_t*, arangodb::OperationOptions&, bool, TRI_doc_mptr_t*, arangodb::OperationOptions&, bool,
VPackSlice&, TRI_doc_mptr_t*&); VPackSlice&, TRI_doc_mptr_t&);
int replace(arangodb::Transaction*, arangodb::velocypack::Slice const, int replace(arangodb::Transaction*, arangodb::velocypack::Slice const,
TRI_doc_mptr_t*, arangodb::OperationOptions&, bool, TRI_doc_mptr_t*, arangodb::OperationOptions&, bool,
VPackSlice&, TRI_doc_mptr_t*&); VPackSlice&, TRI_doc_mptr_t&);
int remove(arangodb::Transaction*, arangodb::velocypack::Slice const, int remove(arangodb::Transaction*, arangodb::velocypack::Slice const,
arangodb::OperationOptions&, bool, VPackSlice&, TRI_doc_mptr_t*&); arangodb::OperationOptions&, bool, VPackSlice&, TRI_doc_mptr_t*&);