diff --git a/arangod/VocBase/vocbase.cpp b/arangod/VocBase/vocbase.cpp index c539a5f7a8..130011d87e 100644 --- a/arangod/VocBase/vocbase.cpp +++ b/arangod/VocBase/vocbase.cpp @@ -2359,7 +2359,13 @@ void TRI_SanitizeObjectWithEdges(VPackSlice const slice, VPackBuilder& builder) /// @brief Convert a revision ID to a string //////////////////////////////////////////////////////////////////////////////// +constexpr static TRI_voc_rid_t tickLimit + = static_cast(2016-1970) * 1000 * 60 * 60 * 24 * 365; + std::string TRI_RidToString(TRI_voc_rid_t rid) { + if (rid <= tickLimit) { + return arangodb::basics::StringUtils::itoa(rid); + } return HybridLogicalClock::encodeTimeStamp(rid); } @@ -2368,7 +2374,7 @@ std::string TRI_RidToString(TRI_voc_rid_t rid) { //////////////////////////////////////////////////////////////////////////////// TRI_voc_rid_t TRI_StringToRid(std::string const& ridStr) { - return HybridLogicalClock::decodeTimeStamp(ridStr); + return TRI_StringToRid(ridStr.c_str(), ridStr.size()); } //////////////////////////////////////////////////////////////////////////////// @@ -2376,6 +2382,17 @@ TRI_voc_rid_t TRI_StringToRid(std::string const& ridStr) { //////////////////////////////////////////////////////////////////////////////// TRI_voc_rid_t TRI_StringToRid(char const* p, size_t len) { + if (len > 0 && *p >= '1' && *p <= '9') { + // Remove this case before the year 3887 AD because then it will + // start to clash with encoded timestamps: + TRI_voc_rid_t r = arangodb::basics::StringUtils::uint64(p, len); + if (r > tickLimit) { + // An old tick value that could be confused with a time stamp + LOG(WARN) + << "Saw old _rev value that could be confused with a time stamp!"; + } + return r; + } return HybridLogicalClock::decodeTimeStamp(p, len); } @@ -2384,7 +2401,7 @@ TRI_voc_rid_t TRI_StringToRid(char const* p, size_t len) { //////////////////////////////////////////////////////////////////////////////// TRI_voc_rid_t TRI_StringToRidWithCheck(std::string const& ridStr) { - return HybridLogicalClock::decodeTimeStampWithCheck(ridStr); + return TRI_StringToRidWithCheck(ridStr.c_str(), ridStr.size()); } //////////////////////////////////////////////////////////////////////////////// @@ -2392,6 +2409,17 @@ TRI_voc_rid_t TRI_StringToRidWithCheck(std::string const& ridStr) { //////////////////////////////////////////////////////////////////////////////// TRI_voc_rid_t TRI_StringToRidWithCheck(char const* p, size_t len) { + if (len > 0 && *p >= '1' && *p <= '9') { + // Remove this case before the year 3887 AD because then it will + // start to clash with encoded timestamps: + TRI_voc_rid_t r = arangodb::basics::StringUtils::uint64_check(p, len); + if (r > tickLimit) { + // An old tick value that could be confused with a time stamp + LOG(WARN) + << "Saw old _rev value that could be confused with a time stamp!"; + } + return r; + } return HybridLogicalClock::decodeTimeStampWithCheck(p, len); } diff --git a/lib/Basics/HybridLogicalClock.cpp b/lib/Basics/HybridLogicalClock.cpp index a3acd6de89..bf055a5026 100644 --- a/lib/Basics/HybridLogicalClock.cpp +++ b/lib/Basics/HybridLogicalClock.cpp @@ -24,17 +24,17 @@ #include "Basics/HybridLogicalClock.h" char arangodb::basics::HybridLogicalClock::encodeTable[65] - = "-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"; + = "-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; char arangodb::basics::HybridLogicalClock::decodeTable[256] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, // 0 - 15 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, // 16 - 31 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,-1,-1, // 32 - 47 - 1, 2, 3, 4, 5, 6, 7, 8, 9,10,-1,-1,-1,-1,-1,-1, // 48 - 63 - -1,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25, // 64 - 79 - 26,27,28,29,30,31,32,33,34,35,36,-1,-1,-1,-1,37, // 80 - 95 - -1,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52, // 96 - 111 - 53,54,55,56,57,58,59,60,61,62,63,-1,-1,-1,-1,-1, // 112 - 127 + 54,55,56,57,58,59,60,61,62,63,-1,-1,-1,-1,-1,-1, // 48 - 63 + -1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16, // 64 - 79 + 17,18,19,20,21,22,23,24,25,26,27,-1,-1,-1,-1, 1, // 80 - 95 + -1,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42, // 96 - 111 + 43,44,45,46,47,48,49,50,51,52,53,-1,-1,-1,-1,-1, // 112 - 127 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, // 128 - 143 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, // 144 - 159 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, // 160 - 175