diff --git a/bindings/c/include/libsql.h b/bindings/c/include/libsql.h index 8178980466..7fdfb4b3c0 100644 --- a/bindings/c/include/libsql.h +++ b/bindings/c/include/libsql.h @@ -27,6 +27,11 @@ typedef struct libsql_stmt libsql_stmt; typedef const libsql_database *libsql_database_t; +typedef struct { + int frame_no; + int frames_synced; +} replicated; + typedef struct { const char *db_path; const char *primary_url; @@ -58,6 +63,8 @@ extern "C" { int libsql_sync(libsql_database_t db, const char **out_err_msg); +int libsql_sync2(libsql_database_t db, replicated *out_replicated, const char **out_err_msg); + int libsql_open_sync(const char *db_path, const char *primary_url, const char *auth_token, diff --git a/bindings/c/src/lib.rs b/bindings/c/src/lib.rs index 96e4effd2a..354fd1f706 100644 --- a/bindings/c/src/lib.rs +++ b/bindings/c/src/lib.rs @@ -11,7 +11,7 @@ use tokio::runtime::Runtime; use types::{ blob, libsql_connection, libsql_connection_t, libsql_database, libsql_database_t, libsql_row, libsql_row_t, libsql_rows, libsql_rows_future_t, libsql_rows_t, libsql_stmt, libsql_stmt_t, - stmt, + replicated, stmt, }; lazy_static! { @@ -46,6 +46,26 @@ pub unsafe extern "C" fn libsql_sync( } } +#[no_mangle] +pub unsafe extern "C" fn libsql_sync2( + db: libsql_database_t, + out_replicated: *mut replicated, + out_err_msg: *mut *const std::ffi::c_char, +) -> std::ffi::c_int { + let db = db.get_ref(); + match RT.block_on(db.sync()) { + Ok(replicated) => { + (*out_replicated).frame_no = replicated.frame_no().unwrap_or(0) as i32; + (*out_replicated).frames_synced = replicated.frames_synced() as i32; + 0 + } + Err(e) => { + set_err_msg(format!("Error syncing database: {e}"), out_err_msg); + 1 + } + } +} + #[no_mangle] pub unsafe extern "C" fn libsql_open_sync( db_path: *const std::ffi::c_char, diff --git a/bindings/c/src/types.rs b/bindings/c/src/types.rs index 9f818e28d4..5d9f0b517f 100644 --- a/bindings/c/src/types.rs +++ b/bindings/c/src/types.rs @@ -115,6 +115,12 @@ impl From<&mut libsql_connection> for libsql_connection_t { } } +#[repr(C)] +pub struct replicated { + pub frame_no: std::ffi::c_int, + pub frames_synced: std::ffi::c_int, +} + pub struct stmt { pub stmt: libsql::Statement, pub params: Vec,