Skip to content

Commit dfcc0a4

Browse files
committed
Option to clear has_synced
1 parent 00897e1 commit dfcc0a4

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

crates/core/src/view_admin.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,10 @@ DELETE FROM ps_crud;
8686
DELETE FROM ps_untyped;
8787
DELETE FROM ps_updated_rows;
8888
DELETE FROM ps_kv WHERE key != 'client_id';
89-
DELETE FROM ps_sync_state;
9089
DELETE FROM ps_stream_subscriptions;
9190
",
9291
)?;
92+
clear_has_synced(local_db)?;
9393

9494
let table_glob = if flags.clear_local() {
9595
"ps_data_*"
@@ -155,14 +155,25 @@ fn trigger_resync(db: *mut sqlite::sqlite3, state: &DatabaseState) -> Result<(),
155155
Ok(Default::default())
156156
}
157157

158+
fn clear_has_synced(db: *mut sqlite::sqlite3) -> Result<(), PowerSyncError> {
159+
db.exec_safe("DELETE FROM ps_sync_state;")?;
160+
db.exec_safe("UPDATE ps_stream_subscriptions SET last_synced_at = NULL")?;
161+
Ok(())
162+
}
163+
158164
fn powersync_trigger_resync_impl(
159165
ctx: *mut sqlite::context,
160-
_args: &[*mut sqlite::value],
166+
args: &[*mut sqlite::value],
161167
) -> Result<String, PowerSyncError> {
162168
let local_db = ctx.db_handle();
163169
let state = unsafe { DatabaseState::from_context(&ctx) };
164170
trigger_resync(local_db, state)?;
165171

172+
let clear_progress = args[0].int() != 0;
173+
if clear_progress {
174+
clear_has_synced(local_db)?;
175+
}
176+
166177
Ok(Default::default())
167178
}
168179

@@ -243,7 +254,7 @@ pub fn register(db: *mut sqlite::sqlite3, state: Rc<DatabaseState>) -> Result<()
243254

244255
db.create_function_v2(
245256
"powersync_trigger_resync",
246-
0,
257+
1,
247258
sqlite::UTF8,
248259
Some(Rc::into_raw(state) as *mut c_void),
249260
Some(powersync_trigger_resync),

dart/test/sync_test.dart

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ void _syncTests<T>({
433433
invokeControl('start', null);
434434

435435
expect(
436-
() => db.select('SELECT powersync_trigger_resync()'),
436+
() => db.select('SELECT powersync_trigger_resync(1)'),
437437
throwsA(
438438
isSqliteException(
439439
3091,
@@ -452,7 +452,7 @@ void _syncTests<T>({
452452
invokeControl('stop', null);
453453

454454
db.execute('delete from ps_data__items');
455-
db.execute('select powersync_trigger_resync()');
455+
db.execute('select powersync_trigger_resync(0)');
456456

457457
final instructions = invokeControl('start', null);
458458
expect(
@@ -477,6 +477,19 @@ void _syncTests<T>({
477477
{'id': 'row-0', 'col': 'hi'}
478478
]);
479479
});
480+
481+
test('can clear has synced', () {
482+
invokeControl('start', null);
483+
pushCheckpoint(buckets: [bucketDescription('a', count: 1)]);
484+
pushSyncData('a', '1', 'row-0', 'PUT', {'col': 'hi'});
485+
pushCheckpointComplete();
486+
invokeControl('stop', null);
487+
488+
db.execute('select powersync_trigger_resync(1)');
489+
final [row] = db.select('select powersync_offline_sync_status()');
490+
expect(json.decode(row.columnAt(0)),
491+
containsPair('priority_status', isEmpty));
492+
});
480493
});
481494

482495
test('persists download progress', () {

0 commit comments

Comments
 (0)