extra-disk-store 0.1.5 → 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.
- package/README.md +58 -89
- package/lib/converters/index-key-converter.d.ts +2 -2
- package/lib/converters/json-key-converter.d.ts +2 -2
- package/lib/converters/json-value-converter.d.ts +2 -2
- package/lib/converters/lz4-value-converter.d.ts +4 -4
- package/lib/converters/lz4-value-converter.js +4 -4
- package/lib/converters/lz4-value-converter.js.map +1 -1
- package/lib/converters/passthrough-key-converter.d.ts +2 -2
- package/lib/converters/passthrough-value-converter.d.ts +2 -2
- package/lib/converters/prefix-key-converter.d.ts +2 -9
- package/lib/converters/prefix-key-converter.js +2 -22
- package/lib/converters/prefix-key-converter.js.map +1 -1
- package/lib/converters/zstandard-value-converter.d.ts +4 -4
- package/lib/converters/zstandard-value-converter.js +4 -4
- package/lib/converters/zstandard-value-converter.js.map +1 -1
- package/lib/disk-store-view.d.ts +18 -8
- package/lib/disk-store-view.js +14 -11
- package/lib/disk-store-view.js.map +1 -1
- package/lib/disk-store-with-cache.d.ts +25 -0
- package/lib/disk-store-with-cache.js +65 -0
- package/lib/disk-store-with-cache.js.map +1 -0
- package/lib/disk-store.d.ts +10 -21
- package/lib/disk-store.js +31 -138
- package/lib/disk-store.js.map +1 -1
- package/lib/index.d.ts +3 -4
- package/lib/index.js +6 -6
- package/lib/index.js.map +1 -1
- package/lib/types.d.ts +1 -9
- package/package.json +8 -9
- package/lib/disk-store-async-view.d.ts +0 -14
- package/lib/disk-store-async-view.js +0 -39
- package/lib/disk-store-async-view.js.map +0 -1
- package/migrations/001-initial.sql +0 -19
- package/migrations/schema.sql +0 -7
package/README.md
CHANGED
|
@@ -12,164 +12,133 @@ yarn add extra-disk-store
|
|
|
12
12
|
```ts
|
|
13
13
|
import { DiskStore } from 'extra-disk-store'
|
|
14
14
|
|
|
15
|
-
const 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
|
|
|
20
20
|
## API
|
|
21
21
|
### DiskStore
|
|
22
22
|
```ts
|
|
23
|
-
interface ICache {
|
|
24
|
-
set(key: string, value: Buffer | boolean | undefined): void
|
|
25
|
-
get(key: string): Buffer | boolean | undefined
|
|
26
|
-
delete(key: string): void
|
|
27
|
-
clear(): void
|
|
28
|
-
}
|
|
29
|
-
|
|
30
23
|
class DiskStore {
|
|
31
|
-
|
|
24
|
+
constructor(pathname: string)
|
|
32
25
|
|
|
33
|
-
close(): void
|
|
26
|
+
close(): Promise<void>
|
|
34
27
|
|
|
35
28
|
has(key: string): boolean
|
|
36
|
-
get(key: string):
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
set(key: string, value: Buffer): void
|
|
42
|
-
delete(key: string): void
|
|
43
|
-
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
|
+
|
|
44
34
|
keys(): IterableIterator<string>
|
|
45
35
|
}
|
|
46
36
|
```
|
|
47
37
|
|
|
48
|
-
###
|
|
38
|
+
### DiskStoreWithCache
|
|
49
39
|
```ts
|
|
50
|
-
interface
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
interface IValueConverter<T> {
|
|
56
|
-
toBuffer: (value: T) => Buffer
|
|
57
|
-
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
|
|
58
45
|
}
|
|
59
46
|
|
|
60
|
-
class
|
|
47
|
+
class DiskStoreWithCache {
|
|
61
48
|
constructor(
|
|
62
|
-
|
|
63
|
-
,
|
|
64
|
-
, private valueConverter: IValueConverter<V>
|
|
49
|
+
store: DiskStore
|
|
50
|
+
, cache: ICache
|
|
65
51
|
)
|
|
66
52
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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>
|
|
73
62
|
}
|
|
74
63
|
```
|
|
75
64
|
|
|
76
|
-
###
|
|
65
|
+
### DiskStoreView
|
|
77
66
|
```ts
|
|
78
|
-
interface
|
|
67
|
+
interface IKeyConverter<T> {
|
|
79
68
|
toString: (value: T) => Awaitable<string>
|
|
80
69
|
fromString: (value: string) => Awaitable<T | undefined>
|
|
81
70
|
}
|
|
82
71
|
|
|
83
|
-
interface
|
|
72
|
+
interface IValueConverter<T> {
|
|
84
73
|
toBuffer: (value: T) => Awaitable<Buffer>
|
|
85
74
|
fromBuffer: (value: Buffer) => Awaitable<T>
|
|
86
75
|
}
|
|
87
76
|
|
|
88
|
-
class
|
|
77
|
+
class DiskStoreView<K, V> {
|
|
89
78
|
constructor(
|
|
90
|
-
store: DiskStore
|
|
91
|
-
, keyConverter:
|
|
92
|
-
, valueConverter:
|
|
93
|
-
)
|
|
79
|
+
store: DiskStore | DiskStoreWithCache
|
|
80
|
+
, keyConverter: IKeyConverter<K>
|
|
81
|
+
, valueConverter: IValueConverter<V>
|
|
82
|
+
) {}
|
|
94
83
|
|
|
95
84
|
has(key: K): Promise<boolean>
|
|
96
|
-
get(key: K): Promise<V | undefined>
|
|
85
|
+
get(key: K): Promise<V | undefined>
|
|
97
86
|
set(key: K, value: V): Promise<void>
|
|
98
87
|
delete(key: K): Promise<void>
|
|
99
|
-
clear(): void
|
|
100
|
-
|
|
88
|
+
clear(): Promise<void>
|
|
89
|
+
|
|
90
|
+
keys(): IterableIterator<K>
|
|
101
91
|
}
|
|
102
92
|
```
|
|
103
93
|
|
|
104
94
|
### Converters
|
|
105
|
-
####
|
|
95
|
+
#### IndexKeyConverter
|
|
106
96
|
```ts
|
|
107
|
-
class
|
|
97
|
+
class IndexKeyConverter implements IKeyConverter<number>
|
|
108
98
|
```
|
|
109
99
|
|
|
110
|
-
####
|
|
100
|
+
#### JSONKeyConverter
|
|
111
101
|
```ts
|
|
112
|
-
class
|
|
102
|
+
class JSONKeyConverter<T> implements IKeyConverter<T>
|
|
113
103
|
```
|
|
114
104
|
|
|
115
|
-
####
|
|
105
|
+
#### JSONValueConverter
|
|
116
106
|
```ts
|
|
117
|
-
class
|
|
118
|
-
constructor(
|
|
107
|
+
class JSONValueConverter<T> implements IValueConverter<T> {
|
|
108
|
+
constructor(encoding: BufferEncoding = 'utf-8')
|
|
119
109
|
}
|
|
120
110
|
```
|
|
121
111
|
|
|
122
|
-
####
|
|
112
|
+
#### PassthroughKeyConverter
|
|
123
113
|
```ts
|
|
124
|
-
class
|
|
114
|
+
class PassthroughKeyConverter implements IKeyConverter<string>
|
|
125
115
|
```
|
|
126
116
|
|
|
127
|
-
####
|
|
117
|
+
#### PassthroughValueConverter
|
|
128
118
|
```ts
|
|
129
|
-
class
|
|
130
|
-
|
|
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)
|
|
131
126
|
}
|
|
132
127
|
```
|
|
133
128
|
|
|
134
129
|
#### LZ4ValueConverter
|
|
135
130
|
```ts
|
|
136
|
-
class LZ4ValueConverter<T> implements IValueConverter<T
|
|
131
|
+
class LZ4ValueConverter<T> implements IValueConverter<T> {
|
|
137
132
|
constructor(valueConverter: IValueConverter<T>)
|
|
138
133
|
}
|
|
139
134
|
```
|
|
140
135
|
|
|
141
136
|
#### ZstandardValueConverter
|
|
142
137
|
```ts
|
|
143
|
-
class ZstandardValueConverter<T> implements IValueConverter<T
|
|
138
|
+
class ZstandardValueConverter<T> implements IValueConverter<T> {
|
|
144
139
|
static create<T>(
|
|
145
140
|
valueConverter: IValueConverter<T>
|
|
146
141
|
, level: number
|
|
147
142
|
): Promise<ZstandardValueConverter<T>>
|
|
148
143
|
}
|
|
149
144
|
```
|
|
150
|
-
|
|
151
|
-
#### PrefixKeyConverter
|
|
152
|
-
```ts
|
|
153
|
-
class PrefixKeyConverter<T> implements IKeyConverter<T>, IKeyAsyncConverter<T> {
|
|
154
|
-
constructor(
|
|
155
|
-
keyConverter: IKeyConverter<T>
|
|
156
|
-
, prefix: string
|
|
157
|
-
)
|
|
158
|
-
|
|
159
|
-
toString(value: T): string
|
|
160
|
-
fromString(value: string): T
|
|
161
|
-
}
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
#### PrefixKeyAsyncConverter
|
|
165
|
-
```ts
|
|
166
|
-
class PrefixKeyAsyncConverter<T> implements IKeyAsyncConverter<T> {
|
|
167
|
-
constructor(
|
|
168
|
-
keyConverter: IKeyConverter<T> | IKeyAsyncConverter<T>
|
|
169
|
-
, prefix: string
|
|
170
|
-
)
|
|
171
|
-
|
|
172
|
-
toString(value: T): Promise<string>
|
|
173
|
-
fromString(value: string): Promise<T>
|
|
174
|
-
}
|
|
175
|
-
```
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { IKeyConverter
|
|
2
|
-
export declare class IndexKeyConverter implements IKeyConverter<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
|
|
2
|
-
export declare class JSONKeyConverter<T> implements IKeyConverter<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
|
|
3
|
-
export declare class JSONValueConverter<T> implements IValueConverter<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
|
|
3
|
-
export declare class LZ4ValueConverter<T> implements IValueConverter<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;
|
|
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
|
|
2
|
-
export declare class PassthroughKeyConverter implements IKeyConverter<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
|
|
3
|
-
export declare class PassthroughValueConverter implements IValueConverter<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
|
|
2
|
-
export declare class PrefixKeyConverter<T> implements IKeyConverter<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.
|
|
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.
|
|
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,
|
|
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
|
|
3
|
-
export declare class ZstandardValueConverter<T> implements IValueConverter<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;
|
|
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"}
|
package/lib/disk-store-view.d.ts
CHANGED
|
@@ -1,14 +1,24 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
1
2
|
import { DiskStore } from "./disk-store";
|
|
2
|
-
import {
|
|
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():
|
|
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
|
}
|
package/lib/disk-store-view.js
CHANGED
|
@@ -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(
|
|
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.
|
|
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,
|
|
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"}
|
package/lib/disk-store.d.ts
CHANGED
|
@@ -1,26 +1,15 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import
|
|
3
|
-
import { ICache } from './types';
|
|
4
|
-
export declare enum CacheKeyType {
|
|
5
|
-
Exist = 0,
|
|
6
|
-
Value = 1
|
|
7
|
-
}
|
|
2
|
+
import LMDB from 'lmdb';
|
|
8
3
|
export declare class DiskStore {
|
|
9
|
-
_db:
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
close(): void
|
|
4
|
+
_db: LMDB.RootDatabase;
|
|
5
|
+
_pathname: string;
|
|
6
|
+
private isTempPathname;
|
|
7
|
+
constructor(pathname?: string);
|
|
8
|
+
close(): Promise<void>;
|
|
14
9
|
has(key: string): boolean;
|
|
15
|
-
private _has;
|
|
16
10
|
get(key: string): Buffer | undefined;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
private _delete;
|
|
22
|
-
clear(): void;
|
|
23
|
-
private _clear;
|
|
24
|
-
keys: () => IterableIterator<string>;
|
|
11
|
+
set(key: string, value: Buffer): Promise<void>;
|
|
12
|
+
delete(key: string): Promise<void>;
|
|
13
|
+
clear(): Promise<void>;
|
|
14
|
+
keys(): IterableIterator<string>;
|
|
25
15
|
}
|
|
26
|
-
export declare function createCacheKey(type: CacheKeyType, key: string): string;
|
package/lib/disk-store.js
CHANGED
|
@@ -26,157 +26,50 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.
|
|
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");
|
|
29
|
+
exports.DiskStore = void 0;
|
|
37
30
|
const Iter = __importStar(require("iterable-operator"));
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
CacheKeyType[CacheKeyType["Exist"] = 0] = "Exist";
|
|
42
|
-
CacheKeyType[CacheKeyType["Value"] = 1] = "Value";
|
|
43
|
-
})(CacheKeyType = exports.CacheKeyType || (exports.CacheKeyType = {}));
|
|
31
|
+
const lmdb_1 = __importDefault(require("lmdb"));
|
|
32
|
+
const extra_filesystem_1 = require("extra-filesystem");
|
|
33
|
+
const prelude_1 = require("@blackglory/prelude");
|
|
44
34
|
class DiskStore {
|
|
45
|
-
constructor(
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
return result;
|
|
58
|
-
});
|
|
59
|
-
this._get = (0, extra_lazy_1.withLazyStatic)((key) => {
|
|
60
|
-
const row = (0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
|
|
61
|
-
SELECT value
|
|
62
|
-
FROM store
|
|
63
|
-
WHERE key = $key
|
|
64
|
-
`), [this._db]).get({ key });
|
|
65
|
-
return (0, prelude_1.isUndefined)(row)
|
|
66
|
-
? undefined
|
|
67
|
-
: row.value;
|
|
68
|
-
});
|
|
69
|
-
this._set = (0, extra_lazy_1.withLazyStatic)((key, value) => {
|
|
70
|
-
(0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
|
|
71
|
-
INSERT INTO store (
|
|
72
|
-
key
|
|
73
|
-
, value
|
|
74
|
-
)
|
|
75
|
-
VALUES ($key, $value)
|
|
76
|
-
ON CONFLICT(key)
|
|
77
|
-
DO UPDATE SET value = $value
|
|
78
|
-
`), [this._db]).run({ key, value });
|
|
79
|
-
});
|
|
80
|
-
this._delete = (0, extra_lazy_1.withLazyStatic)((key) => {
|
|
81
|
-
(0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
|
|
82
|
-
DELETE FROM store
|
|
83
|
-
WHERE key = $key
|
|
84
|
-
`), [this._db]).run({ key });
|
|
85
|
-
});
|
|
86
|
-
this._clear = (0, extra_lazy_1.withLazyStatic)(() => {
|
|
87
|
-
(0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
|
|
88
|
-
DELETE FROM store
|
|
89
|
-
`), [this._db]).run();
|
|
90
|
-
});
|
|
91
|
-
this.keys = (0, extra_lazy_1.withLazyStatic)(() => {
|
|
92
|
-
const iter = (0, extra_lazy_1.lazyStatic)(() => this._db.prepare(`
|
|
93
|
-
SELECT key
|
|
94
|
-
FROM store
|
|
95
|
-
`), [this._db]).iterate();
|
|
96
|
-
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
|
|
97
47
|
});
|
|
98
48
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
await
|
|
103
|
-
db.unsafeMode(true);
|
|
104
|
-
return db;
|
|
105
|
-
});
|
|
106
|
-
const diskStore = new this(db, cache);
|
|
107
|
-
return diskStore;
|
|
108
|
-
async function migrateDatabase(db) {
|
|
109
|
-
const packageFilename = await (0, extra_filesystem_1.findUpPackageFilename)(__dirname);
|
|
110
|
-
(0, prelude_1.assert)(packageFilename, 'package.json not found');
|
|
111
|
-
const packageRoot = path_1.default.dirname(packageFilename);
|
|
112
|
-
const migrationsPath = path_1.default.join(packageRoot, 'migrations');
|
|
113
|
-
const migrationFilenames = await (0, migration_files_1.findMigrationFilenames)(migrationsPath);
|
|
114
|
-
const migrations = await (0, extra_promise_1.map)(migrationFilenames, migration_files_1.readMigrationFile);
|
|
115
|
-
(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);
|
|
116
53
|
}
|
|
117
54
|
}
|
|
118
|
-
close() {
|
|
119
|
-
this._db.exec(`
|
|
120
|
-
PRAGMA analysis_limit=400;
|
|
121
|
-
PRAGMA optimize;
|
|
122
|
-
`);
|
|
123
|
-
this._db.close();
|
|
124
|
-
}
|
|
125
55
|
has(key) {
|
|
126
|
-
|
|
127
|
-
const cacheKey = createCacheKey(CacheKeyType.Exist, key);
|
|
128
|
-
const result = this.cache.get(cacheKey);
|
|
129
|
-
if ((0, prelude_1.isBoolean)(result)) {
|
|
130
|
-
return result;
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
const result = this._has(key);
|
|
134
|
-
this.cache.set(cacheKey, result);
|
|
135
|
-
return result;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
return this._has(key);
|
|
140
|
-
}
|
|
56
|
+
return this._db.doesExist(key);
|
|
141
57
|
}
|
|
142
58
|
get(key) {
|
|
143
|
-
|
|
144
|
-
const cacheKey = createCacheKey(CacheKeyType.Value, key);
|
|
145
|
-
const result = this.cache.get(cacheKey);
|
|
146
|
-
if (result instanceof Buffer) {
|
|
147
|
-
return result;
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
const result = this._get(key);
|
|
151
|
-
this.cache.set(cacheKey, result);
|
|
152
|
-
return result;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
return this._get(key);
|
|
157
|
-
}
|
|
59
|
+
return this._db.getBinary(key);
|
|
158
60
|
}
|
|
159
|
-
set(key, value) {
|
|
160
|
-
|
|
161
|
-
this._set(key, value);
|
|
162
|
-
(_a = this.cache) === null || _a === void 0 ? void 0 : _a.delete(createCacheKey(CacheKeyType.Value, key));
|
|
61
|
+
async set(key, value) {
|
|
62
|
+
await this._db.put(key, value);
|
|
163
63
|
}
|
|
164
|
-
delete(key) {
|
|
165
|
-
this.
|
|
166
|
-
if (this.cache) {
|
|
167
|
-
this.cache.delete(createCacheKey(CacheKeyType.Exist, key));
|
|
168
|
-
this.cache.delete(createCacheKey(CacheKeyType.Value, key));
|
|
169
|
-
}
|
|
64
|
+
async delete(key) {
|
|
65
|
+
await this._db.remove(key);
|
|
170
66
|
}
|
|
171
|
-
clear() {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
67
|
+
async clear() {
|
|
68
|
+
await this._db.clearAsync();
|
|
69
|
+
}
|
|
70
|
+
keys() {
|
|
71
|
+
return Iter.map(this._db.getKeys(), key => key);
|
|
175
72
|
}
|
|
176
73
|
}
|
|
177
74
|
exports.DiskStore = DiskStore;
|
|
178
|
-
function createCacheKey(type, key) {
|
|
179
|
-
return JSON.stringify([type, key]);
|
|
180
|
-
}
|
|
181
|
-
exports.createCacheKey = createCacheKey;
|
|
182
75
|
//# sourceMappingURL=disk-store.js.map
|
package/lib/disk-store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disk-store.js","sourceRoot":"","sources":["../src/disk-store.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
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
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
1
|
+
export * from './disk-store';
|
|
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,11 +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.
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
exports.DiskStoreView = exports.DiskStoreWithCache = void 0;
|
|
18
|
+
__exportStar(require("./disk-store"), 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; } });
|
|
22
23
|
__exportStar(require("./converters"), exports);
|
|
23
|
-
__exportStar(require("./types"), exports);
|
|
24
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,
|
|
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
|
@@ -7,18 +7,10 @@ export interface ICache {
|
|
|
7
7
|
clear(): void;
|
|
8
8
|
}
|
|
9
9
|
export interface IKeyConverter<T> {
|
|
10
|
-
toString: (value: T) => string;
|
|
11
|
-
fromString: (value: string) => T | undefined;
|
|
12
|
-
}
|
|
13
|
-
export interface IValueConverter<T> {
|
|
14
|
-
toBuffer: (value: T) => Buffer;
|
|
15
|
-
fromBuffer: (value: Buffer) => T;
|
|
16
|
-
}
|
|
17
|
-
export interface IKeyAsyncConverter<T> {
|
|
18
10
|
toString: (value: T) => Awaitable<string>;
|
|
19
11
|
fromString: (value: string) => Awaitable<T | undefined>;
|
|
20
12
|
}
|
|
21
|
-
export interface
|
|
13
|
+
export interface IValueConverter<T> {
|
|
22
14
|
toBuffer: (value: T) => Awaitable<Buffer>;
|
|
23
15
|
fromBuffer: (value: Buffer) => Awaitable<T>;
|
|
24
16
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "extra-disk-store",
|
|
3
|
-
"version": "0.
|
|
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,7 +39,6 @@
|
|
|
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
42
|
"@types/jest": "^29.2.4",
|
|
43
43
|
"@types/node": "14",
|
|
44
44
|
"@typescript-eslint/eslint-plugin": "^5.45.1",
|
|
@@ -47,26 +47,25 @@
|
|
|
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
|
-
"
|
|
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
|
-
"
|
|
70
|
-
"
|
|
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;
|