1
0
Fork 0

Merge branch 'spdvpk' of https://github.com/arangodb/arangodb into spdvpk

This commit is contained in:
Jan Steemann 2016-02-19 12:06:18 +01:00
commit d97cfc84e4
2 changed files with 57 additions and 27 deletions

View File

@ -84,6 +84,37 @@ TRI_voc_rid_t Transaction::extractRevisionId(VPackSlice const* slice) {
return 0;
}
//////////////////////////////////////////////////////////////////////////////
/// @brief build a VPack object with _id, _key and _rev, the result is
/// added to the builder in the argument as a single object.
//////////////////////////////////////////////////////////////////////////////
void Transaction::buildDocumentIdentity(VPackBuilder& builder,
TRI_voc_cid_t cid,
std::string const& key,
std::string const& rid,
std::string const& oldRid) {
std::string collectionName = resolver()->getCollectionName(cid);
builder.openObject();
builder.add(TRI_VOC_ATTRIBUTE_ID, VPackValue(collectionName + "/" + key));
builder.add(TRI_VOC_ATTRIBUTE_KEY, VPackValue(key));
builder.add(TRI_VOC_ATTRIBUTE_REV, VPackValue(rid));
if (!oldRid.empty()) {
builder.add("_oldRev", VPackValue(oldRid));
}
builder.close();
}
void Transaction::buildDocumentIdentity(VPackBuilder& builder,
TRI_voc_cid_t cid,
std::string const& key,
TRI_voc_rid_t rid,
std::string const& oldRid) {
std::string ridSt = std::to_string(rid);
buildDocumentIdentity(builder, cid, key, ridSt, oldRid);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief opens the declared collections of the transaction
////////////////////////////////////////////////////////////////////////////////
@ -559,11 +590,7 @@ OperationResult Transaction::documentLocal(std::string const& collectionName,
if (expectedRevision != 0 && expectedRevision != mptr._rid) {
// still return
VPackBuilder resultBuilder;
resultBuilder.openObject();
resultBuilder.add(TRI_VOC_ATTRIBUTE_ID, VPackValue(std::string(collectionName + "/" + key)));
resultBuilder.add(TRI_VOC_ATTRIBUTE_REV, VPackValue(std::to_string(mptr._rid)));
resultBuilder.add(TRI_VOC_ATTRIBUTE_KEY, VPackValue(key));
resultBuilder.close();
buildDocumentIdentity(resultBuilder, cid, key, mptr._rid, "");
return OperationResult(resultBuilder.steal(), nullptr, "",
TRI_ERROR_ARANGO_CONFLICT,
@ -716,11 +743,7 @@ OperationResult Transaction::insertLocal(std::string const& collectionName,
std::string resultKey = VPackSlice(mptr.vpack()).get(TRI_VOC_ATTRIBUTE_KEY).copyString();
VPackBuilder resultBuilder;
resultBuilder.openObject();
resultBuilder.add(TRI_VOC_ATTRIBUTE_ID, VPackValue(std::string(collectionName + "/" + resultKey)));
resultBuilder.add(TRI_VOC_ATTRIBUTE_REV, VPackValue(vpack.get(TRI_VOC_ATTRIBUTE_REV).copyString()));
resultBuilder.add(TRI_VOC_ATTRIBUTE_KEY, VPackValue(resultKey));
resultBuilder.close();
buildDocumentIdentity(resultBuilder, cid, resultKey, mptr._rid, "");
return OperationResult(resultBuilder.steal(), nullptr, "", TRI_ERROR_NO_ERROR,
options.waitForSync);
@ -852,12 +875,8 @@ OperationResult Transaction::updateLocal(std::string const& collectionName,
std::string resultKey = VPackSlice(mptr.vpack()).get(TRI_VOC_ATTRIBUTE_KEY).copyString();
VPackBuilder resultBuilder;
resultBuilder.openObject();
resultBuilder.add(TRI_VOC_ATTRIBUTE_ID, VPackValue(std::string(collectionName + "/" + resultKey)));
resultBuilder.add(TRI_VOC_ATTRIBUTE_REV, VPackValue(vpack.get(TRI_VOC_ATTRIBUTE_REV).copyString()));
resultBuilder.add(TRI_VOC_ATTRIBUTE_KEY, VPackValue(resultKey));
resultBuilder.add("_oldRev", VPackValue(idString));
resultBuilder.close();
buildDocumentIdentity(resultBuilder, cid, resultKey,
vpack.get(TRI_VOC_ATTRIBUTE_REV).copyString(), idString);
return OperationResult(resultBuilder.steal(), nullptr, "", TRI_ERROR_NO_ERROR,
options.waitForSync);
@ -989,12 +1008,8 @@ OperationResult Transaction::replaceLocal(std::string const& collectionName,
std::string resultKey = VPackSlice(mptr.vpack()).get(TRI_VOC_ATTRIBUTE_KEY).copyString();
VPackBuilder resultBuilder;
resultBuilder.openObject();
resultBuilder.add(TRI_VOC_ATTRIBUTE_ID, VPackValue(std::string(collectionName + "/" + resultKey)));
resultBuilder.add(TRI_VOC_ATTRIBUTE_REV, VPackValue(vpack.get(TRI_VOC_ATTRIBUTE_REV).copyString()));
resultBuilder.add(TRI_VOC_ATTRIBUTE_KEY, VPackValue(resultKey));
resultBuilder.add("_oldRev", VPackValue(idString));
resultBuilder.close();
buildDocumentIdentity(resultBuilder, cid, resultKey,
vpack.get(TRI_VOC_ATTRIBUTE_REV).copyString(), idString);
return OperationResult(resultBuilder.steal(), nullptr, "", TRI_ERROR_NO_ERROR,
options.waitForSync);
@ -1093,11 +1108,8 @@ OperationResult Transaction::removeLocal(std::string const& collectionName,
}
VPackBuilder resultBuilder;
resultBuilder.openObject();
resultBuilder.add(TRI_VOC_ATTRIBUTE_ID, VPackValue(std::string(collectionName + "/" + key)));
resultBuilder.add(TRI_VOC_ATTRIBUTE_REV, VPackValue(std::to_string(actualRevision)));
resultBuilder.add(TRI_VOC_ATTRIBUTE_KEY, VPackValue(key));
resultBuilder.close();
buildDocumentIdentity(resultBuilder, cid, key,
std::to_string(actualRevision), "");
return OperationResult(resultBuilder.steal(), nullptr, "", TRI_ERROR_NO_ERROR,
options.waitForSync);

View File

@ -307,6 +307,24 @@ class Transaction {
static TRI_voc_rid_t extractRevisionId(VPackSlice const*);
//////////////////////////////////////////////////////////////////////////////
/// @brief build a VPack object with _id, _key and _rev and possibly
/// oldRef (if given), the result is added to the builder in the
/// argument as a single object.
//////////////////////////////////////////////////////////////////////////////
void buildDocumentIdentity(VPackBuilder& builder,
TRI_voc_cid_t cid,
std::string const& key,
std::string const& rid,
std::string const& oldRid);
void buildDocumentIdentity(VPackBuilder& builder,
TRI_voc_cid_t cid,
std::string const& key,
TRI_voc_rid_t rid,
std::string const& oldRid);
//////////////////////////////////////////////////////////////////////////////
/// @brief read any (random) document
/// DEPRECATED