mirror of https://gitee.com/bigwinds/arangodb
fix revision id handling
This commit is contained in:
parent
d6df6cbd67
commit
09e1fda1a0
|
@ -1880,20 +1880,21 @@ static void JS_RevisionVocbaseCol(
|
|||
TRI_V8_THROW_EXCEPTION_INTERNAL("cannot extract collection");
|
||||
}
|
||||
|
||||
TRI_voc_rid_t rid;
|
||||
TRI_voc_rid_t revisionId;
|
||||
int res;
|
||||
|
||||
if (ServerState::instance()->isCoordinator()) {
|
||||
res = GetRevisionCoordinator(collection, rid);
|
||||
res = GetRevisionCoordinator(collection, revisionId);
|
||||
} else {
|
||||
res = GetRevision(collection, rid);
|
||||
res = GetRevision(collection, revisionId);
|
||||
}
|
||||
|
||||
if (res != TRI_ERROR_NO_ERROR) {
|
||||
TRI_V8_THROW_EXCEPTION(res);
|
||||
}
|
||||
|
||||
TRI_V8_RETURN(V8RevisionId(isolate, rid));
|
||||
std::string ridString = TRI_RidToString(revisionId);
|
||||
TRI_V8_RETURN(TRI_V8_STD_STRING(ridString));
|
||||
TRI_V8_TRY_CATCH_END
|
||||
}
|
||||
|
||||
|
|
|
@ -377,7 +377,7 @@ static void JS_ChecksumCollection(
|
|||
LogicalCollection* collection = trx.documentCollection();
|
||||
auto physical = collection->getPhysical();
|
||||
TRI_ASSERT(physical != nullptr);
|
||||
std::string const revisionId = std::to_string(physical->revision());
|
||||
std::string const revisionId = TRI_RidToString(physical->revision());
|
||||
uint64_t hash = 0;
|
||||
|
||||
ManagedDocumentResult mmdr(&trx);
|
||||
|
|
|
@ -52,17 +52,6 @@ v8::Handle<v8::Value> V8TickId(v8::Isolate* isolate, TRI_voc_tick_t tick) {
|
|||
return TRI_V8_PAIR_STRING(&buffer[0], static_cast<int>(len));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief create a v8 revision id value from the internal revision id
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
v8::Handle<v8::Value> V8RevisionId(v8::Isolate* isolate, TRI_voc_rid_t rid) {
|
||||
char buffer[21];
|
||||
size_t len = TRI_StringUInt64InPlace(static_cast<uint64_t>(rid), &buffer[0]);
|
||||
|
||||
return TRI_V8_PAIR_STRING(&buffer[0], static_cast<int>(len));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief checks if argument is a document identifier
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -61,12 +61,6 @@ extern int32_t const WRP_VOCBASE_COL_TYPE;
|
|||
TRI_V8_THROW_EXCEPTION(TRI_ERROR_TRANSACTION_DISALLOWED_OPERATION); \
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief create a v8 revision id value from the internal revision id
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
v8::Handle<v8::Value> V8RevisionId(v8::Isolate* isolate, TRI_voc_rid_t rid);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief get the vocbase pointer from the current V8 context
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -1326,6 +1326,8 @@ void LogicalCollection::open(bool ignoreErrors) {
|
|||
StorageEngine* engine = EngineSelectorFeature::ENGINE;
|
||||
engine->changeCollection(_vocbase, _cid, this, doSync);
|
||||
}
|
||||
|
||||
TRI_UpdateTickServer(_cid);
|
||||
}
|
||||
|
||||
/// @brief opens an existing collection
|
||||
|
@ -1468,7 +1470,6 @@ int LogicalCollection::restoreIndex(Transaction* trx, VPackSlice const& info,
|
|||
}
|
||||
TRI_ASSERT(newIdx != nullptr);
|
||||
|
||||
// FIXME New style. Update tick after successful creation of index.
|
||||
TRI_UpdateTickServer(newIdx->id());
|
||||
|
||||
TRI_ASSERT(newIdx.get()->type() != Index::IndexType::TRI_IDX_TYPE_PRIMARY_INDEX);
|
||||
|
|
|
@ -208,7 +208,6 @@ function CollectionSuite () {
|
|||
var r1 = c1.checksum(true);
|
||||
assertTypeOf("string", r1.revision);
|
||||
assertTrue(r1.revision !== "");
|
||||
assertTrue(r1.revision.match(/^[0-9]+$/));
|
||||
assertTypeOf("string", r1.checksum);
|
||||
assertEqual("0", r1.checksum);
|
||||
|
||||
|
@ -218,7 +217,6 @@ function CollectionSuite () {
|
|||
assertNotEqual(r1.revision, r2.revision);
|
||||
assertTypeOf("string", r2.revision);
|
||||
assertTrue(r2.revision !== "");
|
||||
assertTrue(r2.revision.match(/^[0-9]+$/));
|
||||
assertTypeOf("string", r2.checksum);
|
||||
assertNotEqual("0", r2.checksum);
|
||||
|
||||
|
@ -229,7 +227,6 @@ function CollectionSuite () {
|
|||
assertNotEqual(r2.revision, r3.revision);
|
||||
assertTypeOf("string", r3.revision);
|
||||
assertTrue(r3.revision !== "");
|
||||
assertTrue(r3.revision.match(/^[0-9]+$/));
|
||||
assertTypeOf("string", r3.checksum);
|
||||
assertNotEqual("0", r3.checksum);
|
||||
assertNotEqual(r2.checksum, r3.checksum);
|
||||
|
@ -279,7 +276,6 @@ function CollectionSuite () {
|
|||
var r1 = c1.checksum(true);
|
||||
assertTypeOf("string", r1.revision);
|
||||
assertTrue(r1.revision !== "");
|
||||
assertTrue(r1.revision.match(/^[0-9]+$/));
|
||||
assertTypeOf("string", r1.checksum);
|
||||
assertEqual("0", r1.checksum);
|
||||
|
||||
|
@ -288,7 +284,6 @@ function CollectionSuite () {
|
|||
assertNotEqual(r1.revision, r2.revision);
|
||||
assertTypeOf("string", r2.revision);
|
||||
assertTrue(r2.revision !== "");
|
||||
assertTrue(r2.revision.match(/^[0-9]+$/));
|
||||
assertTypeOf("string", r2.checksum);
|
||||
assertNotEqual("0", r2.checksum);
|
||||
|
||||
|
@ -298,7 +293,6 @@ function CollectionSuite () {
|
|||
assertNotEqual(r2.revision, r3.revision);
|
||||
assertTypeOf("string", r3.revision);
|
||||
assertTrue(r3.revision !== "");
|
||||
assertTrue(r3.revision.match(/^[0-9]+$/));
|
||||
assertTypeOf("string", r3.checksum);
|
||||
assertNotEqual("0", r3.checksum);
|
||||
assertNotEqual(r2.checksum, r3.checksum);
|
||||
|
|
|
@ -37,23 +37,76 @@ var ArangoCollection = arangodb.ArangoCollection;
|
|||
var db = arangodb.db;
|
||||
var ERRORS = arangodb.errors;
|
||||
|
||||
var compareStringIds = function (l, r) {
|
||||
var i;
|
||||
if (l.length !== r.length) {
|
||||
return l.length - r.length < 0 ? -1 : 1;
|
||||
}
|
||||
// copied from lib/Basics/HybridLogicalClock.cpp
|
||||
var decodeTable = [
|
||||
-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
|
||||
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
|
||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, // 176 - 191
|
||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, // 192 - 207
|
||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, // 208 - 223
|
||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, // 224 - 239
|
||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1 // 240 - 255
|
||||
];
|
||||
|
||||
// length is equal
|
||||
for (i = 0; i < l.length; ++i) {
|
||||
if (l[i] !== r[i]) {
|
||||
return l[i] < r[i] ? -1 : 1;
|
||||
var decode = function(value) {
|
||||
var result = 0;
|
||||
if (value !== '0') {
|
||||
for (var i = 0, n = value.length; i < n; ++i) {
|
||||
result = (result * 2 * 2 * 2 * 2 * 2 * 2) + decodeTable[value.charCodeAt(i)];
|
||||
}
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
var compareStringIds = function (l, r) {
|
||||
if (l.length === r.length) {
|
||||
// strip common prefix because the accuracy of JS numbers is limited
|
||||
var prefixLength = 0;
|
||||
for (var i = 0; i < l.length; ++i) {
|
||||
if (l[i] !== r[i]) {
|
||||
break;
|
||||
}
|
||||
++prefixLength;
|
||||
}
|
||||
if (prefixLength > 0) {
|
||||
l = l.substr(prefixLength);
|
||||
r = r.substr(prefixLength);
|
||||
}
|
||||
}
|
||||
|
||||
l = decode(l);
|
||||
r = decode(r);
|
||||
if (l !== r) {
|
||||
return l < r ? -1 : 1;
|
||||
}
|
||||
return 0;
|
||||
};
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief test suite: error handling
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -782,18 +835,15 @@ function CollectionSuite () {
|
|||
|
||||
var r1 = c1.revision();
|
||||
assertTypeOf("string", r1);
|
||||
assertTrue(r1.match(/^[0-9]+$/));
|
||||
|
||||
c1.save({ a : 1 });
|
||||
var r2 = c1.revision();
|
||||
assertTypeOf("string", r2);
|
||||
assertTrue(r2.match(/^[0-9]+$/));
|
||||
assertEqual(1, compareStringIds(r2, r1));
|
||||
|
||||
c1.save({ a : 2 });
|
||||
var r3 = c1.revision();
|
||||
assertTypeOf("string", r3);
|
||||
assertTrue(r3.match(/^[0-9]+$/));
|
||||
assertEqual(1, compareStringIds(r3, r2));
|
||||
|
||||
// unload
|
||||
|
@ -820,11 +870,8 @@ function CollectionSuite () {
|
|||
var c1 = db._create(cn);
|
||||
|
||||
var r1 = c1.revision();
|
||||
assertTrue(r1.match(/^[0-9]+$/));
|
||||
|
||||
c1.save({ _key: "abc" });
|
||||
var r2 = c1.revision();
|
||||
assertTrue(r2.match(/^[0-9]+$/));
|
||||
assertEqual(1, compareStringIds(r2, r1));
|
||||
|
||||
c1.save({ _key: "123" });
|
||||
|
@ -832,17 +879,14 @@ function CollectionSuite () {
|
|||
c1.save({ _key: "789" });
|
||||
|
||||
var r3 = c1.revision();
|
||||
assertTrue(r3.match(/^[0-9]+$/));
|
||||
assertEqual(1, compareStringIds(r3, r2));
|
||||
|
||||
c1.remove("123");
|
||||
var r4 = c1.revision();
|
||||
assertTrue(r4.match(/^[0-9]+$/));
|
||||
assertEqual(1, compareStringIds(r4, r3));
|
||||
|
||||
c1.truncate();
|
||||
var r5 = c1.revision();
|
||||
assertTrue(r5.match(/^[0-9]+$/));
|
||||
assertEqual(1, compareStringIds(r5, r4));
|
||||
|
||||
// unload
|
||||
|
@ -853,12 +897,10 @@ function CollectionSuite () {
|
|||
// compare rev
|
||||
c1 = db._collection(cn);
|
||||
var r6 = c1.revision();
|
||||
assertTrue(r6.match(/^[0-9]+$/));
|
||||
assertEqual(0, compareStringIds(r6, r5));
|
||||
|
||||
for (var i = 0; i < 10; ++i) {
|
||||
c1.save({ _key: "test" + i });
|
||||
assertTrue(c1.revision().match(/^[0-9]+$/));
|
||||
assertEqual(1, compareStringIds(c1.revision(), r6));
|
||||
r6 = c1.revision();
|
||||
}
|
||||
|
@ -871,7 +913,6 @@ function CollectionSuite () {
|
|||
// compare rev
|
||||
c1 = db._collection(cn);
|
||||
var r7 = c1.revision();
|
||||
assertTrue(r7.match(/^[0-9]+$/));
|
||||
assertEqual(0, compareStringIds(r7, r6));
|
||||
|
||||
c1.truncate();
|
||||
|
@ -885,7 +926,6 @@ function CollectionSuite () {
|
|||
// compare rev
|
||||
c1 = db._collection(cn);
|
||||
var r9 = c1.revision();
|
||||
assertTrue(r9.match(/^[0-9]+$/));
|
||||
assertEqual(0, compareStringIds(r9, r8));
|
||||
|
||||
db._drop(cn);
|
||||
|
|
Loading…
Reference in New Issue