diff options
author | Florian Dold <florian@dold.me> | 2021-02-22 20:49:36 +0100 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2021-02-22 20:49:36 +0100 |
commit | f0d820d8c6492cc490e4128f744544999933146b (patch) | |
tree | 87b9361cba6f469e48b912804d076f8940a13736 /packages/idb-bridge/src/MemoryBackend.ts | |
parent | 3eced74a88de43ab9afe542fcce20a8db8e3fe60 (diff) | |
download | wallet-core-f0d820d8c6492cc490e4128f744544999933146b.tar.xz |
idb: fix 'prevunique' iteration and other bugs
Diffstat (limited to 'packages/idb-bridge/src/MemoryBackend.ts')
-rw-r--r-- | packages/idb-bridge/src/MemoryBackend.ts | 193 |
1 files changed, 103 insertions, 90 deletions
diff --git a/packages/idb-bridge/src/MemoryBackend.ts b/packages/idb-bridge/src/MemoryBackend.ts index 53355bf77..2317fb163 100644 --- a/packages/idb-bridge/src/MemoryBackend.ts +++ b/packages/idb-bridge/src/MemoryBackend.ts @@ -1137,127 +1137,140 @@ export class MemoryBackend implements Backend { let indexEntry: IndexRecord | undefined; indexEntry = indexData.get(indexPos); if (!indexEntry) { - const res = indexData.nextHigherPair(indexPos); + const res = forward + ? indexData.nextHigherPair(indexPos) + : indexData.nextLowerPair(indexPos); if (res) { indexEntry = res[1]; indexPos = indexEntry.indexKey; } } - 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; - this.enableTracing && - console.log("number of primary keys", indexEntry.primaryKeys.length); - this.enableTracing && console.log("start pos is", pos); - // Advance past the lastObjectStorePosition - do { - const cmpResult = compareKeys( - req.lastObjectStorePosition, - indexEntry.primaryKeys[pos], - ); - this.enableTracing && console.log("cmp result is", cmpResult); - if ((forward && cmpResult < 0) || (!forward && cmpResult > 0)) { + if (unique) { + while (1) { + if (req.limit != 0 && numResults == req.limit) { break; } - pos += forward ? 1 : -1; - this.enableTracing && console.log("now pos is", pos); - } while (pos >= 0 && pos < indexEntry.primaryKeys.length); - - // Make sure we're at least at advancedPrimaryPos - while ( - primaryPos !== undefined && - pos >= 0 && - pos < indexEntry.primaryKeys.length - ) { - const cmpResult = compareKeys( - primaryPos, - indexEntry.primaryKeys[pos], - ); - if ((forward && cmpResult <= 0) || (!forward && cmpResult >= 0)) { + if (indexPos === undefined) { + break; + } + if (!range.includes(indexPos)) { + break; + } + if (indexEntry === undefined) { break; } - pos += forward ? 1 : -1; - } - primkeySubPos = pos; - } else if (indexEntry !== undefined) { - primkeySubPos = forward ? 0 : indexEntry.primaryKeys.length - 1; - } - if (this.enableTracing) { - console.log("subPos=", primkeySubPos); - console.log("indexPos=", indexPos); - } + if ( + req.lastIndexPosition === null || + req.lastIndexPosition === undefined || + compareKeys(indexEntry.indexKey, req.lastIndexPosition) !== 0 + ) { + indexKeys.push(indexEntry.indexKey); + primaryKeys.push(indexEntry.primaryKeys[0]); + numResults++; + } - while (1) { - if (req.limit != 0 && numResults == req.limit) { - break; - } - if (indexPos === undefined) { - break; - } - if (!range.includes(indexPos)) { - break; - } - if (indexEntry === undefined) { - break; - } - if ( - primkeySubPos < 0 || - primkeySubPos >= indexEntry.primaryKeys.length - ) { const res: any = forward ? indexData.nextHigherPair(indexPos) : indexData.nextLowerPair(indexPos); if (res) { indexPos = res[1].indexKey; - indexEntry = res[1]; - primkeySubPos = forward ? 0 : indexEntry!.primaryKeys.length - 1; - continue; + indexEntry = res[1] as IndexRecord; } else { break; } } + } else { + let primkeySubPos = 0; - // Skip repeated index keys if unique results are requested. - let skip = false; - if (unique) { - if ( - indexKeys.length > 0 && - compareKeys( - indexEntry.indexKey, - indexKeys[indexKeys.length - 1], - ) === 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; + this.enableTracing && + console.log( + "number of primary keys", + indexEntry.primaryKeys.length, + ); + this.enableTracing && console.log("start pos is", pos); + // Advance past the lastObjectStorePosition + do { + const cmpResult = compareKeys( + req.lastObjectStorePosition, + indexEntry.primaryKeys[pos], + ); + this.enableTracing && console.log("cmp result is", cmpResult); + if ((forward && cmpResult < 0) || (!forward && cmpResult > 0)) { + break; + } + pos += forward ? 1 : -1; + this.enableTracing && console.log("now pos is", pos); + } while (pos >= 0 && pos < indexEntry.primaryKeys.length); + + // Make sure we're at least at advancedPrimaryPos + while ( + primaryPos !== undefined && + pos >= 0 && + pos < indexEntry.primaryKeys.length ) { - skip = true; + const cmpResult = compareKeys( + primaryPos, + indexEntry.primaryKeys[pos], + ); + if ((forward && cmpResult <= 0) || (!forward && cmpResult >= 0)) { + break; + } + pos += forward ? 1 : -1; + } + primkeySubPos = pos; + } else if (indexEntry !== undefined) { + primkeySubPos = forward ? 0 : indexEntry.primaryKeys.length - 1; + } + + if (this.enableTracing) { + console.log("subPos=", primkeySubPos); + console.log("indexPos=", indexPos); + } + + while (1) { + if (req.limit != 0 && numResults == req.limit) { + break; + } + if (indexPos === undefined) { + break; + } + if (!range.includes(indexPos)) { + break; + } + if (indexEntry === undefined) { + break; } if ( - req.lastIndexPosition !== undefined && - compareKeys(indexPos, req.lastIndexPosition) === 0 + primkeySubPos < 0 || + primkeySubPos >= indexEntry.primaryKeys.length ) { - skip = true; - } - } - if (!skip) { - if (this.enableTracing) { - console.log(`not skipping!, subPos=${primkeySubPos}`); + const res: any = forward + ? indexData.nextHigherPair(indexPos) + : indexData.nextLowerPair(indexPos); + if (res) { + indexPos = res[1].indexKey; + indexEntry = res[1]; + primkeySubPos = forward ? 0 : indexEntry!.primaryKeys.length - 1; + continue; + } else { + break; + } } indexKeys.push(indexEntry.indexKey); primaryKeys.push(indexEntry.primaryKeys[primkeySubPos]); numResults++; - } else { - if (this.enableTracing) { - console.log("skipping!"); - } + primkeySubPos += forward ? 1 : -1; } - primkeySubPos += forward ? 1 : -1; } // Now we can collect the values based on the primary keys, |