Skip to content

Commit a55bf61

Browse files
authored
Add get/set reserved bytes to C bindings (#2171)
- Exposes the API to the `Connection` struct - Adds `libsql_set_reserved_bytes` and `libsql_get_reserved_bytes` to `libsql.h`
2 parents 1cfc940 + 5cfbbd5 commit a55bf61

File tree

7 files changed

+85
-0
lines changed

7 files changed

+85
-0
lines changed

bindings/c/include/libsql.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ int libsql_load_extension(libsql_connection_t conn,
107107
const char *entry_point,
108108
const char **out_err_msg);
109109

110+
int libsql_set_reserved_bytes(libsql_connection_t conn, int32_t reserved_bytes, const char **out_err_msg);
111+
112+
int libsql_get_reserved_bytes(libsql_connection_t conn, int32_t *reserved_bytes, const char **out_err_msg);
113+
110114
int libsql_reset(libsql_connection_t conn, const char **out_err_msg);
111115

112116
void libsql_disconnect(libsql_connection_t conn);

bindings/c/src/lib.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,45 @@ pub unsafe extern "C" fn libsql_load_extension(
549549
0
550550
}
551551

552+
#[no_mangle]
553+
pub unsafe extern "C" fn libsql_set_reserved_bytes(
554+
conn: libsql_connection_t,
555+
reserved_bytes: i32,
556+
out_err_msg: *mut *const std::ffi::c_char,
557+
) -> std::ffi::c_int {
558+
if conn.is_null() {
559+
set_err_msg("Null connection".to_string(), out_err_msg);
560+
return 1;
561+
}
562+
let conn = conn.get_ref();
563+
if let Err(err) = conn.set_reserved_bytes(reserved_bytes) {
564+
set_err_msg(err.to_string(), out_err_msg);
565+
return 1;
566+
}
567+
0
568+
}
569+
570+
#[no_mangle]
571+
pub unsafe extern "C" fn libsql_get_reserved_bytes(
572+
conn: libsql_connection_t,
573+
reserved_bytes: *mut i32,
574+
out_err_msg: *mut *const std::ffi::c_char,
575+
) -> std::ffi::c_int {
576+
if conn.is_null() {
577+
set_err_msg("Null connection".to_string(), out_err_msg);
578+
return 1;
579+
}
580+
let conn = conn.get_ref();
581+
match conn.get_reserved_bytes() {
582+
Ok(v) => *reserved_bytes = v,
583+
Err(err) => {
584+
set_err_msg(err.to_string(), out_err_msg);
585+
return 1;
586+
}
587+
}
588+
0
589+
}
590+
552591
#[no_mangle]
553592
pub unsafe extern "C" fn libsql_reset(
554593
conn: libsql_connection_t,

libsql/src/connection.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@ pub(crate) trait Conn {
3939

4040
async fn reset(&self);
4141

42+
fn set_reserved_bytes(&self, _reserved_bytes: i32) -> Result<()> {
43+
Err(crate::Error::ReservedBytesNotSupported)
44+
}
45+
46+
fn get_reserved_bytes(&self) -> Result<i32> {
47+
Err(crate::Error::ReservedBytesNotSupported)
48+
}
49+
4250
fn enable_load_extension(&self, _onoff: bool) -> Result<()> {
4351
Err(crate::Error::LoadExtensionNotSupported)
4452
}
@@ -230,6 +238,14 @@ impl Connection {
230238
self.conn.reset().await
231239
}
232240

241+
pub fn set_reserved_bytes(&self, reserved_bytes: i32) -> Result<()> {
242+
self.conn.set_reserved_bytes(reserved_bytes)
243+
}
244+
245+
pub fn get_reserved_bytes(&self) -> Result<i32> {
246+
self.conn.get_reserved_bytes()
247+
}
248+
233249
/// Enable loading SQLite extensions from SQL queries and Rust API.
234250
///
235251
/// See [`load_extension`](Connection::load_extension) documentation for more details.

libsql/src/errors.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ pub enum Error {
6161
Sync(crate::BoxError),
6262
#[error("WAL frame insert conflict")]
6363
WalConflict,
64+
#[error("Reserved bytes not supported")]
65+
ReservedBytesNotSupported,
6466
}
6567

6668
#[cfg(feature = "hrana")]

libsql/src/local/impls.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,14 @@ impl Conn for LibsqlConnection {
8181

8282
async fn reset(&self) {}
8383

84+
fn set_reserved_bytes(&self, reserved_bytes: i32) -> Result<()> {
85+
self.conn.set_reserved_bytes(reserved_bytes)
86+
}
87+
88+
fn get_reserved_bytes(&self) -> Result<i32> {
89+
self.conn.get_reserved_bytes()
90+
}
91+
8492
fn enable_load_extension(&self, onoff: bool) -> Result<()> {
8593
self.conn.enable_load_extension(onoff)
8694
}

libsql/src/replication/connection.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,14 @@ impl Conn for RemoteConnection {
542542
}
543543

544544
async fn reset(&self) {}
545+
546+
fn set_reserved_bytes(&self, reserved_bytes: i32) -> Result<()> {
547+
self.local.set_reserved_bytes(reserved_bytes)
548+
}
549+
550+
fn get_reserved_bytes(&self) -> Result<i32> {
551+
self.local.get_reserved_bytes()
552+
}
545553
}
546554

547555
pub struct ColumnMeta {

libsql/src/sync/connection.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,4 +189,12 @@ impl Conn for SyncedConnection {
189189
}
190190

191191
async fn reset(&self) {}
192+
193+
fn set_reserved_bytes(&self, reserved_bytes: i32) -> Result<()> {
194+
self.local.set_reserved_bytes(reserved_bytes)
195+
}
196+
197+
fn get_reserved_bytes(&self) -> Result<i32> {
198+
self.local.get_reserved_bytes()
199+
}
192200
}

0 commit comments

Comments
 (0)