Skip to content

Commit 10f2863

Browse files
committed
Implemented DBTransaction.clear
1 parent 8c9c520 commit 10f2863

File tree

3 files changed

+52
-9
lines changed

3 files changed

+52
-9
lines changed

src/DB.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,8 @@ class DB {
468468
}> {
469469
const dataDb = await this._level('data', db);
470470
const transactionsDb = await this._level('transactions', db);
471+
// Clear any dirty state in the transactions
472+
await transactionsDb.clear();
471473
return {
472474
dataDb,
473475
transactionsDb,

src/DBTransaction.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -117,15 +117,6 @@ class DBTransaction {
117117
return records;
118118
}
119119

120-
@ready(new dbErrors.ErrorDBTransactionDestroyed())
121-
public async count(domain: DBDomain = []): Promise<number> {
122-
let count = 0;
123-
for await (const _ of await this.iterator(undefined, domain)) {
124-
count++;
125-
}
126-
return count;
127-
}
128-
129120
public async iterator(
130121
options: AbstractIteratorOptions & { values: false },
131122
domain?: DBDomain,
@@ -268,6 +259,22 @@ class DBTransaction {
268259
return iterator;
269260
}
270261

262+
@ready(new dbErrors.ErrorDBTransactionDestroyed())
263+
public async clear(domain: DBDomain = []): Promise<void> {
264+
for await (const [k] of await this.iterator({ values: false }, domain)) {
265+
await this.del(domain, k);
266+
}
267+
}
268+
269+
@ready(new dbErrors.ErrorDBTransactionDestroyed())
270+
public async count(domain: DBDomain = []): Promise<number> {
271+
let count = 0;
272+
for await (const _ of await this.iterator({ values: false }, domain)) {
273+
count++;
274+
}
275+
return count;
276+
}
277+
271278
public async get<T>(
272279
domain: DBDomain,
273280
key: string | Buffer,

tests/DBTransaction.test.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,40 @@ describe(DBTransaction.name, () => {
8383
// Transaction state is cleared
8484
expect(await db.dump(db.transactionsDb)).toStrictEqual({});
8585
});
86+
test('transactional clear', async () => {
87+
await db.put([], '1', '1');
88+
await db.put([], '2', '2');
89+
await db.put([], '3', '3');
90+
await withF([db.transaction()], async ([tran]) => {
91+
await tran.clear();
92+
});
93+
expect(await db.dump()).toStrictEqual({});
94+
await db.clear();
95+
await db.put([], '1', '1');
96+
await db.put(['level1'], '2', '2');
97+
await db.put(['level1', 'level2'], '3', '3');
98+
await withF([db.transaction()], async ([tran]) => {
99+
await tran.clear(['level1']);
100+
});
101+
expect(await db.dump()).toStrictEqual({
102+
'1': '1',
103+
});
104+
});
105+
test('transactional count', async () => {
106+
await db.put([], '1', '1');
107+
await db.put([], '2', '2');
108+
await db.put([], '3', '3');
109+
await withF([db.transaction()], async ([tran]) => {
110+
expect(await tran.count()).toBe(3);
111+
});
112+
await db.clear();
113+
await db.put([], '1', '1');
114+
await db.put(['level1'], '2', '2');
115+
await db.put(['level1', 'level2'], '3', '3');
116+
await withF([db.transaction()], async ([tran]) => {
117+
expect(await tran.count(['level1'])).toBe(2);
118+
});
119+
});
86120
test('no dirty reads', async () => {
87121
await withF([db.transaction()], async ([tran1]) => {
88122
expect(await tran1.get([], 'hello')).toBeUndefined();

0 commit comments

Comments
 (0)