extra-disk-store 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +58 -82
  2. package/lib/converters/index-key-converter.d.ts +2 -2
  3. package/lib/converters/json-key-converter.d.ts +2 -2
  4. package/lib/converters/json-value-converter.d.ts +2 -2
  5. package/lib/converters/lz4-value-converter.d.ts +4 -4
  6. package/lib/converters/lz4-value-converter.js +4 -4
  7. package/lib/converters/lz4-value-converter.js.map +1 -1
  8. package/lib/converters/passthrough-key-converter.d.ts +2 -2
  9. package/lib/converters/passthrough-value-converter.d.ts +2 -2
  10. package/lib/converters/prefix-key-converter.d.ts +2 -9
  11. package/lib/converters/prefix-key-converter.js +2 -22
  12. package/lib/converters/prefix-key-converter.js.map +1 -1
  13. package/lib/converters/zstandard-value-converter.d.ts +4 -4
  14. package/lib/converters/zstandard-value-converter.js +4 -4
  15. package/lib/converters/zstandard-value-converter.js.map +1 -1
  16. package/lib/disk-store-view.d.ts +18 -8
  17. package/lib/disk-store-view.js +14 -11
  18. package/lib/disk-store-view.js.map +1 -1
  19. package/lib/disk-store-with-cache.d.ts +25 -0
  20. package/lib/disk-store-with-cache.js +65 -0
  21. package/lib/disk-store-with-cache.js.map +1 -0
  22. package/lib/disk-store.d.ts +12 -11
  23. package/lib/disk-store.js +36 -81
  24. package/lib/disk-store.js.map +1 -1
  25. package/lib/index.d.ts +2 -3
  26. package/lib/index.js +5 -3
  27. package/lib/index.js.map +1 -1
  28. package/lib/types.d.ts +7 -9
  29. package/package.json +11 -12
  30. package/lib/disk-store-async-view.d.ts +0 -14
  31. package/lib/disk-store-async-view.js +0 -39
  32. package/lib/disk-store-async-view.js.map +0 -1
  33. package/migrations/001-initial.sql +0 -19
  34. package/migrations/schema.sql +0 -7
package/README.md CHANGED
@@ -12,8 +12,8 @@ yarn add extra-disk-store
12
12
  ```ts
13
13
  import { DiskStore } from 'extra-disk-store'
14
14
 
15
- const store = await DiskStore.create('/tmp/store')
16
- store.set('key', Buffer.from('value'))
15
+ const store = new DiskStore('/tmp/store')
16
+ await store.set('key', Buffer.from('value'))
17
17
  const value = store.get('key')
18
18
  ```
19
19
 
@@ -21,148 +21,124 @@ const value = store.get('key')
21
21
  ### DiskStore
22
22
  ```ts
23
23
  class DiskStore {
24
- static create(filename?: string): Promise<DiskStore>
24
+ constructor(pathname: string)
25
25
 
26
- close(): void
26
+ close(): Promise<void>
27
27
 
28
28
  has(key: string): boolean
29
- get(key: string): {
30
- value: Buffer
31
- updatedAt: number
32
- timeToLive: number | null
33
- }
34
- set(key: string, value: Buffer): void
35
- delete(key: string): void
36
- clear(): void
29
+ get(key: string): Buffer | undefined
30
+ set(key: string, value: Buffer): Promise<void>
31
+ delete(key: string): Promise<void>
32
+ clear(): Promise<void>
33
+
37
34
  keys(): IterableIterator<string>
38
35
  }
39
36
  ```
40
37
 
41
- ### DiskStoreView
38
+ ### DiskStoreWithCache
42
39
  ```ts
43
- interface IKeyConverter<T> {
44
- toString: (value: T) => string
45
- fromString: (value: string) => T | undefined
46
- }
47
-
48
- interface IValueConverter<T> {
49
- toBuffer: (value: T) => Buffer
50
- fromBuffer: (value: Buffer) => T
40
+ interface ICache {
41
+ set(key: string, value: Buffer | boolean | undefined): void
42
+ get(key: string): Buffer | boolean | undefined
43
+ delete(key: string): void
44
+ clear(): void
51
45
  }
52
46
 
53
- class DiskStoreView<K, V> {
47
+ class DiskStoreWithCache {
54
48
  constructor(
55
- private store: DiskStore
56
- , private keyConverter: IKeyConverter<K>
57
- , private valueConverter: IValueConverter<V>
49
+ store: DiskStore
50
+ , cache: ICache
58
51
  )
59
52
 
60
- has(key: K): boolean
61
- get(key: K): V | undefined
62
- set(key: K, value: V): void
63
- clear(): void
64
- delete(key: K): void
65
- keys(): IterableIterator<K>
53
+ close(): Promise<void>
54
+
55
+ has(key: string): Promise<boolean>
56
+ get(key: string): Buffer | undefined
57
+ set(key: string, value: Buffer): Promise<void>
58
+ delete(key: string): Promise<void>
59
+ clear(): Promise<void>
60
+
61
+ keys(): IterableIterator<string>
66
62
  }
67
63
  ```
68
64
 
69
- ### DiskStoreAsyncView
65
+ ### DiskStoreView
70
66
  ```ts
71
- interface IKeyAsyncConverter<T> {
67
+ interface IKeyConverter<T> {
72
68
  toString: (value: T) => Awaitable<string>
73
69
  fromString: (value: string) => Awaitable<T | undefined>
74
70
  }
75
71
 
76
- interface IValueAsyncConverter<T> {
72
+ interface IValueConverter<T> {
77
73
  toBuffer: (value: T) => Awaitable<Buffer>
78
74
  fromBuffer: (value: Buffer) => Awaitable<T>
79
75
  }
80
76
 
81
- class DiskStoreAsyncView<K, V> {
77
+ class DiskStoreView<K, V> {
82
78
  constructor(
83
- store: DiskStore
84
- , keyConverter: IKeyAsyncConverter<K>
85
- , valueConverter: IValueAsyncConverter<V>
86
- )
79
+ store: DiskStore | DiskStoreWithCache
80
+ , keyConverter: IKeyConverter<K>
81
+ , valueConverter: IValueConverter<V>
82
+ ) {}
87
83
 
88
84
  has(key: K): Promise<boolean>
89
- get(key: K): Promise<V | undefined>
85
+ get(key: K): Promise<V | undefined>
90
86
  set(key: K, value: V): Promise<void>
91
87
  delete(key: K): Promise<void>
92
- clear(): void
93
- keys(): AsyncIterableIterator<K>
88
+ clear(): Promise<void>
89
+
90
+ keys(): IterableIterator<K>
94
91
  }
95
92
  ```
96
93
 
97
94
  ### Converters
98
- #### PassthroughKeyConverter
95
+ #### IndexKeyConverter
99
96
  ```ts
100
- class PassthroughKeyConverter implements IKeyConverter<string>, IKeyAsyncConverter<string>
97
+ class IndexKeyConverter implements IKeyConverter<number>
101
98
  ```
102
99
 
103
- #### PassthroughValueConverter
100
+ #### JSONKeyConverter
104
101
  ```ts
105
- class PassthroughValueConverter implements IValueConverter<Buffer>, IValueAsyncConverter<Buffer>
102
+ class JSONKeyConverter<T> implements IKeyConverter<T>
106
103
  ```
107
104
 
108
- #### IndexKeyConverter
105
+ #### JSONValueConverter
109
106
  ```ts
110
- class IndexKeyConverter implements IKeyConverter<number>, IKeyAsyncConverter<number> {
111
- constructor(radix: number = 10)
107
+ class JSONValueConverter<T> implements IValueConverter<T> {
108
+ constructor(encoding: BufferEncoding = 'utf-8')
112
109
  }
113
110
  ```
114
111
 
115
- #### JSONKeyConverter
112
+ #### PassthroughKeyConverter
116
113
  ```ts
117
- class JSONKeyConverter<T> implements IKeyConverter<T>, IKeyAsyncConverter<T>
114
+ class PassthroughKeyConverter implements IKeyConverter<string>
118
115
  ```
119
116
 
120
- #### JSONValueConverter
117
+ #### PassthroughValueConverter
121
118
  ```ts
122
- class JSONValueConverter<T> implements IValueConverter<T>, IValueAsyncConverter<T> {
123
- constructor(encoding: BufferEncoding = 'utf-8')
119
+ class PassthroughValueConverter implements IValueConverter<Buffer>
120
+ ```
121
+
122
+ #### PrefixKeyConverter
123
+ ```ts
124
+ class PrefixKeyConverter<T> implements IKeyConverter<T> {
125
+ constructor(keyConverter: IKeyConverter<T>, prefix: string)
124
126
  }
125
127
  ```
126
128
 
127
129
  #### LZ4ValueConverter
128
130
  ```ts
129
- class LZ4ValueConverter<T> implements IValueConverter<T>, IValueAsyncConverter<T> {
131
+ class LZ4ValueConverter<T> implements IValueConverter<T> {
130
132
  constructor(valueConverter: IValueConverter<T>)
131
133
  }
132
134
  ```
133
135
 
134
136
  #### ZstandardValueConverter
135
137
  ```ts
136
- class ZstandardValueConverter<T> implements IValueConverter<T>, IValueAsyncConverter<T> {
138
+ class ZstandardValueConverter<T> implements IValueConverter<T> {
137
139
  static create<T>(
138
140
  valueConverter: IValueConverter<T>
139
141
  , level: number
140
142
  ): Promise<ZstandardValueConverter<T>>
141
143
  }
142
144
  ```
143
-
144
- #### PrefixKeyConverter
145
- ```ts
146
- class PrefixKeyConverter<T> implements IKeyConverter<T>, IKeyAsyncConverter<T> {
147
- constructor(
148
- keyConverter: IKeyConverter<T>
149
- , prefix: string
150
- )
151
-
152
- toString(value: T): string
153
- fromString(value: string): T
154
- }
155
- ```
156
-
157
- #### PrefixKeyAsyncConverter
158
- ```ts
159
- class PrefixKeyAsyncConverter<T> implements IKeyAsyncConverter<T> {
160
- constructor(
161
- keyConverter: IKeyConverter<T> | IKeyAsyncConverter<T>
162
- , prefix: string
163
- )
164
-
165
- toString(value: T): Promise<string>
166
- fromString(value: string): Promise<T>
167
- }
168
- ```
@@ -1,5 +1,5 @@
1
- import { IKeyConverter, IKeyAsyncConverter } from "../types";
2
- export declare class IndexKeyConverter implements IKeyConverter<number>, IKeyAsyncConverter<number> {
1
+ import { IKeyConverter } from "../types";
2
+ export declare class IndexKeyConverter implements IKeyConverter<number> {
3
3
  private radix;
4
4
  constructor(radix?: number);
5
5
  toString(value: number): string;
@@ -1,5 +1,5 @@
1
- import { IKeyConverter, IKeyAsyncConverter } from "../types";
2
- export declare class JSONKeyConverter<T> implements IKeyConverter<T>, IKeyAsyncConverter<T> {
1
+ import { IKeyConverter } from "../types";
2
+ export declare class JSONKeyConverter<T> implements IKeyConverter<T> {
3
3
  fromString(value: string): T;
4
4
  toString(value: T): string;
5
5
  }
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
- import { IValueConverter, IValueAsyncConverter } from "../types";
3
- export declare class JSONValueConverter<T> implements IValueConverter<T>, IValueAsyncConverter<T> {
2
+ import { IValueConverter } from "../types";
3
+ export declare class JSONValueConverter<T> implements IValueConverter<T> {
4
4
  private encoding;
5
5
  constructor(encoding?: BufferEncoding);
6
6
  fromBuffer(buffer: Buffer): T;
@@ -1,8 +1,8 @@
1
1
  /// <reference types="node" />
2
- import { IValueConverter, IValueAsyncConverter } from "../types";
3
- export declare class LZ4ValueConverter<T> implements IValueConverter<T>, IValueAsyncConverter<T> {
2
+ import { IValueConverter } from "../types";
3
+ export declare class LZ4ValueConverter<T> implements IValueConverter<T> {
4
4
  private valueConverter;
5
5
  constructor(valueConverter: IValueConverter<T>);
6
- toBuffer(value: T): Buffer;
7
- fromBuffer(value: Buffer): T;
6
+ toBuffer(value: T): Promise<Buffer>;
7
+ fromBuffer(value: Buffer): Promise<T>;
8
8
  }
@@ -29,13 +29,13 @@ class LZ4ValueConverter {
29
29
  constructor(valueConverter) {
30
30
  this.valueConverter = valueConverter;
31
31
  }
32
- toBuffer(value) {
33
- const buffer = this.valueConverter.toBuffer(value);
32
+ async toBuffer(value) {
33
+ const buffer = await this.valueConverter.toBuffer(value);
34
34
  return Buffer.from(lz4.compress(buffer));
35
35
  }
36
- fromBuffer(value) {
36
+ async fromBuffer(value) {
37
37
  const buffer = Buffer.from(lz4.decompress(value));
38
- return this.valueConverter.fromBuffer(buffer);
38
+ return await this.valueConverter.fromBuffer(buffer);
39
39
  }
40
40
  }
41
41
  exports.LZ4ValueConverter = LZ4ValueConverter;
@@ -1 +1 @@
1
- {"version":3,"file":"lz4-value-converter.js","sourceRoot":"","sources":["../../src/converters/lz4-value-converter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAAsC;AAGtC,MAAa,iBAAiB;IAC5B,YACU,cAAkC;QAAlC,mBAAc,GAAd,cAAc,CAAoB;IACzC,CAAC;IAEJ,QAAQ,CAAC,KAAQ;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAClD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1C,CAAC;IAED,UAAU,CAAC,KAAa;QACtB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;QACjD,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC/C,CAAC;CACF;AAdD,8CAcC"}
1
+ {"version":3,"file":"lz4-value-converter.js","sourceRoot":"","sources":["../../src/converters/lz4-value-converter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAAsC;AAGtC,MAAa,iBAAiB;IAC5B,YACU,cAAkC;QAAlC,mBAAc,GAAd,cAAc,CAAoB;IACzC,CAAC;IAEJ,KAAK,CAAC,QAAQ,CAAC,KAAQ;QACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACxD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;QACjD,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACrD,CAAC;CACF;AAdD,8CAcC"}
@@ -1,5 +1,5 @@
1
- import { IKeyConverter, IKeyAsyncConverter } from "../types";
2
- export declare class PassthroughKeyConverter implements IKeyConverter<string>, IKeyAsyncConverter<string> {
1
+ import { IKeyConverter } from "../types";
2
+ export declare class PassthroughKeyConverter implements IKeyConverter<string> {
3
3
  toString(value: string): string;
4
4
  fromString(value: string): string;
5
5
  }
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
- import { IValueConverter, IValueAsyncConverter } from "../types";
3
- export declare class PassthroughValueConverter implements IValueConverter<Buffer>, IValueAsyncConverter<Buffer> {
2
+ import { IValueConverter } from "../types";
3
+ export declare class PassthroughValueConverter implements IValueConverter<Buffer> {
4
4
  toBuffer(value: Buffer): Buffer;
5
5
  fromBuffer(value: Buffer): Buffer;
6
6
  }
@@ -1,15 +1,8 @@
1
- import { IKeyConverter, IKeyAsyncConverter } from "../types";
2
- export declare class PrefixKeyConverter<T> implements IKeyConverter<T>, IKeyAsyncConverter<T> {
1
+ import { IKeyConverter } from "../types";
2
+ export declare class PrefixKeyConverter<T> implements IKeyConverter<T> {
3
3
  private keyConverter;
4
4
  private prefix;
5
5
  constructor(keyConverter: IKeyConverter<T>, prefix: string);
6
- toString(value: T): string;
7
- fromString(value: string): T | undefined;
8
- }
9
- export declare class PrefixKeyAsyncConverter<T> implements IKeyAsyncConverter<T> {
10
- private keyConverter;
11
- private prefix;
12
- constructor(keyConverter: IKeyConverter<T> | IKeyAsyncConverter<T>, prefix: string);
13
6
  toString(value: T): Promise<string>;
14
7
  fromString(value: string): Promise<T | undefined>;
15
8
  }
@@ -1,27 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PrefixKeyAsyncConverter = exports.PrefixKeyConverter = void 0;
3
+ exports.PrefixKeyConverter = void 0;
4
4
  class PrefixKeyConverter {
5
- constructor(keyConverter, prefix) {
6
- this.keyConverter = keyConverter;
7
- this.prefix = prefix;
8
- }
9
- toString(value) {
10
- const key = this.keyConverter.toString(value);
11
- return this.prefix + key;
12
- }
13
- fromString(value) {
14
- if (value.startsWith(this.prefix)) {
15
- const key = this.keyConverter.fromString(value.slice(this.prefix.length));
16
- return key;
17
- }
18
- else {
19
- return undefined;
20
- }
21
- }
22
- }
23
- exports.PrefixKeyConverter = PrefixKeyConverter;
24
- class PrefixKeyAsyncConverter {
25
5
  constructor(keyConverter, prefix) {
26
6
  this.keyConverter = keyConverter;
27
7
  this.prefix = prefix;
@@ -40,5 +20,5 @@ class PrefixKeyAsyncConverter {
40
20
  }
41
21
  }
42
22
  }
43
- exports.PrefixKeyAsyncConverter = PrefixKeyAsyncConverter;
23
+ exports.PrefixKeyConverter = PrefixKeyConverter;
44
24
  //# sourceMappingURL=prefix-key-converter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prefix-key-converter.js","sourceRoot":"","sources":["../../src/converters/prefix-key-converter.ts"],"names":[],"mappings":";;;AAEA,MAAa,kBAAkB;IAC7B,YACU,YAA8B,EAC9B,MAAc;QADd,iBAAY,GAAZ,YAAY,CAAkB;QAC9B,WAAM,GAAN,MAAM,CAAQ;IACrB,CAAC;IAEJ,QAAQ,CAAC,KAAQ;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC7C,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAA;IAC1B,CAAC;IAED,UAAU,CAAC,KAAa;QACtB,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;YACjC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;YACzE,OAAO,GAAG,CAAA;SACX;aAAM;YACL,OAAO,SAAS,CAAA;SACjB;IACH,CAAC;CACF;AAnBD,gDAmBC;AAED,MAAa,uBAAuB;IAClC,YACU,YAAsD,EACtD,MAAc;QADd,iBAAY,GAAZ,YAAY,CAA0C;QACtD,WAAM,GAAN,MAAM,CAAQ;IACrB,CAAC;IAEJ,KAAK,CAAC,QAAQ,CAAC,KAAQ;QACrB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACnD,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;YACjC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;YAC/E,OAAO,GAAG,CAAA;SACX;aAAM;YACL,OAAO,SAAS,CAAA;SACjB;IACH,CAAC;CACF;AAnBD,0DAmBC"}
1
+ {"version":3,"file":"prefix-key-converter.js","sourceRoot":"","sources":["../../src/converters/prefix-key-converter.ts"],"names":[],"mappings":";;;AAEA,MAAa,kBAAkB;IAC7B,YACU,YAA8B,EAC9B,MAAc;QADd,iBAAY,GAAZ,YAAY,CAAkB;QAC9B,WAAM,GAAN,MAAM,CAAQ;IACrB,CAAC;IAEJ,KAAK,CAAC,QAAQ,CAAC,KAAQ;QACrB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACnD,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;YACjC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;YAC/E,OAAO,GAAG,CAAA;SACX;aAAM;YACL,OAAO,SAAS,CAAA;SACjB;IACH,CAAC;CACF;AAnBD,gDAmBC"}
@@ -1,10 +1,10 @@
1
1
  /// <reference types="node" />
2
- import { IValueConverter, IValueAsyncConverter } from "../types";
3
- export declare class ZstandardValueConverter<T> implements IValueConverter<T>, IValueAsyncConverter<T> {
2
+ import { IValueConverter } from "../types";
3
+ export declare class ZstandardValueConverter<T> implements IValueConverter<T> {
4
4
  private valueConverter;
5
5
  private level;
6
6
  private constructor();
7
7
  static create<T>(valueConverter: IValueConverter<T>, level: number): Promise<ZstandardValueConverter<T>>;
8
- toBuffer(value: T): Buffer;
9
- fromBuffer(value: Buffer): T;
8
+ toBuffer(value: T): Promise<Buffer>;
9
+ fromBuffer(value: Buffer): Promise<T>;
10
10
  }
@@ -34,13 +34,13 @@ class ZstandardValueConverter {
34
34
  await zstd.init();
35
35
  return new ZstandardValueConverter(valueConverter, level);
36
36
  }
37
- toBuffer(value) {
38
- const buffer = this.valueConverter.toBuffer(value);
37
+ async toBuffer(value) {
38
+ const buffer = await this.valueConverter.toBuffer(value);
39
39
  return Buffer.from(zstd.compress(buffer, this.level));
40
40
  }
41
- fromBuffer(value) {
41
+ async fromBuffer(value) {
42
42
  const buffer = Buffer.from(zstd.decompress(value));
43
- return this.valueConverter.fromBuffer(buffer);
43
+ return await this.valueConverter.fromBuffer(buffer);
44
44
  }
45
45
  }
46
46
  exports.ZstandardValueConverter = ZstandardValueConverter;
@@ -1 +1 @@
1
- {"version":3,"file":"zstandard-value-converter.js","sourceRoot":"","sources":["../../src/converters/zstandard-value-converter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yDAA0C;AAG1C,MAAa,uBAAuB;IAClC,YACU,cAAkC,EAClC,KAAa;QADb,mBAAc,GAAd,cAAc,CAAoB;QAClC,UAAK,GAAL,KAAK,CAAQ;IACpB,CAAC;IAEJ,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,cAAkC,EAClC,KAAa;QAEb,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QACjB,OAAO,IAAI,uBAAuB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;IAC3D,CAAC;IAED,QAAQ,CAAC,KAAQ;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAClD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IACvD,CAAC;IAED,UAAU,CAAC,KAAa;QACtB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;QAClD,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC/C,CAAC;CACF;AAvBD,0DAuBC"}
1
+ {"version":3,"file":"zstandard-value-converter.js","sourceRoot":"","sources":["../../src/converters/zstandard-value-converter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yDAA0C;AAG1C,MAAa,uBAAuB;IAClC,YACU,cAAkC,EAClC,KAAa;QADb,mBAAc,GAAd,cAAc,CAAoB;QAClC,UAAK,GAAL,KAAK,CAAQ;IACpB,CAAC;IAEJ,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,cAAkC,EAClC,KAAa;QAEb,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QACjB,OAAO,IAAI,uBAAuB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;IAC3D,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAQ;QACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACxD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IACvD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;QAClD,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACrD,CAAC;CACF;AAvBD,0DAuBC"}
@@ -1,14 +1,24 @@
1
+ /// <reference types="node" />
1
2
  import { DiskStore } from "./disk-store";
2
- import { IKeyConverter, IValueConverter } from "./types";
3
+ import { DiskStoreWithCache } from "./disk-store-with-cache";
4
+ import { Awaitable } from '@blackglory/prelude';
5
+ export interface IKeyConverter<T> {
6
+ toString: (value: T) => Awaitable<string>;
7
+ fromString: (value: string) => Awaitable<T | undefined>;
8
+ }
9
+ export interface IValueConverter<T> {
10
+ toBuffer: (value: T) => Awaitable<Buffer>;
11
+ fromBuffer: (value: Buffer) => Awaitable<T>;
12
+ }
3
13
  export declare class DiskStoreView<K, V> {
4
14
  private store;
5
15
  private keyConverter;
6
16
  private valueConverter;
7
- constructor(store: DiskStore, keyConverter: IKeyConverter<K>, valueConverter: IValueConverter<V>);
8
- has(key: K): boolean;
9
- get(key: K): V | undefined;
10
- set(key: K, value: V): void;
11
- delete(key: K): void;
12
- clear(): void;
13
- keys(): IterableIterator<K>;
17
+ constructor(store: DiskStore | DiskStoreWithCache, keyConverter: IKeyConverter<K>, valueConverter: IValueConverter<V>);
18
+ has(key: K): Promise<boolean>;
19
+ get(key: K): Promise<V | undefined>;
20
+ set(key: K, value: V): Promise<void>;
21
+ delete(key: K): Promise<void>;
22
+ clear(): Promise<void>;
23
+ keys(): AsyncIterableIterator<K>;
14
24
  }
@@ -10,11 +10,11 @@ class DiskStoreView {
10
10
  this.keyConverter = keyConverter;
11
11
  this.valueConverter = valueConverter;
12
12
  }
13
- has(key) {
14
- return this.store.has(this.keyConverter.toString(key));
13
+ async has(key) {
14
+ return this.store.has(await this.keyConverter.toString(key));
15
15
  }
16
- get(key) {
17
- const buffer = this.store.get(this.keyConverter.toString(key));
16
+ async get(key) {
17
+ const buffer = this.store.get(await this.keyConverter.toString(key));
18
18
  if (buffer) {
19
19
  return this.valueConverter.fromBuffer(buffer);
20
20
  }
@@ -22,17 +22,20 @@ class DiskStoreView {
22
22
  return undefined;
23
23
  }
24
24
  }
25
- set(key, value) {
26
- this.store.set(this.keyConverter.toString(key), this.valueConverter.toBuffer(value));
25
+ async set(key, value) {
26
+ await this.store.set(...await Promise.all([
27
+ await this.keyConverter.toString(key),
28
+ await this.valueConverter.toBuffer(value)
29
+ ]));
27
30
  }
28
- delete(key) {
29
- this.store.delete(this.keyConverter.toString(key));
31
+ async delete(key) {
32
+ await this.store.delete(await this.keyConverter.toString(key));
30
33
  }
31
- clear() {
32
- this.store.clear();
34
+ async clear() {
35
+ await this.store.clear();
33
36
  }
34
37
  keys() {
35
- return (0, extra_utils_1.pipe)(this.store.keys(), iter => (0, iterable_operator_1.map)(iter, key => this.keyConverter.fromString(key)), iter => (0, iterable_operator_1.filter)(iter, prelude_1.isntUndefined));
38
+ return (0, extra_utils_1.pipe)(this.store.keys(), iter => (0, iterable_operator_1.mapAsync)(iter, async (key) => await this.keyConverter.fromString(key)), iter => (0, iterable_operator_1.filterAsync)(iter, prelude_1.isntUndefined));
36
39
  }
37
40
  }
38
41
  exports.DiskStoreView = DiskStoreView;
@@ -1 +1 @@
1
- {"version":3,"file":"disk-store-view.js","sourceRoot":"","sources":["../src/disk-store-view.ts"],"names":[],"mappings":";;;AAEA,6CAAkC;AAClC,yDAA+C;AAC/C,iDAAmD;AAEnD,MAAa,aAAa;IACxB,YACU,KAAgB,EAChB,YAA8B,EAC9B,cAAkC;QAFlC,UAAK,GAAL,KAAK,CAAW;QAChB,iBAAY,GAAZ,YAAY,CAAkB;QAC9B,mBAAc,GAAd,cAAc,CAAoB;IACzC,CAAC;IAEJ,GAAG,CAAC,GAAM;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IACxD,CAAC;IAED,GAAG,CAAC,GAAM;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QAE9D,IAAI,MAAM,EAAE;YACV,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;SAC9C;aAAM;YACL,OAAO,SAAS,CAAA;SACjB;IACH,CAAC;IAED,GAAG,CAAC,GAAM,EAAE,KAAQ;QAClB,IAAI,CAAC,KAAK,CAAC,GAAG,CACZ,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAC/B,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CACpC,CAAA;IACH,CAAC;IAED,MAAM,CAAC,GAAM;QACX,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IACpD,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;IAED,IAAI;QACF,OAAO,IAAA,kBAAI,EACT,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EACjB,IAAI,CAAC,EAAE,CAAC,IAAA,uBAAG,EAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAC3D,IAAI,CAAC,EAAE,CAAC,IAAA,0BAAM,EAAC,IAAI,EAAE,uBAAa,CAAC,CACpC,CAAA;IACH,CAAC;CACF;AA3CD,sCA2CC"}
1
+ {"version":3,"file":"disk-store-view.js","sourceRoot":"","sources":["../src/disk-store-view.ts"],"names":[],"mappings":";;;AAEA,6CAAkC;AAClC,yDAAyD;AACzD,iDAA8D;AAY9D,MAAa,aAAa;IACxB,YACU,KAAqC,EACrC,YAA8B,EAC9B,cAAkC;QAFlC,UAAK,GAAL,KAAK,CAAgC;QACrC,iBAAY,GAAZ,YAAY,CAAkB;QAC9B,mBAAc,GAAd,cAAc,CAAoB;IACzC,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAC,GAAM;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IAC9D,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAM;QACd,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QAEpE,IAAI,MAAM,EAAE;YACV,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;SAC9C;aAAM;YACL,OAAO,SAAS,CAAA;SACjB;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAM,EAAE,KAAQ;QACxB,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAClB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACnB,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;YACrC,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC;SAC1C,CAAC,CACH,CAAA;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAM;QACjB,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IAChE,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IAC1B,CAAC;IAED,IAAI;QACF,OAAO,IAAA,kBAAI,EACT,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EACjB,IAAI,CAAC,EAAE,CAAC,IAAA,4BAAQ,EAAC,IAAI,EAAE,KAAK,EAAC,GAAG,EAAC,EAAE,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAC5E,IAAI,CAAC,EAAE,CAAC,IAAA,+BAAW,EAAC,IAAI,EAAE,uBAAa,CAAC,CACzC,CAAA;IACH,CAAC;CACF;AA7CD,sCA6CC"}
@@ -0,0 +1,25 @@
1
+ /// <reference types="node" />
2
+ import { DiskStore } from './disk-store';
3
+ export interface ICache {
4
+ set(key: string, value: Buffer | boolean | undefined): void;
5
+ get(key: string): Buffer | boolean | undefined;
6
+ delete(key: string): void;
7
+ clear(): void;
8
+ }
9
+ export declare enum CacheKeyType {
10
+ Exist = 0,
11
+ Value = 1
12
+ }
13
+ export declare class DiskStoreWithCache {
14
+ private store;
15
+ private cache;
16
+ constructor(store: DiskStore, cache: ICache);
17
+ close(): Promise<void>;
18
+ has(key: string): Promise<boolean>;
19
+ get(key: string): Buffer | undefined;
20
+ set(key: string, value: Buffer): Promise<void>;
21
+ delete(key: string): Promise<void>;
22
+ clear(): Promise<void>;
23
+ keys(): IterableIterator<string>;
24
+ }
25
+ export declare function createCacheKey(type: CacheKeyType, key: string): string;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCacheKey = exports.DiskStoreWithCache = exports.CacheKeyType = void 0;
4
+ const prelude_1 = require("@blackglory/prelude");
5
+ var CacheKeyType;
6
+ (function (CacheKeyType) {
7
+ CacheKeyType[CacheKeyType["Exist"] = 0] = "Exist";
8
+ CacheKeyType[CacheKeyType["Value"] = 1] = "Value";
9
+ })(CacheKeyType = exports.CacheKeyType || (exports.CacheKeyType = {}));
10
+ class DiskStoreWithCache {
11
+ constructor(store, cache) {
12
+ this.store = store;
13
+ this.cache = cache;
14
+ }
15
+ async close() {
16
+ await this.store.close();
17
+ }
18
+ async has(key) {
19
+ const cacheKey = createCacheKey(CacheKeyType.Exist, key);
20
+ const result = this.cache.get(cacheKey);
21
+ if ((0, prelude_1.isBoolean)(result)) {
22
+ return result;
23
+ }
24
+ else {
25
+ const result = this.store.has(key);
26
+ this.cache.set(cacheKey, result);
27
+ return result;
28
+ }
29
+ }
30
+ get(key) {
31
+ const cacheKey = createCacheKey(CacheKeyType.Value, key);
32
+ const result = this.cache.get(cacheKey);
33
+ if (result instanceof Buffer) {
34
+ return result;
35
+ }
36
+ else {
37
+ const result = this.store.get(key);
38
+ this.cache.set(cacheKey, result);
39
+ return result;
40
+ }
41
+ }
42
+ async set(key, value) {
43
+ var _a;
44
+ await this.store.set(key, value);
45
+ (_a = this.cache) === null || _a === void 0 ? void 0 : _a.delete(createCacheKey(CacheKeyType.Value, key));
46
+ }
47
+ async delete(key) {
48
+ await this.store.delete(key);
49
+ this.cache.delete(createCacheKey(CacheKeyType.Exist, key));
50
+ this.cache.delete(createCacheKey(CacheKeyType.Value, key));
51
+ }
52
+ async clear() {
53
+ await this.store.clear();
54
+ this.cache.clear();
55
+ }
56
+ keys() {
57
+ return this.store.keys();
58
+ }
59
+ }
60
+ exports.DiskStoreWithCache = DiskStoreWithCache;
61
+ function createCacheKey(type, key) {
62
+ return JSON.stringify([type, key]);
63
+ }
64
+ exports.createCacheKey = createCacheKey;
65
+ //# sourceMappingURL=disk-store-with-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disk-store-with-cache.js","sourceRoot":"","sources":["../src/disk-store-with-cache.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;AAU/C,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,iDAAK,CAAA;IACL,iDAAK,CAAA;AACP,CAAC,EAHW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAGvB;AAED,MAAa,kBAAkB;IAC7B,YACU,KAAgB,EAChB,KAAa;QADb,UAAK,GAAL,KAAK,CAAW;QAChB,UAAK,GAAL,KAAK,CAAQ;IACpB,CAAC;IAEJ,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,QAAQ,GAAG,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACvC,IAAI,IAAA,mBAAS,EAAC,MAAM,CAAC,EAAE;YACrB,OAAO,MAAM,CAAA;SACd;aAAM;YACL,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YAChC,OAAO,MAAM,CAAA;SACd;IACH,CAAC;IAED,GAAG,CAAC,GAAW;QACb,MAAM,QAAQ,GAAG,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACvC,IAAI,MAAM,YAAY,MAAM,EAAE;YAC5B,OAAO,MAAM,CAAA;SACd;aAAM;YACL,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YAChC,OAAO,MAAM,CAAA;SACd;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa;;QAClC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAEhC,MAAA,IAAI,CAAC,KAAK,0CAAE,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;IAC7D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAE5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;QAC1D,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;IAC5D,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QAExB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;IAC1B,CAAC;CACF;AAxDD,gDAwDC;AAED,SAAgB,cAAc,CAAC,IAAkB,EAAE,GAAW;IAC5D,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;AACpC,CAAC;AAFD,wCAEC"}
@@ -1,14 +1,15 @@
1
1
  /// <reference types="node" />
2
- import { Database as IDatabase } from 'better-sqlite3';
2
+ import LMDB from 'lmdb';
3
3
  export declare class DiskStore {
4
- _db: IDatabase;
5
- protected constructor(_db: IDatabase);
6
- static create(filename?: string): Promise<DiskStore>;
7
- close(): void;
8
- has: (key: string) => boolean;
9
- get: (key: string) => Buffer | undefined;
10
- set: (key: string, value: Buffer) => void;
11
- delete: (key: string) => void;
12
- clear: () => void;
13
- keys: () => IterableIterator<string>;
4
+ _db: LMDB.RootDatabase;
5
+ _pathname: string;
6
+ private isTempPathname;
7
+ constructor(pathname?: string);
8
+ close(): Promise<void>;
9
+ has(key: string): boolean;
10
+ get(key: string): Buffer | undefined;
11
+ set(key: string, value: Buffer): Promise<void>;
12
+ delete(key: string): Promise<void>;
13
+ clear(): Promise<void>;
14
+ keys(): IterableIterator<string>;
14
15
  }
package/lib/disk-store.js CHANGED
@@ -27,93 +27,48 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.DiskStore = void 0;
30
- const path_1 = __importDefault(require("path"));
31
- const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
32
- const migration_files_1 = require("migration-files");
33
- const better_sqlite3_migrations_1 = require("@blackglory/better-sqlite3-migrations");
34
- const prelude_1 = require("@blackglory/prelude");
35
- const extra_promise_1 = require("extra-promise");
36
- const extra_filesystem_1 = require("extra-filesystem");
37
30
  const Iter = __importStar(require("iterable-operator"));
38
- const extra_lazy_1 = require("extra-lazy");
31
+ const lmdb_1 = __importDefault(require("lmdb"));
32
+ const extra_filesystem_1 = require("extra-filesystem");
33
+ const prelude_1 = require("@blackglory/prelude");
39
34
  class DiskStore {
40
- constructor(_db) {
41
- this._db = _db;
42
- this.has = (0, extra_lazy_1.withLazyStatic)((key) => {
43
- const row = (0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
44
- SELECT EXISTS(
45
- SELECT *
46
- FROM store
47
- WHERE key = $key
48
- ) AS item_exists
49
- `), [this._db]).get({ key });
50
- return row.item_exists === 1;
51
- });
52
- this.get = (0, extra_lazy_1.withLazyStatic)((key) => {
53
- const row = (0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
54
- SELECT value
55
- FROM store
56
- WHERE key = $key
57
- `), [this._db]).get({ key });
58
- if ((0, prelude_1.isUndefined)(row))
59
- return undefined;
60
- return row.value;
61
- });
62
- this.set = (0, extra_lazy_1.withLazyStatic)((key, value) => {
63
- (0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
64
- INSERT INTO store (
65
- key
66
- , value
67
- )
68
- VALUES ($key, $value)
69
- ON CONFLICT(key)
70
- DO UPDATE SET value = $value
71
- `), [this._db]).run({ key, value });
72
- });
73
- this.delete = (0, extra_lazy_1.withLazyStatic)((key) => {
74
- (0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
75
- DELETE FROM store
76
- WHERE key = $key
77
- `), [this._db]).run({ key });
78
- });
79
- this.clear = (0, extra_lazy_1.withLazyStatic)(() => {
80
- (0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
81
- DELETE FROM store
82
- `), [this._db]).run();
83
- });
84
- this.keys = (0, extra_lazy_1.withLazyStatic)(() => {
85
- const iter = (0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
86
- SELECT key
87
- FROM store
88
- `), [this._db]).iterate();
89
- return Iter.map(iter, ({ key }) => key);
35
+ constructor(pathname) {
36
+ if ((0, prelude_1.isUndefined)(pathname)) {
37
+ this._pathname = (0, extra_filesystem_1.createTempNameSync)();
38
+ this.isTempPathname = true;
39
+ }
40
+ else {
41
+ this._pathname = pathname;
42
+ this.isTempPathname = false;
43
+ }
44
+ this._db = lmdb_1.default.open(this._pathname, {
45
+ encoding: 'binary',
46
+ compression: false
90
47
  });
91
48
  }
92
- static async create(filename) {
93
- const db = await (0, prelude_1.go)(async () => {
94
- const db = new better_sqlite3_1.default(filename !== null && filename !== void 0 ? filename : ':memory:');
95
- await migrateDatabase(db);
96
- db.unsafeMode(true);
97
- return db;
98
- });
99
- const diskStore = new this(db);
100
- return diskStore;
101
- async function migrateDatabase(db) {
102
- const packageFilename = await (0, extra_filesystem_1.findUpPackageFilename)(__dirname);
103
- (0, prelude_1.assert)(packageFilename, 'package.json not found');
104
- const packageRoot = path_1.default.dirname(packageFilename);
105
- const migrationsPath = path_1.default.join(packageRoot, 'migrations');
106
- const migrationFilenames = await (0, migration_files_1.findMigrationFilenames)(migrationsPath);
107
- const migrations = await (0, extra_promise_1.map)(migrationFilenames, migration_files_1.readMigrationFile);
108
- (0, better_sqlite3_migrations_1.migrate)(db, migrations);
49
+ async close() {
50
+ await this._db.close();
51
+ if (this.isTempPathname) {
52
+ await (0, extra_filesystem_1.remove)(this._pathname);
109
53
  }
110
54
  }
111
- close() {
112
- this._db.exec(`
113
- PRAGMA analysis_limit=400;
114
- PRAGMA optimize;
115
- `);
116
- this._db.close();
55
+ has(key) {
56
+ return this._db.doesExist(key);
57
+ }
58
+ get(key) {
59
+ return this._db.getBinary(key);
60
+ }
61
+ async set(key, value) {
62
+ await this._db.put(key, value);
63
+ }
64
+ async delete(key) {
65
+ await this._db.remove(key);
66
+ }
67
+ async clear() {
68
+ await this._db.clearAsync();
69
+ }
70
+ keys() {
71
+ return Iter.map(this._db.getKeys(), key => key);
117
72
  }
118
73
  }
119
74
  exports.DiskStore = DiskStore;
@@ -1 +1 @@
1
- {"version":3,"file":"disk-store.js","sourceRoot":"","sources":["../src/disk-store.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAuB;AACvB,oEAAgE;AAChE,qDAA2E;AAC3E,qFAA+D;AAC/D,iDAA6D;AAC7D,iDAAmC;AACnC,uDAAwD;AACxD,wDAAyC;AACzC,2CAAuD;AAEvD,MAAa,SAAS;IACpB,YAA6B,GAAc;QAAd,QAAG,GAAH,GAAG,CAAW;QAqC3C,QAAG,GAAG,IAAA,2BAAc,EAAC,CAAC,GAAW,EAAW,EAAE;YAC5C,MAAM,GAAG,GAA2B,IAAA,uBAAU,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;;;;;;KAMrE,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;YAE5B,OAAO,GAAG,CAAC,WAAW,KAAK,CAAC,CAAA;QAC9B,CAAC,CAAC,CAAA;QAEF,QAAG,GAAG,IAAA,2BAAc,EAAC,CAAC,GAAW,EAAsB,EAAE;YACvD,MAAM,GAAG,GAEO,IAAA,uBAAU,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;;;;KAIjD,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;YAC5B,IAAI,IAAA,qBAAW,EAAC,GAAG,CAAC;gBAAE,OAAO,SAAS,CAAA;YAEtC,OAAO,GAAG,CAAC,KAAK,CAAA;QAClB,CAAC,CAAC,CAAA;QAEF,QAAG,GAAG,IAAA,2BAAc,EAAC,CAAC,GAAW,EAAE,KAAa,EAAQ,EAAE;YACxD,IAAA,uBAAU,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;;;;;;;;KAQjC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;QACrC,CAAC,CAAC,CAAA;QAEF,WAAM,GAAG,IAAA,2BAAc,EAAC,CAAC,GAAW,EAAQ,EAAE;YAC5C,IAAA,uBAAU,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;;;KAGjC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;QAC9B,CAAC,CAAC,CAAA;QAEF,UAAK,GAAG,IAAA,2BAAc,EAAC,GAAS,EAAE;YAChC,IAAA,uBAAU,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;;KAEjC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;QACvB,CAAC,CAAC,CAAA;QAEF,SAAI,GAAG,IAAA,2BAAc,EAAC,GAA6B,EAAE;YACnD,MAAM,IAAI,GAA8B,IAAA,uBAAU,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;;;KAGzE,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;YAEzB,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;IA9F4C,CAAC;IAE/C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAiB;QACnC,MAAM,EAAE,GAAG,MAAM,IAAA,YAAE,EAAC,KAAK,IAAI,EAAE;YAC7B,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,UAAU,CAAC,CAAA;YAE/C,MAAM,eAAe,CAAC,EAAE,CAAC,CAAA;YACzB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;YAEnB,OAAO,EAAE,CAAA;QACX,CAAC,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAA;QAE9B,OAAO,SAAS,CAAA;QAEhB,KAAK,UAAU,eAAe,CAAC,EAAa;YAC1C,MAAM,eAAe,GAAG,MAAM,IAAA,wCAAqB,EAAC,SAAS,CAAC,CAAA;YAC9D,IAAA,gBAAM,EAAC,eAAe,EAAE,wBAAwB,CAAC,CAAA;YAEjD,MAAM,WAAW,GAAG,cAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;YACjD,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAA;YAC3D,MAAM,kBAAkB,GAAG,MAAM,IAAA,wCAAsB,EAAC,cAAc,CAAC,CAAA;YACvE,MAAM,UAAU,GAAG,MAAM,IAAA,mBAAG,EAAC,kBAAkB,EAAE,mCAAiB,CAAC,CAAA;YACnE,IAAA,mCAAO,EAAC,EAAE,EAAE,UAAU,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;;;KAGb,CAAC,CAAA;QAEF,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;IAClB,CAAC;CA4DF;AAhGD,8BAgGC"}
1
+ {"version":3,"file":"disk-store.js","sourceRoot":"","sources":["../src/disk-store.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wDAAyC;AACzC,gDAAuB;AACvB,uDAA6D;AAC7D,iDAAiD;AAEjD,MAAa,SAAS;IAKpB,YAAY,QAAiB;QAC3B,IAAI,IAAA,qBAAW,EAAC,QAAQ,CAAC,EAAE;YACzB,IAAI,CAAC,SAAS,GAAG,IAAA,qCAAkB,GAAE,CAAA;YACrC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;SAC3B;aAAM;YACL,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;YACzB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAA;SAC5B;QAED,IAAI,CAAC,GAAG,GAAG,cAAI,CAAC,IAAI,CAAiB,IAAI,CAAC,SAAS,EAAE;YACnD,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,KAAK;SACnB,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;QAEtB,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,MAAM,IAAA,yBAAM,EAAC,IAAI,CAAC,SAAS,CAAC,CAAA;SAC7B;IACH,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IAChC,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa;QAClC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;IAC7B,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,GAAa,CAAC,CAAA;IAC3D,CAAC;CACF;AAnDD,8BAmDC"}
package/lib/index.d.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  export * from './disk-store';
2
- export * from './disk-store-view';
3
- export * from './disk-store-async-view';
2
+ export { DiskStoreWithCache, ICache } from './disk-store-with-cache';
3
+ export { DiskStoreView, IKeyConverter, IValueConverter } from './disk-store-view';
4
4
  export * from './converters';
5
- export * from './types';
package/lib/index.js CHANGED
@@ -14,9 +14,11 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.DiskStoreView = exports.DiskStoreWithCache = void 0;
17
18
  __exportStar(require("./disk-store"), exports);
18
- __exportStar(require("./disk-store-view"), exports);
19
- __exportStar(require("./disk-store-async-view"), exports);
19
+ var disk_store_with_cache_1 = require("./disk-store-with-cache");
20
+ Object.defineProperty(exports, "DiskStoreWithCache", { enumerable: true, get: function () { return disk_store_with_cache_1.DiskStoreWithCache; } });
21
+ var disk_store_view_1 = require("./disk-store-view");
22
+ Object.defineProperty(exports, "DiskStoreView", { enumerable: true, get: function () { return disk_store_view_1.DiskStoreView; } });
20
23
  __exportStar(require("./converters"), exports);
21
- __exportStar(require("./types"), exports);
22
24
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA4B;AAC5B,oDAAiC;AACjC,0DAAuC;AACvC,+CAA4B;AAC5B,0CAAuB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+CAA4B;AAC5B,iEAAoE;AAA3D,2HAAA,kBAAkB,OAAA;AAC3B,qDAAiF;AAAxE,gHAAA,aAAa,OAAA;AACtB,+CAA4B"}
package/lib/types.d.ts CHANGED
@@ -1,18 +1,16 @@
1
1
  /// <reference types="node" />
2
2
  import { Awaitable } from '@blackglory/prelude';
3
- export interface IKeyConverter<T> {
4
- toString: (value: T) => string;
5
- fromString: (value: string) => T | undefined;
6
- }
7
- export interface IValueConverter<T> {
8
- toBuffer: (value: T) => Buffer;
9
- fromBuffer: (value: Buffer) => T;
3
+ export interface ICache {
4
+ set(key: string, value: Buffer | boolean | undefined): void;
5
+ get(key: string): Buffer | boolean | undefined;
6
+ delete(key: string): void;
7
+ clear(): void;
10
8
  }
11
- export interface IKeyAsyncConverter<T> {
9
+ export interface IKeyConverter<T> {
12
10
  toString: (value: T) => Awaitable<string>;
13
11
  fromString: (value: string) => Awaitable<T | undefined>;
14
12
  }
15
- export interface IValueAsyncConverter<T> {
13
+ export interface IValueConverter<T> {
16
14
  toBuffer: (value: T) => Awaitable<Buffer>;
17
15
  fromBuffer: (value: Buffer) => Awaitable<T>;
18
16
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "extra-disk-store",
3
- "version": "0.1.4",
3
+ "version": "0.2.0",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "files": [
@@ -26,6 +26,7 @@
26
26
  "clean": "rimraf lib",
27
27
  "build": "run-s build:*",
28
28
  "build:compile": "tsc --project tsconfig.build.json --target es2018 --outDir lib",
29
+ "bench": "ts-node --require tsconfig-paths/register benches/index.ts",
29
30
  "release": "standard-version"
30
31
  },
31
32
  "husky": {
@@ -38,35 +39,33 @@
38
39
  "@blackglory/jest-matchers": "^0.5.0",
39
40
  "@commitlint/cli": "^17.3.0",
40
41
  "@commitlint/config-conventional": "^17.3.0",
41
- "@types/better-sqlite3": "^7.6.2",
42
- "@types/jest": "^29.2.3",
42
+ "@types/jest": "^29.2.4",
43
43
  "@types/node": "14",
44
- "@typescript-eslint/eslint-plugin": "^5.45.0",
45
- "@typescript-eslint/parser": "^5.45.0",
44
+ "@typescript-eslint/eslint-plugin": "^5.45.1",
45
+ "@typescript-eslint/parser": "^5.45.1",
46
46
  "eslint": "^8.29.0",
47
47
  "husky": "^4.3.0",
48
48
  "jest": "^29.3.1",
49
49
  "npm-run-all": "^4.1.5",
50
+ "pretty-bytes": "5",
50
51
  "rimraf": "^3.0.2",
51
52
  "standard-version": "^9.5.0",
52
53
  "ts-jest": "^29.0.3",
54
+ "ts-node": "^10.9.1",
53
55
  "ts-patch": "^2.0.2",
56
+ "tsconfig-paths": "^4.1.1",
54
57
  "typescript": "4.8",
55
58
  "typescript-transform-paths": "^3.4.4"
56
59
  },
57
60
  "dependencies": {
58
- "@blackglory/better-sqlite3-migrations": "^0.1.16",
59
61
  "@blackglory/prelude": "^0.1.8",
60
- "@blackglory/types": "^1.4.0",
61
62
  "@bokuweb/zstd-wasm": "^0.0.17",
62
- "better-sqlite3": "^8.0.1",
63
+ "extra-benchmark": "^0.2.2",
63
64
  "extra-filesystem": "^0.4.8",
64
- "extra-lazy": "^1.3.1",
65
65
  "extra-promise": "^4.4.0",
66
- "extra-timers": "^0.2.5",
67
66
  "extra-utils": "^3.5.1",
68
67
  "iterable-operator": "^2.5.0",
69
- "lz4-wasm-nodejs": "^0.9.2",
70
- "migration-files": "^0.4.0"
68
+ "lmdb": "^2.7.3",
69
+ "lz4-wasm-nodejs": "^0.9.2"
71
70
  }
72
71
  }
@@ -1,14 +0,0 @@
1
- import { DiskStore } from "./disk-store";
2
- import { IKeyAsyncConverter, IValueAsyncConverter } from "./types";
3
- export declare class DiskStoreAsyncView<K, V> {
4
- private store;
5
- private keyConverter;
6
- private valueConverter;
7
- constructor(store: DiskStore, keyConverter: IKeyAsyncConverter<K>, valueConverter: IValueAsyncConverter<V>);
8
- has(key: K): Promise<boolean>;
9
- get(key: K): Promise<V | undefined>;
10
- set(key: K, value: V): Promise<void>;
11
- delete(key: K): Promise<void>;
12
- clear(): void;
13
- keys(): AsyncIterableIterator<K>;
14
- }
@@ -1,39 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DiskStoreAsyncView = void 0;
4
- const extra_utils_1 = require("extra-utils");
5
- const iterable_operator_1 = require("iterable-operator");
6
- const prelude_1 = require("@blackglory/prelude");
7
- class DiskStoreAsyncView {
8
- constructor(store, keyConverter, valueConverter) {
9
- this.store = store;
10
- this.keyConverter = keyConverter;
11
- this.valueConverter = valueConverter;
12
- }
13
- async has(key) {
14
- return this.store.has(await this.keyConverter.toString(key));
15
- }
16
- async get(key) {
17
- const buffer = this.store.get(await this.keyConverter.toString(key));
18
- if (buffer) {
19
- return await this.valueConverter.fromBuffer(buffer);
20
- }
21
- else {
22
- return undefined;
23
- }
24
- }
25
- async set(key, value) {
26
- this.store.set(await this.keyConverter.toString(key), await this.valueConverter.toBuffer(value));
27
- }
28
- async delete(key) {
29
- this.store.delete(await this.keyConverter.toString(key));
30
- }
31
- clear() {
32
- this.store.clear();
33
- }
34
- keys() {
35
- return (0, extra_utils_1.pipe)(this.store.keys(), iter => (0, iterable_operator_1.mapAsync)(iter, key => this.keyConverter.fromString(key)), iter => (0, iterable_operator_1.filterAsync)(iter, prelude_1.isntUndefined));
36
- }
37
- }
38
- exports.DiskStoreAsyncView = DiskStoreAsyncView;
39
- //# sourceMappingURL=disk-store-async-view.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"disk-store-async-view.js","sourceRoot":"","sources":["../src/disk-store-async-view.ts"],"names":[],"mappings":";;;AAEA,6CAAkC;AAClC,yDAAyD;AACzD,iDAAmD;AAEnD,MAAa,kBAAkB;IAC7B,YACU,KAAgB,EAChB,YAAmC,EACnC,cAAuC;QAFvC,UAAK,GAAL,KAAK,CAAW;QAChB,iBAAY,GAAZ,YAAY,CAAuB;QACnC,mBAAc,GAAd,cAAc,CAAyB;IAC9C,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAC,GAAM;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IAC9D,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAM;QACd,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QAEpE,IAAI,MAAM,EAAE;YACV,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;SACpD;aAAM;YACL,OAAO,SAAS,CAAA;SACjB;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAM,EAAE,KAAQ;QACxB,IAAI,CAAC,KAAK,CAAC,GAAG,CACZ,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EACrC,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC1C,CAAA;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAM;QACjB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IAC1D,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;IAED,IAAI;QACF,OAAO,IAAA,kBAAI,EACT,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EACjB,IAAI,CAAC,EAAE,CAAC,IAAA,4BAAQ,EAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAChE,IAAI,CAAC,EAAE,CAAC,IAAA,+BAAW,EAAC,IAAI,EAAE,uBAAa,CAAC,CACzC,CAAA;IACH,CAAC;CACF;AA3CD,gDA2CC"}
@@ -1,19 +0,0 @@
1
- --------------------------------------------------------------------------------
2
- -- Up
3
- --------------------------------------------------------------------------------
4
-
5
- -- 在WAL模式下, better-sqlite3可充分发挥性能
6
- PRAGMA journal_mode = WAL;
7
-
8
- CREATE TABLE store (
9
- key TEXT NOT NULL UNIQUE
10
- , value BLOB NOT NULL
11
- ) STRICT;
12
-
13
- --------------------------------------------------------------------------------
14
- -- Down
15
- --------------------------------------------------------------------------------
16
-
17
- PRAGMA journal_mode = DELETE;
18
-
19
- DROP TABLE store;
@@ -1,7 +0,0 @@
1
- -- 在WAL模式下, better-sqlite3可充分发挥性能
2
- PRAGMA journal_mode = WAL;
3
-
4
- CREATE TABLE store (
5
- key TEXT NOT NULL UNIQUE
6
- , value BLOB NOT NULL
7
- ) STRICT;