Skip to content

Commit 96f1a87

Browse files
feat: getCrudBatch default limit (#381)
1 parent de94f89 commit 96f1a87

File tree

3 files changed

+43
-3
lines changed

3 files changed

+43
-3
lines changed

.changeset/perfect-zebras-marry.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
'@powersync/common': patch
3+
'@powersync/web': patch
4+
'@powersync/react-native': patch
5+
---
6+
7+
Improved `getCrudBatch` to use a default limit of 100 CRUD entries.

packages/common/src/client/AbstractPowerSyncDatabase.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ export const DEFAULT_POWERSYNC_DB_OPTIONS = {
132132
crudUploadThrottleMs: DEFAULT_CRUD_UPLOAD_THROTTLE_MS
133133
};
134134

135+
export const DEFAULT_CRUD_BATCH_LIMIT = 100;
136+
135137
/**
136138
* Requesting nested or recursive locks can block the application in some circumstances.
137139
* This default lock timeout will act as a failsafe to throw an error if a lock cannot
@@ -492,7 +494,7 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
492494
* data by transaction. One batch may contain data from multiple transactions,
493495
* and a single transaction may be split over multiple batches.
494496
*/
495-
async getCrudBatch(limit: number): Promise<CrudBatch | null> {
497+
async getCrudBatch(limit: number = DEFAULT_CRUD_BATCH_LIMIT): Promise<CrudBatch | null> {
496498
const result = await this.getAll<CrudEntryJSON>(
497499
`SELECT id, tx_id, data FROM ${PSInternalTable.CRUD} ORDER BY id ASC LIMIT ?`,
498500
[limit + 1]

packages/web/tests/crud.test.ts

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
21
import { AbstractPowerSyncDatabase, Column, ColumnType, CrudEntry, Schema, Table, UpdateType } from '@powersync/common';
32
import { PowerSyncDatabase } from '@powersync/web';
3+
import pDefer from 'p-defer';
44
import { v4 as uuid } from 'uuid';
5+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
56
import { generateTestDb } from './utils/testDb';
6-
import pDefer from 'p-defer';
77

88
const testId = '2290de4f-0488-4e50-abed-f8e8eb1d0b42';
99

@@ -311,4 +311,35 @@ describe('CRUD Tests', () => {
311311
await txPromise;
312312
expect(await r).toEqual(null);
313313
});
314+
315+
it('CRUD Batch Limits', async () => {
316+
const initialBatch = await powersync.getCrudBatch();
317+
expect(initialBatch, 'Initial CRUD batch should be null').null;
318+
319+
/**
320+
* Create some items. Use Multiple transactions to demonstrate getCrudBatch does not
321+
* group by transaction.
322+
*/
323+
for (let i = 0; i < 2; i++) {
324+
await powersync.writeTransaction(async (tx) => {
325+
for (let j = 0; j < 51; j++) {
326+
await tx.execute(`INSERT INTO assets(id, description) VALUES(uuid(), ?)`, [`test-${i}-${j}`]);
327+
}
328+
});
329+
}
330+
331+
// This should contain CRUD entries for the first and second transaction
332+
const smallBatch = await powersync.getCrudBatch(55);
333+
expect(smallBatch, 'CRUD items should be present').exist;
334+
expect(smallBatch?.crud.length, 'Should only be 55 CRUD items').eq(55);
335+
expect(smallBatch?.haveMore, 'There should be more CRUD items pending').true;
336+
337+
const defaultBatch = await powersync.getCrudBatch();
338+
expect(defaultBatch?.crud.length, 'Should use default limit').eq(100);
339+
expect(defaultBatch?.haveMore, 'There should be more CRUD items pending').true;
340+
341+
const maxBatch = await powersync.getCrudBatch(1000);
342+
expect(maxBatch?.crud.length, 'Should contain all created CRUD items').eq(102);
343+
expect(maxBatch?.haveMore, 'There should not be any more pending CRUD items').false;
344+
});
314345
});

0 commit comments

Comments
 (0)