@@ -614,7 +614,7 @@ impl Statement {
614614 & self ,
615615 env : Env ,
616616 params : Option < napi:: JsUnknown > ,
617- ) -> Result < napi :: JsObject > {
617+ ) -> Result < RowsIterator > {
618618 let rt = runtime ( ) ?;
619619 let safe_ints = self . safe_ints . load ( Ordering :: SeqCst ) ;
620620 let raw = self . raw . load ( Ordering :: SeqCst ) ;
@@ -766,7 +766,12 @@ impl Statement {
766766}
767767
768768#[ napi]
769- pub struct RowsIterator { }
769+ pub struct RowsIterator {
770+ rows : Arc < tokio:: sync:: Mutex < libsql:: Rows > > ,
771+ safe_ints : bool ,
772+ raw : bool ,
773+ pluck : bool ,
774+ }
770775
771776#[ napi]
772777impl RowsIterator {
@@ -776,42 +781,37 @@ impl RowsIterator {
776781 safe_ints : bool ,
777782 raw : bool ,
778783 pluck : bool ,
779- ) -> Result < napi:: JsObject > {
780- let mut iter = env. create_object ( ) ?;
781- let next_fn: JsFunction = env. create_function_from_closure ( "next" , move |ctx| {
782- let rt = runtime ( ) ?;
783- let rows = rows. clone ( ) ;
784- rt. block_on ( async move {
785- let mut rows = rows. lock ( ) . await ;
786- let next_row = rows. next ( ) . await . map_err ( Error :: from) ?;
787- let mut result = ctx. env . create_object ( ) ?;
788- match next_row {
789- Some ( row) => {
790- let value = map_row ( & ctx. env , & rows, & row, safe_ints, raw, pluck) ?;
791- result. set_named_property ( "value" , value) ?;
792- result. set_named_property ( "done" , ctx. env . get_boolean ( false ) ?) ?;
793- }
794- None => {
795- result. set_named_property ( "done" , ctx. env . get_boolean ( true ) ?) ?;
796- }
797- }
798- Ok ( result)
799- } )
800- } ) ?;
801- iter. set_named_property ( "next" , next_fn) ?;
802- // Create iterator function
803- let iterator_fn: JsFunction = env. create_function_from_closure ( "iterator" , move |ctx| {
804- Ok ( ctx. this :: < napi:: JsObject > ( ) )
805- } ) ?;
806- // Get Symbol.iterator
807- let global = env. get_global ( ) ?;
808- let symbol_ctor = global. get_named_property :: < JsFunction > ( "Symbol" ) ?;
809- let symbol_ctor_obj = symbol_ctor. coerce_to_object ( ) ?;
810- let symbol_iterator = symbol_ctor_obj. get_named_property :: < napi:: JsSymbol > ( "iterator" ) ?;
811- // Attach [Symbol.iterator]
812- iter. set_property ( symbol_iterator, iterator_fn) ?;
784+ ) -> Result < Self > {
785+ let iter = RowsIterator {
786+ rows,
787+ safe_ints,
788+ raw,
789+ pluck,
790+ } ;
813791 Ok ( iter)
814792 }
793+
794+ #[ napi]
795+ pub fn next ( & self , env : Env ) -> Result < napi:: JsObject > {
796+ let rt = runtime ( ) ?;
797+ let rows = self . rows . clone ( ) ;
798+ rt. block_on ( async move {
799+ let mut rows = rows. lock ( ) . await ;
800+ let next_row = rows. next ( ) . await . map_err ( Error :: from) ?;
801+ let mut result = env. create_object ( ) ?;
802+ match next_row {
803+ Some ( row) => {
804+ let value = map_row ( & env, & rows, & row, self . safe_ints , self . raw , self . pluck ) ?;
805+ result. set_named_property ( "value" , value) ?;
806+ result. set_named_property ( "done" , env. get_boolean ( false ) ?) ?;
807+ }
808+ None => {
809+ result. set_named_property ( "done" , env. get_boolean ( true ) ?) ?;
810+ }
811+ }
812+ Ok ( result)
813+ } )
814+ }
815815}
816816
817817fn runtime ( ) -> Result < & ' static Runtime > {
0 commit comments