@@ -4,9 +4,11 @@ use core::ffi::{c_int, c_void};
44use super :: streaming_sync:: SyncClient ;
55use super :: sync_status:: DownloadSyncStatus ;
66use crate :: constants:: SUBTYPE_JSON ;
7+ use crate :: create_sqlite_text_fn;
78use crate :: error:: PowerSyncError ;
89use crate :: schema:: Schema ;
910use crate :: state:: DatabaseState ;
11+ use crate :: sync:: storage_adapter:: StorageAdapter ;
1012use crate :: sync:: subscriptions:: { StreamKey , apply_subscriptions} ;
1113use alloc:: borrow:: Cow ;
1214use alloc:: boxed:: Box ;
@@ -285,5 +287,33 @@ pub fn register(db: *mut sqlite::sqlite3, state: Arc<DatabaseState>) -> Result<(
285287 Some ( destroy) ,
286288 ) ?;
287289
290+ db. create_function_v2 (
291+ "powersync_offline_sync_status" ,
292+ 0 ,
293+ sqlite:: UTF8 | sqlite:: DIRECTONLY | SQLITE_RESULT_SUBTYPE ,
294+ None ,
295+ Some ( powersync_offline_sync_status) ,
296+ None ,
297+ None ,
298+ None ,
299+ ) ?;
300+
288301 Ok ( ( ) )
289302}
303+
304+ fn powersync_offline_sync_status_impl (
305+ ctx : * mut sqlite:: context ,
306+ _args : & [ * mut sqlite:: value ] ,
307+ ) -> Result < String , PowerSyncError > {
308+ let adapter = StorageAdapter :: new ( ctx. db_handle ( ) ) ?;
309+ let state = adapter. offline_sync_state ( ) ?;
310+ let serialized = serde_json:: to_string ( & state) . map_err ( PowerSyncError :: internal) ?;
311+
312+ Ok ( serialized)
313+ }
314+
315+ create_sqlite_text_fn ! (
316+ powersync_offline_sync_status,
317+ powersync_offline_sync_status_impl,
318+ "powersync_offline_sync_status"
319+ ) ;
0 commit comments