Skip to content

Commit e1ec27c

Browse files
committed
HACKS
1 parent 1cc0466 commit e1ec27c

3 files changed

Lines changed: 68 additions & 20 deletions

File tree

index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export declare class Database {
3939
export declare class Statement {
4040
columns(): unknown[]
4141
iterate(params?: unknown | undefined | null): object
42+
iterateSync(params?: unknown | undefined | null): object
4243
run(params?: unknown | undefined | null): RunResult
4344
pluck(pluck?: boolean | undefined | null): this
4445
raw(raw?: boolean | undefined | null): this

src/lib.rs

Lines changed: 66 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ extern crate napi_derive;
88
use napi::bindgen_prelude::{Array, FromNapiValue, JsFunction};
99
use napi::{Env, JsUnknown, Result, ValueType};
1010
use once_cell::sync::OnceCell;
11-
use tracing_subscriber::{EnvFilter, filter::LevelFilter};
1211
use std::sync::atomic::{AtomicBool, Ordering};
1312
use std::sync::Arc;
1413
use std::time::Duration;
1514
use tokio::{runtime::Runtime, sync::Mutex};
15+
use tracing_subscriber::{filter::LevelFilter, EnvFilter};
1616

1717
#[napi]
1818
pub struct SqliteError {
@@ -579,7 +579,7 @@ impl Statement {
579579
let stmt = self.stmt.clone();
580580
rt.block_on(async move {
581581
let mut stmt = stmt.lock().await;
582-
stmt.reset();
582+
stmt.reset();
583583
let params = if let Some(params) = params {
584584
map_params(&stmt, Some(params)).unwrap()
585585
} else {
@@ -593,13 +593,55 @@ impl Statement {
593593
let rows = stmt.lock().await.query(params).await.map_err(Error::from)?;
594594
Ok::<_, napi::Error>(rows)
595595
};
596-
env.execute_tokio_future(
597-
future,
598-
move |&mut env, result| {
599-
let iter = RowsIterator::new(env, Arc::new(tokio::sync::Mutex::new(result)), safe_ints, raw, pluck)?;
600-
Ok(iter)
601-
},
602-
)
596+
env.execute_tokio_future(future, move |&mut env, result| {
597+
let iter = RowsIterator::new(
598+
env,
599+
Arc::new(tokio::sync::Mutex::new(result)),
600+
safe_ints,
601+
raw,
602+
pluck,
603+
)?;
604+
Ok(iter)
605+
})
606+
}
607+
608+
#[napi]
609+
pub fn iterate_sync(
610+
&self,
611+
env: Env,
612+
params: Option<napi::JsUnknown>,
613+
) -> Result<napi::JsObject> {
614+
let rt = runtime()?;
615+
let safe_ints = self.safe_ints.load(Ordering::SeqCst);
616+
let raw = self.raw.load(Ordering::SeqCst);
617+
let pluck = self.pluck.load(Ordering::SeqCst);
618+
let params = {
619+
let stmt = self.stmt.clone();
620+
rt.block_on(async move {
621+
let mut stmt = stmt.lock().await;
622+
stmt.reset();
623+
let params = if let Some(params) = params {
624+
map_params(&stmt, Some(params)).unwrap()
625+
} else {
626+
libsql::params::Params::None
627+
};
628+
params
629+
})
630+
};
631+
let stmt = self.stmt.clone();
632+
let future = async move {
633+
let rows = stmt.lock().await.query(params).await.map_err(Error::from)?;
634+
Ok::<_, napi::Error>(rows)
635+
};
636+
let rows = rt.block_on(future)?;
637+
let iter = RowsIterator::new(
638+
env,
639+
Arc::new(tokio::sync::Mutex::new(rows)),
640+
safe_ints,
641+
raw,
642+
pluck,
643+
)?;
644+
Ok(iter)
603645
}
604646

605647
#[napi]
@@ -684,7 +726,8 @@ impl Statement {
684726
let js_array = map_row_raw(&env, &rows, &row, safe_ints, pluck)?;
685727
Ok(js_array.into_unknown())
686728
} else {
687-
let mut js_object = map_row_object(&env, &rows, &row, safe_ints, pluck)?.coerce_to_object()?;
729+
let mut js_object = map_row_object(&env, &rows, &row, safe_ints, pluck)?
730+
.coerce_to_object()?;
688731
let mut metadata = env.create_object()?;
689732
let js_duration = env.create_double(duration)?;
690733
metadata.set_named_property("duration", js_duration)?;
@@ -758,7 +801,7 @@ impl RowsIterator {
758801
// Create iterator function
759802
let iterator_fn: JsFunction = env.create_function_from_closure("iterator", move |ctx| {
760803
Ok(ctx.this::<napi::JsObject>())
761-
})?;
804+
})?;
762805
// Get Symbol.iterator
763806
let global = env.get_global()?;
764807
let symbol_ctor = global.get_named_property::<JsFunction>("Symbol")?;
@@ -767,7 +810,7 @@ impl RowsIterator {
767810
// Attach [Symbol.iterator]
768811
iter.set_property(symbol_iterator, iterator_fn)?;
769812
Ok(iter)
770-
}
813+
}
771814
}
772815

773816
fn runtime() -> Result<&'static Runtime> {
@@ -793,7 +836,11 @@ fn map_row(
793836
Ok(result)
794837
}
795838

796-
fn convert_value_to_js(env: &Env, value: &libsql::Value, safe_ints: bool) -> Result<napi::JsUnknown> {
839+
fn convert_value_to_js(
840+
env: &Env,
841+
value: &libsql::Value,
842+
safe_ints: bool,
843+
) -> Result<napi::JsUnknown> {
797844
match value {
798845
libsql::Value::Null => Ok(env.get_null()?.into_unknown()),
799846
libsql::Value::Integer(v) => {
@@ -895,11 +942,11 @@ static LOGGER_INIT: OnceCell<()> = OnceCell::new();
895942
fn ensure_logger() {
896943
LOGGER_INIT.get_or_init(|| {
897944
let _ = tracing_subscriber::fmt::fmt()
898-
.with_env_filter(
899-
EnvFilter::builder()
900-
.with_default_directive(LevelFilter::ERROR.into())
901-
.from_env_lossy(),
902-
)
903-
.try_init();
945+
.with_env_filter(
946+
EnvFilter::builder()
947+
.with_default_directive(LevelFilter::ERROR.into())
948+
.from_env_lossy(),
949+
)
950+
.try_init();
904951
});
905952
}

wrapper.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ class Statement {
254254
*/
255255
iterate(...bindParameters) {
256256
try {
257-
return this.stmt.iterate(...bindParameters);
257+
return this.stmt.iterateSync(...bindParameters);
258258
} catch (err) {
259259
throw convertError(err);
260260
}

0 commit comments

Comments
 (0)