@naturalcycles/db-lib 8.44.0 → 8.46.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/dist/adapter/inmemory/inMemory.db.js +1 -1
- package/dist/commondao/common.dao.js +3 -3
- package/dist/kv/commonKeyValueDao.d.ts +7 -2
- package/dist/kv/commonKeyValueDao.js +27 -0
- package/package.json +1 -1
- package/src/adapter/inmemory/inMemory.db.ts +1 -1
- package/src/commondao/common.dao.ts +4 -4
- package/src/kv/commonKeyValueDao.ts +35 -2
|
@@ -93,7 +93,7 @@ class InMemoryDB {
|
|
|
93
93
|
}
|
|
94
94
|
async deleteByIds(_table, ids, _opt) {
|
|
95
95
|
const table = this.cfg.tablesPrefix + _table;
|
|
96
|
-
this.data[table]
|
|
96
|
+
this.data[table] ||= {};
|
|
97
97
|
return ids
|
|
98
98
|
.map(id => {
|
|
99
99
|
const exists = !!this.data[table][id];
|
|
@@ -486,9 +486,6 @@ class CommonDao {
|
|
|
486
486
|
}
|
|
487
487
|
assignIdCreatedUpdated(obj, opt = {}) {
|
|
488
488
|
const now = Math.floor(Date.now() / 1000);
|
|
489
|
-
if (this.cfg.createId) {
|
|
490
|
-
obj.id ||= this.cfg.hooks.createNaturalId?.(obj) || this.cfg.hooks.createRandomId();
|
|
491
|
-
}
|
|
492
489
|
if (this.cfg.created) {
|
|
493
490
|
;
|
|
494
491
|
obj['created'] ||= obj['updated'] || now;
|
|
@@ -498,6 +495,9 @@ class CommonDao {
|
|
|
498
495
|
obj['updated'] =
|
|
499
496
|
opt.preserveUpdatedCreated && obj['updated'] ? obj['updated'] : now;
|
|
500
497
|
}
|
|
498
|
+
if (this.cfg.createId) {
|
|
499
|
+
obj.id ||= this.cfg.hooks.createNaturalId?.(obj) || this.cfg.hooks.createRandomId();
|
|
500
|
+
}
|
|
501
501
|
return obj;
|
|
502
502
|
}
|
|
503
503
|
// SAVE
|
|
@@ -3,7 +3,7 @@ import { KeyValueTuple } from '@naturalcycles/js-lib';
|
|
|
3
3
|
import { ReadableTyped } from '@naturalcycles/nodejs-lib';
|
|
4
4
|
import { CommonDaoLogLevel } from '../commondao/common.dao.model';
|
|
5
5
|
import { CommonDBCreateOptions } from '../db.model';
|
|
6
|
-
import { CommonKeyValueDB } from './commonKeyValueDB';
|
|
6
|
+
import { CommonKeyValueDB, KeyValueDBTuple } from './commonKeyValueDB';
|
|
7
7
|
export interface CommonKeyValueDaoCfg<T> {
|
|
8
8
|
db: CommonKeyValueDB;
|
|
9
9
|
table: string;
|
|
@@ -39,15 +39,20 @@ export declare class CommonKeyValueDao<T> {
|
|
|
39
39
|
createTable(opt?: CommonDBCreateOptions): Promise<void>;
|
|
40
40
|
create(input?: Partial<T>): T;
|
|
41
41
|
getById(id?: string): Promise<T | null>;
|
|
42
|
+
getByIdAsBuffer(id?: string): Promise<Buffer | null>;
|
|
42
43
|
requireById(id: string): Promise<T>;
|
|
44
|
+
requireByIdAsBuffer(id: string): Promise<Buffer>;
|
|
43
45
|
getByIdOrEmpty(id: string, part?: Partial<T>): Promise<T>;
|
|
44
46
|
patch(id: string, patch: Partial<T>): Promise<T>;
|
|
45
47
|
getByIds(ids: string[]): Promise<KeyValueTuple<string, T>[]>;
|
|
48
|
+
getByIdsAsBuffer(ids: string[]): Promise<KeyValueTuple<string, Buffer>[]>;
|
|
46
49
|
save(id: string, value: T): Promise<void>;
|
|
50
|
+
saveAsBuffer(id: string, value: Buffer): Promise<void>;
|
|
47
51
|
saveBatch(entries: KeyValueTuple<string, T>[]): Promise<void>;
|
|
52
|
+
saveBatchAsBuffer(entries: KeyValueDBTuple[]): Promise<void>;
|
|
48
53
|
deleteByIds(ids: string[]): Promise<void>;
|
|
49
54
|
deleteById(id: string): Promise<void>;
|
|
50
55
|
streamIds(limit?: number): ReadableTyped<string>;
|
|
51
|
-
streamValues(limit?: number): ReadableTyped<
|
|
56
|
+
streamValues(limit?: number): ReadableTyped<T>;
|
|
52
57
|
streamEntries(limit?: number): ReadableTyped<KeyValueTuple<string, T>>;
|
|
53
58
|
}
|
|
@@ -34,6 +34,12 @@ class CommonKeyValueDao {
|
|
|
34
34
|
const [r] = await this.getByIds([id]);
|
|
35
35
|
return r?.[1] || null;
|
|
36
36
|
}
|
|
37
|
+
async getByIdAsBuffer(id) {
|
|
38
|
+
if (!id)
|
|
39
|
+
return null;
|
|
40
|
+
const [r] = await this.cfg.db.getByIds(this.cfg.table, [id]);
|
|
41
|
+
return r?.[1] || null;
|
|
42
|
+
}
|
|
37
43
|
async requireById(id) {
|
|
38
44
|
const [r] = await this.getByIds([id]);
|
|
39
45
|
if (!r) {
|
|
@@ -46,6 +52,18 @@ class CommonKeyValueDao {
|
|
|
46
52
|
}
|
|
47
53
|
return r[1];
|
|
48
54
|
}
|
|
55
|
+
async requireByIdAsBuffer(id) {
|
|
56
|
+
const [r] = await this.cfg.db.getByIds(this.cfg.table, [id]);
|
|
57
|
+
if (!r) {
|
|
58
|
+
const { table } = this.cfg;
|
|
59
|
+
throw new js_lib_1.AppError(`DB row required, but not found: ${table}.${id}`, {
|
|
60
|
+
code: cnst_1.DBLibError.DB_ROW_REQUIRED,
|
|
61
|
+
table,
|
|
62
|
+
id,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return r[1];
|
|
66
|
+
}
|
|
49
67
|
async getByIdOrEmpty(id, part = {}) {
|
|
50
68
|
const [r] = await this.getByIds([id]);
|
|
51
69
|
if (r)
|
|
@@ -72,9 +90,15 @@ class CommonKeyValueDao {
|
|
|
72
90
|
await this.cfg.hooks.mapBufferToValue(buf),
|
|
73
91
|
]);
|
|
74
92
|
}
|
|
93
|
+
async getByIdsAsBuffer(ids) {
|
|
94
|
+
return await this.cfg.db.getByIds(this.cfg.table, ids);
|
|
95
|
+
}
|
|
75
96
|
async save(id, value) {
|
|
76
97
|
await this.saveBatch([[id, value]]);
|
|
77
98
|
}
|
|
99
|
+
async saveAsBuffer(id, value) {
|
|
100
|
+
await this.cfg.db.saveBatch(this.cfg.table, [[id, value]]);
|
|
101
|
+
}
|
|
78
102
|
async saveBatch(entries) {
|
|
79
103
|
let bufferEntries = [];
|
|
80
104
|
if (!this.cfg.hooks?.mapValueToBuffer) {
|
|
@@ -88,6 +112,9 @@ class CommonKeyValueDao {
|
|
|
88
112
|
}
|
|
89
113
|
await this.cfg.db.saveBatch(this.cfg.table, bufferEntries);
|
|
90
114
|
}
|
|
115
|
+
async saveBatchAsBuffer(entries) {
|
|
116
|
+
await this.cfg.db.saveBatch(this.cfg.table, entries);
|
|
117
|
+
}
|
|
91
118
|
async deleteByIds(ids) {
|
|
92
119
|
await this.cfg.db.deleteByIds(this.cfg.table, ids);
|
|
93
120
|
}
|
package/package.json
CHANGED
|
@@ -189,7 +189,7 @@ export class InMemoryDB implements CommonDB {
|
|
|
189
189
|
_opt?: CommonDBOptions,
|
|
190
190
|
): Promise<number> {
|
|
191
191
|
const table = this.cfg.tablesPrefix + _table
|
|
192
|
-
this.data[table]
|
|
192
|
+
this.data[table] ||= {}
|
|
193
193
|
|
|
194
194
|
return ids
|
|
195
195
|
.map(id => {
|
|
@@ -608,10 +608,6 @@ export class CommonDao<
|
|
|
608
608
|
assignIdCreatedUpdated(obj: DBM | BM | Unsaved<BM>, opt: CommonDaoOptions = {}): DBM | Saved<BM> {
|
|
609
609
|
const now = Math.floor(Date.now() / 1000)
|
|
610
610
|
|
|
611
|
-
if (this.cfg.createId) {
|
|
612
|
-
obj.id ||= this.cfg.hooks!.createNaturalId?.(obj as BM) || this.cfg.hooks!.createRandomId!()
|
|
613
|
-
}
|
|
614
|
-
|
|
615
611
|
if (this.cfg.created) {
|
|
616
612
|
;(obj as any)['created'] ||= (obj as any)['updated'] || now
|
|
617
613
|
}
|
|
@@ -621,6 +617,10 @@ export class CommonDao<
|
|
|
621
617
|
opt.preserveUpdatedCreated && (obj as any)['updated'] ? (obj as any)['updated'] : now
|
|
622
618
|
}
|
|
623
619
|
|
|
620
|
+
if (this.cfg.createId) {
|
|
621
|
+
obj.id ||= this.cfg.hooks!.createNaturalId?.(obj as BM) || this.cfg.hooks!.createRandomId!()
|
|
622
|
+
}
|
|
623
|
+
|
|
624
624
|
return obj as any
|
|
625
625
|
}
|
|
626
626
|
|
|
@@ -79,6 +79,12 @@ export class CommonKeyValueDao<T> {
|
|
|
79
79
|
return r?.[1] || null
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
async getByIdAsBuffer(id?: string): Promise<Buffer | null> {
|
|
83
|
+
if (!id) return null
|
|
84
|
+
const [r] = await this.cfg.db.getByIds(this.cfg.table, [id])
|
|
85
|
+
return r?.[1] || null
|
|
86
|
+
}
|
|
87
|
+
|
|
82
88
|
async requireById(id: string): Promise<T> {
|
|
83
89
|
const [r] = await this.getByIds([id])
|
|
84
90
|
|
|
@@ -94,6 +100,21 @@ export class CommonKeyValueDao<T> {
|
|
|
94
100
|
return r[1]
|
|
95
101
|
}
|
|
96
102
|
|
|
103
|
+
async requireByIdAsBuffer(id: string): Promise<Buffer> {
|
|
104
|
+
const [r] = await this.cfg.db.getByIds(this.cfg.table, [id])
|
|
105
|
+
|
|
106
|
+
if (!r) {
|
|
107
|
+
const { table } = this.cfg
|
|
108
|
+
throw new AppError(`DB row required, but not found: ${table}.${id}`, {
|
|
109
|
+
code: DBLibError.DB_ROW_REQUIRED,
|
|
110
|
+
table,
|
|
111
|
+
id,
|
|
112
|
+
})
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return r[1]
|
|
116
|
+
}
|
|
117
|
+
|
|
97
118
|
async getByIdOrEmpty(id: string, part: Partial<T> = {}): Promise<T> {
|
|
98
119
|
const [r] = await this.getByIds([id])
|
|
99
120
|
if (r) return r[1]
|
|
@@ -125,10 +146,18 @@ export class CommonKeyValueDao<T> {
|
|
|
125
146
|
])
|
|
126
147
|
}
|
|
127
148
|
|
|
149
|
+
async getByIdsAsBuffer(ids: string[]): Promise<KeyValueTuple<string, Buffer>[]> {
|
|
150
|
+
return await this.cfg.db.getByIds(this.cfg.table, ids)
|
|
151
|
+
}
|
|
152
|
+
|
|
128
153
|
async save(id: string, value: T): Promise<void> {
|
|
129
154
|
await this.saveBatch([[id, value]])
|
|
130
155
|
}
|
|
131
156
|
|
|
157
|
+
async saveAsBuffer(id: string, value: Buffer): Promise<void> {
|
|
158
|
+
await this.cfg.db.saveBatch(this.cfg.table, [[id, value]])
|
|
159
|
+
}
|
|
160
|
+
|
|
132
161
|
async saveBatch(entries: KeyValueTuple<string, T>[]): Promise<void> {
|
|
133
162
|
let bufferEntries: KeyValueDBTuple[] = []
|
|
134
163
|
|
|
@@ -144,6 +173,10 @@ export class CommonKeyValueDao<T> {
|
|
|
144
173
|
await this.cfg.db.saveBatch(this.cfg.table, bufferEntries)
|
|
145
174
|
}
|
|
146
175
|
|
|
176
|
+
async saveBatchAsBuffer(entries: KeyValueDBTuple[]): Promise<void> {
|
|
177
|
+
await this.cfg.db.saveBatch(this.cfg.table, entries)
|
|
178
|
+
}
|
|
179
|
+
|
|
147
180
|
async deleteByIds(ids: string[]): Promise<void> {
|
|
148
181
|
await this.cfg.db.deleteByIds(this.cfg.table, ids)
|
|
149
182
|
}
|
|
@@ -156,14 +189,14 @@ export class CommonKeyValueDao<T> {
|
|
|
156
189
|
return this.cfg.db.streamIds(this.cfg.table, limit)
|
|
157
190
|
}
|
|
158
191
|
|
|
159
|
-
streamValues(limit?: number): ReadableTyped<
|
|
192
|
+
streamValues(limit?: number): ReadableTyped<T> {
|
|
160
193
|
if (!this.cfg.hooks?.mapBufferToValue) {
|
|
161
194
|
return this.cfg.db.streamValues(this.cfg.table, limit)
|
|
162
195
|
}
|
|
163
196
|
|
|
164
197
|
// todo: consider it when readableMap supports `errorMode: SUPPRESS`
|
|
165
198
|
// readableMap(this.cfg.db.streamValues(this.cfg.table, limit), async buf => await this.cfg.hooks!.mapBufferToValue(buf))
|
|
166
|
-
const stream: ReadableTyped<
|
|
199
|
+
const stream: ReadableTyped<T> = this.cfg.db
|
|
167
200
|
.streamValues(this.cfg.table, limit)
|
|
168
201
|
.on('error', err => stream.emit('error', err))
|
|
169
202
|
.pipe(
|