@@ -10,7 +10,7 @@ use powersync_sqlite_nostd as sqlite;
1010use powersync_sqlite_nostd:: { Connection , Context } ;
1111use sqlite:: { ResultCode , Value } ;
1212
13- use crate :: error:: PowerSyncError ;
13+ use crate :: error:: { PSResult , PowerSyncError } ;
1414use crate :: migrations:: { LATEST_VERSION , powersync_migrate} ;
1515use crate :: schema:: inspection:: ExistingView ;
1616use crate :: state:: DatabaseState ;
@@ -75,7 +75,7 @@ fn powersync_clear_impl(
7575 // speed up the next sync.
7676 local_db. exec_safe ( "DELETE FROM ps_oplog; DELETE FROM ps_buckets" ) ?;
7777 } else {
78- local_db . exec_safe ( "UPDATE ps_buckets SET last_applied_op = 0" ) ?;
78+ trigger_resync ( local_db , state ) ?;
7979 local_db. exec_safe ( "DELETE FROM ps_buckets WHERE name = '$local'" ) ?;
8080 }
8181
@@ -138,6 +138,41 @@ DELETE FROM {table};",
138138 Ok ( String :: from ( "" ) )
139139}
140140
141+ fn trigger_resync ( db : * mut sqlite:: sqlite3 , state : & DatabaseState ) -> Result < ( ) , PowerSyncError > {
142+ {
143+ let client = state. sync_client . borrow ( ) ;
144+ if let Some ( client) = client. as_ref ( )
145+ && client. has_sync_iteration ( )
146+ {
147+ return Err ( PowerSyncError :: argument_error (
148+ "Cannot clear or trigger resync while a sync iteration is active." ,
149+ ) ) ;
150+ }
151+ }
152+
153+ db. exec_safe ( "UPDATE ps_buckets SET last_applied_op = 0 WHERE name != '$local'" )
154+ . into_db_result ( db) ?;
155+ Ok ( Default :: default ( ) )
156+ }
157+
158+ fn powersync_trigger_resync_impl (
159+ ctx : * mut sqlite:: context ,
160+ _args : & [ * mut sqlite:: value ] ,
161+ ) -> Result < String , PowerSyncError > {
162+ let local_db = ctx. db_handle ( ) ;
163+ let state = unsafe { DatabaseState :: from_context ( & ctx) } ;
164+ trigger_resync ( local_db, state) ?;
165+
166+ Ok ( Default :: default ( ) )
167+ }
168+
169+ create_auto_tx_function ! ( powersync_trigger_resync_tx, powersync_trigger_resync_impl) ;
170+ create_sqlite_text_fn ! (
171+ powersync_trigger_resync,
172+ powersync_trigger_resync_tx,
173+ "powersync_trigger_resync"
174+ ) ;
175+
141176#[ derive( Clone , Copy ) ]
142177struct PowerSyncClearFlags ( i32 ) ;
143178
@@ -199,12 +234,23 @@ pub fn register(db: *mut sqlite::sqlite3, state: Rc<DatabaseState>) -> Result<()
199234 "powersync_clear" ,
200235 1 ,
201236 sqlite:: UTF8 ,
202- Some ( Rc :: into_raw ( state) as * mut c_void ) ,
237+ Some ( Rc :: into_raw ( state. clone ( ) ) as * mut c_void ) ,
203238 Some ( powersync_clear) ,
204239 None ,
205240 None ,
206241 Some ( DatabaseState :: destroy_rc) ,
207242 ) ?;
208243
244+ db. create_function_v2 (
245+ "powersync_trigger_resync" ,
246+ 0 ,
247+ sqlite:: UTF8 ,
248+ Some ( Rc :: into_raw ( state) as * mut c_void ) ,
249+ Some ( powersync_trigger_resync) ,
250+ None ,
251+ None ,
252+ Some ( DatabaseState :: destroy_rc) ,
253+ ) ?;
254+
209255 Ok ( ( ) )
210256}
0 commit comments