From c84361d3cbf5485ee924272047a3fbd78bc508f6 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Tue, 25 Jun 2019 12:49:43 +0200 Subject: idb: memory backend fixes --- packages/idb-bridge/src/MemoryBackend.test.ts | 37 +++++++++++++++++++++++++++ packages/idb-bridge/src/MemoryBackend.ts | 30 ++++++++++++++-------- packages/idb-bridge/src/util/cmp.ts | 2 -- 3 files changed, 57 insertions(+), 12 deletions(-) diff --git a/packages/idb-bridge/src/MemoryBackend.test.ts b/packages/idb-bridge/src/MemoryBackend.test.ts index c882b9760..b5bc5dad2 100644 --- a/packages/idb-bridge/src/MemoryBackend.test.ts +++ b/packages/idb-bridge/src/MemoryBackend.test.ts @@ -151,6 +151,43 @@ test("Spec: Example 1 Part 3", async t => { cursor = request4.result; t.is(cursor.value.isbn, 123456); + cursor.continue(); + + await promiseFromRequest(request4); + + cursor = request4.result; + t.is(cursor.value.isbn, 234567); + + cursor.continue(); + + await promiseFromRequest(request4); + + cursor = request4.result; + t.is(cursor.value.isbn, 345678); + + cursor.continue(); + await promiseFromRequest(request4); + + cursor = request4.result; + + t.is(cursor, null); + + const tx5 = db.transaction("books", "readonly"); + const store5 = tx5.objectStore("books"); + const index5 = store5.index("by_author"); + + const request5 = index5.openCursor(null, "next"); + + await promiseFromRequest(request5); + cursor = request5.result; + t.is(cursor.value.author, "Barney"); + cursor.continue(); + + await promiseFromRequest(request5); + cursor = request5.result; + t.is(cursor.value.author, "Fred"); + cursor.continue(); + db.close(); t.pass(); diff --git a/packages/idb-bridge/src/MemoryBackend.ts b/packages/idb-bridge/src/MemoryBackend.ts index 75e583a89..c72431f28 100644 --- a/packages/idb-bridge/src/MemoryBackend.ts +++ b/packages/idb-bridge/src/MemoryBackend.ts @@ -747,7 +747,11 @@ export class MemoryBackend implements Backend { } } - let indexEntry; + if (indexPos === undefined || indexPos === null) { + indexPos = forward ? indexData.minKey() : indexData.maxKey(); + } + + let indexEntry: IndexRecord | undefined; indexEntry = indexData.get(indexPos); if (!indexEntry) { const res = indexData.nextHigherPair(indexPos); @@ -756,22 +760,19 @@ export class MemoryBackend implements Backend { } } - if (!indexEntry) { - // We're out of luck, no more data! - return { count: 0, primaryKeys: [], indexKeys: [], values: [] }; - } - let primkeySubPos = 0; // Sort out the case where the index key is the same, so we have // to get the prev/next primary key if ( + indexEntry !== undefined && req.lastIndexPosition !== undefined && compareKeys(indexEntry.indexKey, req.lastIndexPosition) === 0 ) { let pos = forward ? 0 : indexEntry.primaryKeys.length - 1; + console.log("number of primary keys", indexEntry.primaryKeys.length); // Advance past the lastObjectStorePosition - while (pos >= 0 && pos < indexEntry.primaryKeys.length) { + do { const cmpResult = compareKeys( req.lastObjectStorePosition, indexEntry.primaryKeys[pos], @@ -780,7 +781,8 @@ export class MemoryBackend implements Backend { break; } pos += forward ? 1 : -1; - } + } while (pos >= 0 && pos < indexEntry.primaryKeys.length); + // Make sure we're at least at advancedPrimaryPos while ( primaryPos !== undefined && @@ -797,10 +799,12 @@ export class MemoryBackend implements Backend { pos += forward ? 1 : -1; } primkeySubPos = pos; - } else { + } else if (indexEntry !== undefined) { primkeySubPos = forward ? 0 : indexEntry.primaryKeys.length - 1; } + console.log("pos=", primkeySubPos); + while (1) { if (req.limit != 0 && numResults == req.limit) { break; @@ -811,14 +815,19 @@ export class MemoryBackend implements Backend { if (!range.includes(indexPos)) { break; } + if (indexEntry === undefined) { + break; + } if ( primkeySubPos < 0 || primkeySubPos >= indexEntry.primaryKeys.length ) { + console.log("moving subkey forward"); primkeySubPos = forward ? 0 : indexEntry.primaryKeys.length - 1; const res = indexData.nextHigherPair(indexPos); if (res) { indexPos = res[1].indexKey; + indexEntry = res[1]; } else { break; } @@ -866,10 +875,11 @@ export class MemoryBackend implements Backend { // Advance store position if we are either still at the last returned // store key, or if we are currently not on a key. const storeEntry = storeData.get(storePos); + console.log("store entry:", storeEntry); if ( !storeEntry || (req.lastObjectStorePosition !== undefined && - compareKeys(req.lastObjectStorePosition, storeEntry.primaryKey)) + compareKeys(req.lastObjectStorePosition, storePos) === 0) ) { storePos = storeData.nextHigherKey(storePos); } diff --git a/packages/idb-bridge/src/util/cmp.ts b/packages/idb-bridge/src/util/cmp.ts index 078c0a9bd..9d0dc99a2 100644 --- a/packages/idb-bridge/src/util/cmp.ts +++ b/packages/idb-bridge/src/util/cmp.ts @@ -39,8 +39,6 @@ const getType = (x: any) => { // https://w3c.github.io/IndexedDB/#compare-two-keys const compareKeys = (first: any, second: any): -1 | 0 | 1 => { - console.log("comparing keys", first, second); - if (second === undefined) { throw new TypeError(); } -- cgit v1.2.3