@@ -7,8 +7,8 @@ mod auth;
77#[ macro_use]
88extern crate napi_derive;
99
10- use napi:: bindgen_prelude:: { Array , FromNapiValue , JsFunction } ;
11- use napi:: { Env , JsUnknown , Result , ValueType } ;
10+ use napi:: bindgen_prelude:: { Array , FromNapiValue } ;
11+ use napi:: { Env , JsString , JsUnknown , Result , ValueType } ;
1212use once_cell:: sync:: OnceCell ;
1313use std:: sync:: atomic:: { AtomicBool , Ordering } ;
1414use std:: sync:: Arc ;
@@ -610,11 +610,7 @@ impl Statement {
610610 }
611611
612612 #[ napi]
613- pub fn iterate_sync (
614- & self ,
615- env : Env ,
616- params : Option < napi:: JsUnknown > ,
617- ) -> Result < RowsIterator > {
613+ pub fn iterate_sync ( & self , env : Env , params : Option < napi:: JsUnknown > ) -> Result < RowsIterator > {
618614 let rt = runtime ( ) ?;
619615 let safe_ints = self . safe_ints . load ( Ordering :: SeqCst ) ;
620616 let raw = self . raw . load ( Ordering :: SeqCst ) ;
@@ -792,28 +788,67 @@ impl RowsIterator {
792788 }
793789
794790 #[ napi]
795- pub fn next ( & self , env : Env ) -> Result < napi :: JsObject > {
791+ pub fn next ( & self , env : Env ) -> Result < Record > {
796792 let rt = runtime ( ) ?;
797793 let rows = self . rows . clone ( ) ;
798794 rt. block_on ( async move {
799795 let mut rows = rows. lock ( ) . await ;
800796 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)
797+ let record = match next_row {
798+ Some ( row) => Record {
799+ rows : self . rows . clone ( ) ,
800+ row : Some ( row) ,
801+ safe_ints : self . safe_ints ,
802+ raw : self . raw ,
803+ pluck : self . pluck ,
804+ } ,
805+ None => Record {
806+ rows : self . rows . clone ( ) ,
807+ row : None ,
808+ safe_ints : self . safe_ints ,
809+ raw : self . raw ,
810+ pluck : self . pluck ,
811+ } ,
812+ } ;
813+ Ok ( record)
813814 } )
814815 }
815816}
816817
818+ #[ napi]
819+ pub struct Record {
820+ rows : Arc < tokio:: sync:: Mutex < libsql:: Rows > > ,
821+ row : Option < libsql:: Row > ,
822+ safe_ints : bool ,
823+ raw : bool ,
824+ pluck : bool ,
825+ }
826+
827+ #[ napi]
828+ impl Record {
829+ #[ napi( getter) ]
830+ pub fn value ( & self , env : Env ) -> Option < napi:: JsUnknown > {
831+ if let Some ( row) = & self . row {
832+ let rt = runtime ( ) . unwrap ( ) ;
833+ let rows = self . rows . clone ( ) ;
834+ let value = rt
835+ . block_on ( async move {
836+ let rows = rows. lock ( ) . await ;
837+ map_row ( & env, & rows, & row, self . safe_ints , self . raw , self . pluck )
838+ } )
839+ . unwrap ( ) ;
840+ Some ( value)
841+ } else {
842+ None
843+ }
844+ }
845+
846+ #[ napi( getter) ]
847+ pub fn done ( & self ) -> bool {
848+ self . row . is_none ( )
849+ }
850+ }
851+
817852fn runtime ( ) -> Result < & ' static Runtime > {
818853 static RUNTIME : OnceCell < Runtime > = OnceCell :: new ( ) ;
819854
0 commit comments