@@ -8,11 +8,11 @@ extern crate napi_derive;
88use napi:: bindgen_prelude:: { Array , FromNapiValue , JsFunction } ;
99use napi:: { Env , JsUnknown , Result , ValueType } ;
1010use once_cell:: sync:: OnceCell ;
11- use tracing_subscriber:: { EnvFilter , filter:: LevelFilter } ;
1211use std:: sync:: atomic:: { AtomicBool , Ordering } ;
1312use std:: sync:: Arc ;
1413use std:: time:: Duration ;
1514use tokio:: { runtime:: Runtime , sync:: Mutex } ;
15+ use tracing_subscriber:: { filter:: LevelFilter , EnvFilter } ;
1616
1717#[ napi]
1818pub 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
773816fn 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();
895942fn 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}
0 commit comments