1
1
'use strict'
2
2
3
3
const { Buffer } = require ( 'buffer' )
4
+ const { openDB, deleteDB } = require ( 'idb' )
4
5
const { Key, Errors, utils } = require ( 'interface-datastore' )
5
6
const { filter, sortAll } = utils
6
7
7
- const { openDB, deleteDB } = require ( 'idb' )
8
-
9
8
function isStrictTypedArray ( arr ) {
10
9
return (
11
10
arr instanceof Int8Array ||
@@ -35,8 +34,18 @@ function typedarrayToBuffer (arr) {
35
34
}
36
35
}
37
36
37
+ function str2ab ( str ) {
38
+ var buf = new ArrayBuffer ( str . length )
39
+ var bufView = new Uint8Array ( buf )
40
+ for ( var i = 0 , strLen = str . length ; i < strLen ; i ++ ) {
41
+ bufView [ i ] = str . charCodeAt ( i )
42
+ }
43
+ return buf
44
+ }
45
+
38
46
const queryIt = async function * ( q , store , location ) {
39
- let cursor = await store . transaction ( location ) . store . openCursor ( )
47
+ const range = q . prefix ? self . IDBKeyRange . bound ( str2ab ( q . prefix ) , str2ab ( q . prefix + '\xFF' ) , false , true ) : undefined
48
+ let cursor = await store . transaction ( location ) . store . openCursor ( range )
40
49
let limit = 0
41
50
42
51
if ( cursor && q . offset && q . offset > 0 ) {
@@ -51,13 +60,11 @@ const queryIt = async function * (q, store, location) {
51
60
limit ++
52
61
53
62
const key = new Key ( Buffer . from ( cursor . key ) )
54
- const value = Buffer . from ( cursor . value )
55
- if ( ! q . prefix || ( q . prefix && key . toString ( ) . startsWith ( q . prefix ) ) ) {
56
- if ( q . keysOnly ) {
57
- yield { key }
58
- } else {
59
- yield { key, value }
60
- }
63
+ if ( q . keysOnly ) {
64
+ yield { key }
65
+ } else {
66
+ const value = Buffer . from ( cursor . value )
67
+ yield { key, value }
61
68
}
62
69
cursor = await cursor . continue ( )
63
70
}
@@ -163,7 +170,6 @@ class IdbDatastore {
163
170
if ( this . store === null ) {
164
171
throw new Error ( 'Datastore needs to be opened.' )
165
172
}
166
-
167
173
let it = queryIt ( q , this . store , this . location )
168
174
169
175
if ( Array . isArray ( q . filters ) ) {
0 commit comments