From f471ad01a4a1f8de540952057cf6e860a55a70f3 Mon Sep 17 00:00:00 2001 From: Lucio Franco Date: Fri, 2 Aug 2024 13:23:10 -0700 Subject: [PATCH 1/2] c: add replicated data for sync This adds a new replicated struct that is output during sync for the C bindings. --- bindings/c/include/libsql.h | 7 ++++++- bindings/c/src/lib.rs | 9 +++++++-- bindings/c/src/types.rs | 6 ++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/bindings/c/include/libsql.h b/bindings/c/include/libsql.h index 8178980466..c1285d4fff 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 { + uintptr_t frame_no; + uintptr_t frames_synced; +} replicated; + typedef struct { const char *db_path; const char *primary_url; @@ -56,7 +61,7 @@ typedef struct { extern "C" { #endif // __cplusplus -int libsql_sync(libsql_database_t db, const char **out_err_msg); +int libsql_sync(libsql_database_t db, replicated *out_replicated, const char **out_err_msg); int libsql_open_sync(const char *db_path, const char *primary_url, diff --git a/bindings/c/src/lib.rs b/bindings/c/src/lib.rs index 96e4effd2a..3376c4e78b 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! { @@ -34,11 +34,16 @@ unsafe fn set_err_msg(msg: String, output: *mut *const std::ffi::c_char) { #[no_mangle] pub unsafe extern "C" fn libsql_sync( 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(_) => 0, + Ok(replicated) => { + (*out_replicated).frame_no = replicated.frame_no().unwrap_or(0) as usize; + (*out_replicated).frames_synced = replicated.frames_synced() as usize; + 0 + } Err(e) => { set_err_msg(format!("Error syncing database: {e}"), out_err_msg); 1 diff --git a/bindings/c/src/types.rs b/bindings/c/src/types.rs index 9f818e28d4..2ec399973a 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: usize, + pub frames_synced: usize, +} + pub struct stmt { pub stmt: libsql::Statement, pub params: Vec, From 7d4a2aebce3faad4e0d074be239384c34cfd0e68 Mon Sep 17 00:00:00 2001 From: Lucio Franco Date: Tue, 6 Aug 2024 15:02:25 -0400 Subject: [PATCH 2/2] c: rename sync method to to avoid breaking change --- bindings/c/include/libsql.h | 8 +++++--- bindings/c/src/lib.rs | 19 +++++++++++++++++-- bindings/c/src/types.rs | 4 ++-- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/bindings/c/include/libsql.h b/bindings/c/include/libsql.h index c1285d4fff..7fdfb4b3c0 100644 --- a/bindings/c/include/libsql.h +++ b/bindings/c/include/libsql.h @@ -28,8 +28,8 @@ typedef struct libsql_stmt libsql_stmt; typedef const libsql_database *libsql_database_t; typedef struct { - uintptr_t frame_no; - uintptr_t frames_synced; + int frame_no; + int frames_synced; } replicated; typedef struct { @@ -61,7 +61,9 @@ typedef struct { extern "C" { #endif // __cplusplus -int libsql_sync(libsql_database_t db, replicated *out_replicated, const char **out_err_msg); +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, diff --git a/bindings/c/src/lib.rs b/bindings/c/src/lib.rs index 3376c4e78b..354fd1f706 100644 --- a/bindings/c/src/lib.rs +++ b/bindings/c/src/lib.rs @@ -33,6 +33,21 @@ unsafe fn set_err_msg(msg: String, output: *mut *const std::ffi::c_char) { #[no_mangle] pub unsafe extern "C" fn libsql_sync( + db: libsql_database_t, + 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(_) => 0, + Err(e) => { + set_err_msg(format!("Error syncing database: {e}"), out_err_msg); + 1 + } + } +} + +#[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, @@ -40,8 +55,8 @@ pub unsafe extern "C" fn libsql_sync( let db = db.get_ref(); match RT.block_on(db.sync()) { Ok(replicated) => { - (*out_replicated).frame_no = replicated.frame_no().unwrap_or(0) as usize; - (*out_replicated).frames_synced = replicated.frames_synced() as usize; + (*out_replicated).frame_no = replicated.frame_no().unwrap_or(0) as i32; + (*out_replicated).frames_synced = replicated.frames_synced() as i32; 0 } Err(e) => { diff --git a/bindings/c/src/types.rs b/bindings/c/src/types.rs index 2ec399973a..5d9f0b517f 100644 --- a/bindings/c/src/types.rs +++ b/bindings/c/src/types.rs @@ -117,8 +117,8 @@ impl From<&mut libsql_connection> for libsql_connection_t { #[repr(C)] pub struct replicated { - pub frame_no: usize, - pub frames_synced: usize, + pub frame_no: std::ffi::c_int, + pub frames_synced: std::ffi::c_int, } pub struct stmt {