aboutsummaryrefslogtreecommitdiff
path: root/packages/idb-bridge/src/MemoryBackend.ts
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2019-06-23 22:16:03 +0200
committerFlorian Dold <florian.dold@gmail.com>2019-06-23 22:16:03 +0200
commit859a9e72e1e0431d729e429865d6272e2fb03ff7 (patch)
tree85c36750a947733d7fc93947557f2635799b5b0e /packages/idb-bridge/src/MemoryBackend.ts
parenta4e4125cca8644703d7cff527a39c1a5a9842eba (diff)
downloadwallet-core-859a9e72e1e0431d729e429865d6272e2fb03ff7.tar.gz
wallet-core-859a9e72e1e0431d729e429865d6272e2fb03ff7.tar.bz2
wallet-core-859a9e72e1e0431d729e429865d6272e2fb03ff7.zip
idb: more tests working
Diffstat (limited to 'packages/idb-bridge/src/MemoryBackend.ts')
-rw-r--r--packages/idb-bridge/src/MemoryBackend.ts103
1 files changed, 61 insertions, 42 deletions
diff --git a/packages/idb-bridge/src/MemoryBackend.ts b/packages/idb-bridge/src/MemoryBackend.ts
index 831974882..75e583a89 100644
--- a/packages/idb-bridge/src/MemoryBackend.ts
+++ b/packages/idb-bridge/src/MemoryBackend.ts
@@ -132,8 +132,11 @@ function nextStoreKey<T>(
return res[1].primaryKey;
}
-
-function furthestKey(forward: boolean, key1: Key | undefined, key2: Key | undefined) {
+function furthestKey(
+ forward: boolean,
+ key1: Key | undefined,
+ key2: Key | undefined,
+) {
if (key1 === undefined) {
return key2;
}
@@ -668,6 +671,7 @@ export class MemoryBackend implements Backend {
): Promise<RecordGetResponse> {
if (this.enableTracing) {
console.log(`TRACING: getRecords`);
+ console.log("query", req);
}
const myConn = this.connectionsByTransaction[btx.transactionCookie];
if (!myConn) {
@@ -687,15 +691,15 @@ export class MemoryBackend implements Backend {
let range;
if (req.range == null || req.range === undefined) {
- range = new BridgeIDBKeyRange(null, null, true, true);
+ range = new BridgeIDBKeyRange(undefined, undefined, true, true);
} else {
range = req.range;
}
let numResults = 0;
let indexKeys: Key[] = [];
- let primaryKeys = [];
- let values = [];
+ let primaryKeys: Key[] = [];
+ let values: Value[] = [];
const forward: boolean =
req.direction === "next" || req.direction === "nextunique";
@@ -797,8 +801,6 @@ export class MemoryBackend implements Backend {
primkeySubPos = forward ? 0 : indexEntry.primaryKeys.length - 1;
}
- // FIXME: filter out duplicates
-
while (1) {
if (req.limit != 0 && numResults == req.limit) {
break;
@@ -821,6 +823,16 @@ export class MemoryBackend implements Backend {
break;
}
}
+ if (
+ unique &&
+ indexKeys.length > 0 &&
+ compareKeys(indexEntry.indexKey, indexKeys[indexKeys.length - 1]) ===
+ 0
+ ) {
+ // We only return the first result if subsequent index keys are the same.
+ continue;
+ }
+ indexKeys.push(indexEntry.indexKey);
primaryKeys.push(indexEntry.primaryKeys[primkeySubPos]);
numResults++;
primkeySubPos = forward ? 0 : indexEntry.primaryKeys.length - 1;
@@ -850,48 +862,53 @@ export class MemoryBackend implements Backend {
storePos = furthestKey(forward, req.advancePrimaryKey, storePos);
- // 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);
- if (
- !storeEntry ||
- (req.lastObjectStorePosition !== undefined &&
- compareKeys(req.lastObjectStorePosition, storeEntry.primaryKey))
- ) {
- storePos = storeData.nextHigherKey(storePos);
+ if (storePos !== null && storePos !== undefined) {
+ // 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);
+ if (
+ !storeEntry ||
+ (req.lastObjectStorePosition !== undefined &&
+ compareKeys(req.lastObjectStorePosition, storeEntry.primaryKey))
+ ) {
+ storePos = storeData.nextHigherKey(storePos);
+ }
+ } else {
+ storePos = forward ? storeData.minKey() : storeData.maxKey();
+ console.log("setting starting store store pos to", storePos);
}
- if (req.lastObjectStorePosition)
- while (1) {
- if (req.limit != 0 && numResults == req.limit) {
- break;
- }
- if (storePos === null || storePos === undefined) {
- break;
- }
- if (!range.includes(storePos)) {
- break;
- }
+ while (1) {
+ if (req.limit != 0 && numResults == req.limit) {
+ break;
+ }
+ if (storePos === null || storePos === undefined) {
+ break;
+ }
+ if (!range.includes(storePos)) {
+ break;
+ }
- const res = storeData.get(storePos);
+ const res = storeData.get(storePos);
- if (!res) {
- break;
- }
+ if (res === undefined) {
+ break;
+ }
- if (req.resultLevel >= ResultLevel.OnlyKeys) {
- primaryKeys.push(res.primaryKey);
- }
+ if (req.resultLevel >= ResultLevel.OnlyKeys) {
+ primaryKeys.push(structuredClone(storePos));
+ }
- if (req.resultLevel >= ResultLevel.Full) {
- values.push(res.value);
- }
- numResults++;
- storePos = nextStoreKey(forward, storeData, storePos);
+ if (req.resultLevel >= ResultLevel.Full) {
+ values.push(res);
}
+
+ numResults++;
+ storePos = nextStoreKey(forward, storeData, storePos);
+ }
}
if (this.enableTracing) {
- console.log(`TRACING: getRecords got ${numResults} results`)
+ console.log(`TRACING: getRecords got ${numResults} results`);
}
return {
count: numResults,
@@ -962,7 +979,7 @@ export class MemoryBackend implements Backend {
}
}
- insertIntoIndex(
+ private insertIntoIndex(
index: Index,
primaryKey: Key,
value: Value,
@@ -987,7 +1004,9 @@ export class MemoryBackend implements Backend {
} else {
const newIndexRecord = {
indexKey: indexKey,
- primaryKeys: [primaryKey].concat(existingRecord.primaryKeys),
+ primaryKeys: [primaryKey]
+ .concat(existingRecord.primaryKeys)
+ .sort(compareKeys),
};
index.modifiedData = indexData.with(indexKey, newIndexRecord, true);
}