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(); 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; } 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); 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 /// @brief Convert a string into a revision ID, returns 0 if format invalid
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
TRI_voc_rid_t TRI_StringToRidWithCheck(std::string const& ridStr); 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 /// @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); 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 /// @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); 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), document(document),
header(nullptr), header(nullptr),
tick(0), tick(0),
rid(0),
type(type), type(type),
status(StatusType::CREATED) { status(StatusType::CREATED) {
TRI_ASSERT(marker != nullptr); TRI_ASSERT(marker != nullptr);
VPackSlice s(static_cast<uint8_t*>(marker->vpack()));
rid = TRI_StringToRid(s.get(StaticStrings::RevString).copyString());
} }
~DocumentOperation() { ~DocumentOperation() {
@ -50,6 +53,7 @@ struct DocumentOperation {
DocumentOperation* copy = DocumentOperation* copy =
new DocumentOperation(trx, marker, document, type); new DocumentOperation(trx, marker, document, type);
copy->tick = tick; copy->tick = tick;
copy->rid = rid;
copy->header = header; copy->header = header;
copy->oldHeader = oldHeader; copy->oldHeader = oldHeader;
copy->status = status; copy->status = status;
@ -109,6 +113,7 @@ struct DocumentOperation {
TRI_doc_mptr_t* header; TRI_doc_mptr_t* header;
TRI_doc_mptr_t oldHeader; TRI_doc_mptr_t oldHeader;
TRI_voc_tick_t tick; TRI_voc_tick_t tick;
TRI_voc_rid_t rid;
TRI_voc_document_operation_e type; TRI_voc_document_operation_e type;
StatusType status; StatusType status;
}; };

View File

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