1
0
Fork 0

Fix lastRevision in collection to use revision.

This commit is contained in:
Max Neunhoeffer 2016-07-06 09:38:20 +02:00
parent f441fceed8
commit 1a04b0112f
5 changed files with 47 additions and 6 deletions

View File

@ -1115,7 +1115,7 @@ int TRI_AddOperationTransaction(TRI_transaction_t* trx,
copy->handle();
}
document->setLastRevision(static_cast<TRI_voc_tick_t>(operation.tick), false);
document->setLastRevision(operation.rid, false);
TRI_IF_FAILURE("TransactionOperationAtEnd") { return TRI_ERROR_DEBUG; }

View File

@ -119,12 +119,24 @@ std::string TRI_RidToString(TRI_voc_rid_t rid);
TRI_voc_rid_t TRI_StringToRid(std::string const& ridStr);
////////////////////////////////////////////////////////////////////////////////
/// @brief Convert a string into a revision ID, no check variant
////////////////////////////////////////////////////////////////////////////////
TRI_voc_rid_t TRI_StringToRid(char const* p, size_t len);
////////////////////////////////////////////////////////////////////////////////
/// @brief Convert a string into a revision ID, returns 0 if format invalid
////////////////////////////////////////////////////////////////////////////////
TRI_voc_rid_t TRI_StringToRidWithCheck(std::string const& ridStr);
////////////////////////////////////////////////////////////////////////////////
/// @brief Convert a string into a revision ID, returns 0 if format invalid
////////////////////////////////////////////////////////////////////////////////
TRI_voc_rid_t TRI_StringToRidWithCheck(char const* p, size_t len);
////////////////////////////////////////////////////////////////////////////////
/// @brief enum for write operations
////////////////////////////////////////////////////////////////////////////////

View File

@ -2371,6 +2371,14 @@ TRI_voc_rid_t TRI_StringToRid(std::string const& ridStr) {
return HybridLogicalClock::decodeTimeStamp(ridStr);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief Convert a string into a revision ID, no check variant
////////////////////////////////////////////////////////////////////////////////
TRI_voc_rid_t TRI_StringToRid(char const* p, size_t len) {
return HybridLogicalClock::decodeTimeStamp(p, len);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief Convert a string into a revision ID, returns 0 if format invalid
////////////////////////////////////////////////////////////////////////////////
@ -2379,3 +2387,11 @@ TRI_voc_rid_t TRI_StringToRidWithCheck(std::string const& ridStr) {
return HybridLogicalClock::decodeTimeStampWithCheck(ridStr);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief Convert a string into a revision ID, returns 0 if format invalid
////////////////////////////////////////////////////////////////////////////////
TRI_voc_rid_t TRI_StringToRidWithCheck(char const* p, size_t len) {
return HybridLogicalClock::decodeTimeStampWithCheck(p, len);
}

View File

@ -31,9 +31,12 @@ struct DocumentOperation {
document(document),
header(nullptr),
tick(0),
rid(0),
type(type),
status(StatusType::CREATED) {
TRI_ASSERT(marker != nullptr);
VPackSlice s(static_cast<uint8_t*>(marker->vpack()));
rid = TRI_StringToRid(s.get(StaticStrings::RevString).copyString());
}
~DocumentOperation() {
@ -50,6 +53,7 @@ struct DocumentOperation {
DocumentOperation* copy =
new DocumentOperation(trx, marker, document, type);
copy->tick = tick;
copy->rid = rid;
copy->header = header;
copy->oldHeader = oldHeader;
copy->status = status;
@ -109,6 +113,7 @@ struct DocumentOperation {
TRI_doc_mptr_t* header;
TRI_doc_mptr_t oldHeader;
TRI_voc_tick_t tick;
TRI_voc_rid_t rid;
TRI_voc_document_operation_e type;
StatusType status;
};

View File

@ -103,22 +103,30 @@ class HybridLogicalClock {
}
static uint64_t decodeTimeStamp(std::string const& s) {
return decodeTimeStamp(s.c_str(), s.size());
}
static uint64_t decodeTimeStamp(char const* p, size_t len) {
uint64_t r = 0;
for (size_t i = 0; i < s.size(); i++) {
for (size_t i = 0; i < len; i++) {
r = (r << 6) |
static_cast<uint8_t>(decodeTable[static_cast<uint8_t>(s[i])]);
static_cast<uint8_t>(decodeTable[static_cast<uint8_t>(p[i])]);
}
return r;
}
static uint64_t decodeTimeStampWithCheck(std::string const& s) {
return decodeTimeStampWithCheck(s.c_str(), s.size());
}
static uint64_t decodeTimeStampWithCheck(char const* p, size_t len) {
// Returns 0 if format is not valid
if (s.size() > 11) {
if (len > 11) {
return 0;
}
uint64_t r = 0;
for (size_t i = 0; i < s.size(); i++) {
char c = decodeTable[static_cast<uint8_t>(s[i])];
for (size_t i = 0; i < len; i++) {
char c = decodeTable[static_cast<uint8_t>(p[i])];
if (c < 0) {
return 0;
}