diff --git a/Cargo.lock b/Cargo.lock index 65dc623..e0ed1a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -723,7 +723,7 @@ dependencies = [ [[package]] name = "libsql" version = "0.3.5" -source = "git+https://github.com/libsql/libsql/?rev=84ff2f7578cb634e531ac0075c0286893273238b#84ff2f7578cb634e531ac0075c0286893273238b" +source = "git+https://github.com/libsql/libsql/?rev=21cb5c80fd8b06ee5f087309b35859f156f29ef0#21cb5c80fd8b06ee5f087309b35859f156f29ef0" dependencies = [ "anyhow", "async-stream", @@ -760,7 +760,7 @@ dependencies = [ [[package]] name = "libsql-ffi" version = "0.2.1" -source = "git+https://github.com/libsql/libsql/?rev=84ff2f7578cb634e531ac0075c0286893273238b#84ff2f7578cb634e531ac0075c0286893273238b" +source = "git+https://github.com/libsql/libsql/?rev=21cb5c80fd8b06ee5f087309b35859f156f29ef0#21cb5c80fd8b06ee5f087309b35859f156f29ef0" dependencies = [ "bindgen", "cc", @@ -769,7 +769,7 @@ dependencies = [ [[package]] name = "libsql-hrana" version = "0.1.1" -source = "git+https://github.com/libsql/libsql/?rev=84ff2f7578cb634e531ac0075c0286893273238b#84ff2f7578cb634e531ac0075c0286893273238b" +source = "git+https://github.com/libsql/libsql/?rev=21cb5c80fd8b06ee5f087309b35859f156f29ef0#21cb5c80fd8b06ee5f087309b35859f156f29ef0" dependencies = [ "base64 0.21.7", "bytes", @@ -792,7 +792,7 @@ dependencies = [ [[package]] name = "libsql-rusqlite" version = "0.30.0" -source = "git+https://github.com/libsql/libsql/?rev=84ff2f7578cb634e531ac0075c0286893273238b#84ff2f7578cb634e531ac0075c0286893273238b" +source = "git+https://github.com/libsql/libsql/?rev=21cb5c80fd8b06ee5f087309b35859f156f29ef0#21cb5c80fd8b06ee5f087309b35859f156f29ef0" dependencies = [ "bitflags 2.4.2", "fallible-iterator 0.2.0", @@ -805,7 +805,7 @@ dependencies = [ [[package]] name = "libsql-sqlite3-parser" version = "0.11.1" -source = "git+https://github.com/libsql/libsql/?rev=84ff2f7578cb634e531ac0075c0286893273238b#84ff2f7578cb634e531ac0075c0286893273238b" +source = "git+https://github.com/libsql/libsql/?rev=21cb5c80fd8b06ee5f087309b35859f156f29ef0#21cb5c80fd8b06ee5f087309b35859f156f29ef0" dependencies = [ "bitflags 2.4.2", "cc", @@ -823,7 +823,7 @@ dependencies = [ [[package]] name = "libsql-sys" version = "0.5.0" -source = "git+https://github.com/libsql/libsql/?rev=84ff2f7578cb634e531ac0075c0286893273238b#84ff2f7578cb634e531ac0075c0286893273238b" +source = "git+https://github.com/libsql/libsql/?rev=21cb5c80fd8b06ee5f087309b35859f156f29ef0#21cb5c80fd8b06ee5f087309b35859f156f29ef0" dependencies = [ "bytes", "libsql-ffi", @@ -836,7 +836,7 @@ dependencies = [ [[package]] name = "libsql_replication" version = "0.3.1" -source = "git+https://github.com/libsql/libsql/?rev=84ff2f7578cb634e531ac0075c0286893273238b#84ff2f7578cb634e531ac0075c0286893273238b" +source = "git+https://github.com/libsql/libsql/?rev=21cb5c80fd8b06ee5f087309b35859f156f29ef0#21cb5c80fd8b06ee5f087309b35859f156f29ef0" dependencies = [ "aes", "async-stream", diff --git a/Cargo.toml b/Cargo.toml index 73998aa..7b256e6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ crate-type = ["cdylib"] [dependencies] tracing-subscriber = { version = "0.3", features = ["env-filter"] } -libsql = { git = "https://github.com/libsql/libsql/", rev = "84ff2f7578cb634e531ac0075c0286893273238b", features = ["encryption"] } +libsql = { git = "https://github.com/libsql/libsql/", rev = "21cb5c80fd8b06ee5f087309b35859f156f29ef0", features = ["encryption"] } tracing = "0.1" once_cell = "1.18.0" tokio = { version = "1.29.1", features = [ "rt-multi-thread" ] } diff --git a/docs/api.md b/docs/api.md index ab25e74..67d12b0 100644 --- a/docs/api.md +++ b/docs/api.md @@ -68,8 +68,7 @@ This function is currently not supported. ### loadExtension(path, [entryPoint]) ⇒ this -This function is currently not supported. - +Loads a SQLite3 extension ### exec(sql) ⇒ this Executes a SQL statement. diff --git a/index.js b/index.js index ca54dd5..1608ef6 100644 --- a/index.js +++ b/index.js @@ -31,6 +31,7 @@ const { databaseExecSync, databasePrepareSync, databaseDefaultSafeIntegers, + databaseLoadExtension, statementRaw, statementIsReader, statementGet, @@ -216,7 +217,7 @@ class Database { } loadExtension(...args) { - throw new Error("not implemented"); + databaseLoadExtension.call(this.db, ...args); } /** diff --git a/src/database.rs b/src/database.rs index 15b4427..723f48f 100644 --- a/src/database.rs +++ b/src/database.rs @@ -287,6 +287,32 @@ impl Database { self.default_safe_integers.replace(toggle); } + pub fn js_load_extension(mut cx: FunctionContext) -> JsResult { + let db: Handle<'_, JsBox> = cx.this()?; + let extension = cx.argument::(0)?.value(&mut cx); + let entry_point: Option<&str> = match cx.argument_opt(1) { + Some(arg) => todo!(), + None => None, + }; + trace!("Loading extension: {}", extension); + let conn = match db.get_conn(&mut cx) { + Some(conn) => conn, + None => throw_database_closed_error(&mut cx)?, + }; + let conn = conn.blocking_lock(); + if let Err(err) = conn.load_extension_enable() { + throw_libsql_error(&mut cx, err)?; + } + if let Err(err) = conn.load_extension(&extension, entry_point) { + let _ = conn.load_extension_disable(); + throw_libsql_error(&mut cx, err)?; + } + if let Err(err) = conn.load_extension_disable() { + throw_libsql_error(&mut cx, err)?; + } + Ok(cx.undefined()) + } + fn get_conn(&self, cx: &mut FunctionContext) -> Option>> { let conn = self.conn.borrow(); conn.as_ref().map(|conn| conn.clone()) diff --git a/src/lib.rs b/src/lib.rs index ad05bcb..a801319 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -41,6 +41,7 @@ fn main(mut cx: ModuleContext) -> NeonResult<()> { "databaseDefaultSafeIntegers", Database::js_default_safe_integers, )?; + cx.export_function("databaseLoadExtension", Database::js_load_extension)?; cx.export_function("statementRaw", Statement::js_raw)?; cx.export_function("statementIsReader", Statement::js_is_reader)?; cx.export_function("statementRun", Statement::js_run)?;