@@ -597,10 +597,14 @@ impl Statement {
597597 let rows = stmt. lock ( ) . await . query ( params) . await . map_err ( Error :: from) ?;
598598 Ok :: < _ , napi:: Error > ( rows)
599599 } ;
600- env. execute_tokio_future ( future, move |& mut env, result| {
600+ env. execute_tokio_future ( future, move |& mut _env, result| {
601+ let mut column_names = vec ! [ ] ;
602+ for i in 0 ..result. column_count ( ) {
603+ column_names. push ( result. column_name ( i) . unwrap ( ) . to_string ( ) ) ;
604+ }
601605 let iter = RowsIterator :: new (
602- env,
603606 Arc :: new ( tokio:: sync:: Mutex :: new ( result) ) ,
607+ column_names,
604608 safe_ints,
605609 raw,
606610 pluck,
@@ -628,12 +632,16 @@ impl Statement {
628632 params
629633 } ;
630634 let rows = stmt. query ( params) . await . map_err ( Error :: from) ?;
631- Ok :: < _ , napi:: Error > ( rows)
635+ let mut column_names = vec ! [ ] ;
636+ for i in 0 ..rows. column_count ( ) {
637+ column_names. push ( rows. column_name ( i) . unwrap ( ) . to_string ( ) ) ;
638+ }
639+ Ok :: < _ , napi:: Error > ( ( rows, column_names) )
632640 } ;
633- let rows = rt. block_on ( future) ?;
641+ let ( rows, column_names ) = rt. block_on ( future) ?;
634642 let iter = RowsIterator :: new (
635- env,
636643 Arc :: new ( tokio:: sync:: Mutex :: new ( rows) ) ,
644+ column_names,
637645 safe_ints,
638646 raw,
639647 pluck,
@@ -715,15 +723,19 @@ impl Statement {
715723 libsql:: params:: Params :: None
716724 } ;
717725 let mut rows = stmt. query ( params) . await . map_err ( Error :: from) ?;
726+ let mut column_names = vec ! [ ] ;
727+ for i in 0 ..rows. column_count ( ) {
728+ column_names. push ( rows. column_name ( i) . unwrap ( ) . to_string ( ) ) ;
729+ }
718730 let row = rows. next ( ) . await . map_err ( Error :: from) ?;
719731 let duration = start. elapsed ( ) . as_secs_f64 ( ) ;
720732 let result = match row {
721733 Some ( row) => {
722734 if raw {
723- let js_array = map_row_raw ( & env, & rows , & row, safe_ints, pluck) ?;
735+ let js_array = map_row_raw ( & env, & column_names , & row, safe_ints, pluck) ?;
724736 Ok ( js_array. into_unknown ( ) )
725737 } else {
726- let mut js_object = map_row_object ( & env, & rows , & row, safe_ints, pluck) ?
738+ let mut js_object = map_row_object ( & env, & column_names , & row, safe_ints, pluck) ?
727739 . coerce_to_object ( ) ?;
728740 let mut metadata = env. create_object ( ) ?;
729741 let js_duration = env. create_double ( duration) ?;
@@ -764,6 +776,7 @@ impl Statement {
764776#[ napi]
765777pub struct RowsIterator {
766778 rows : Arc < tokio:: sync:: Mutex < libsql:: Rows > > ,
779+ column_names : Vec < String > ,
767780 safe_ints : bool ,
768781 raw : bool ,
769782 pluck : bool ,
@@ -772,14 +785,15 @@ pub struct RowsIterator {
772785#[ napi]
773786impl RowsIterator {
774787 pub fn new (
775- env : Env ,
776788 rows : Arc < tokio:: sync:: Mutex < libsql:: Rows > > ,
789+ column_names : Vec < String > ,
777790 safe_ints : bool ,
778791 raw : bool ,
779792 pluck : bool ,
780793 ) -> Result < Self > {
781794 let iter = RowsIterator {
782795 rows,
796+ column_names,
783797 safe_ints,
784798 raw,
785799 pluck,
@@ -796,14 +810,14 @@ impl RowsIterator {
796810 let next_row = rows. next ( ) . await . map_err ( Error :: from) ?;
797811 let record = match next_row {
798812 Some ( row) => Record {
799- rows : self . rows . clone ( ) ,
813+ column_names : self . column_names . clone ( ) ,
800814 row : Some ( row) ,
801815 safe_ints : self . safe_ints ,
802816 raw : self . raw ,
803817 pluck : self . pluck ,
804818 } ,
805819 None => Record {
806- rows : self . rows . clone ( ) ,
820+ column_names : self . column_names . clone ( ) ,
807821 row : None ,
808822 safe_ints : self . safe_ints ,
809823 raw : self . raw ,
@@ -817,7 +831,7 @@ impl RowsIterator {
817831
818832#[ napi]
819833pub struct Record {
820- rows : Arc < tokio :: sync :: Mutex < libsql :: Rows > > ,
834+ column_names : Vec < String > ,
821835 row : Option < libsql:: Row > ,
822836 safe_ints : bool ,
823837 raw : bool ,
@@ -827,19 +841,11 @@ pub struct Record {
827841#[ napi]
828842impl Record {
829843 #[ napi( getter) ]
830- pub fn value ( & self , env : Env ) -> Option < napi:: JsUnknown > {
844+ pub fn value ( & self , env : Env ) -> napi :: Result < napi:: JsUnknown > {
831845 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)
846+ Ok ( map_row ( & env, & self . column_names , & row, self . safe_ints , self . raw , self . pluck ) ?)
841847 } else {
842- None
848+ Ok ( env . get_null ( ) ? . into_unknown ( ) )
843849 }
844850 }
845851
@@ -858,16 +864,16 @@ fn runtime() -> Result<&'static Runtime> {
858864
859865fn map_row (
860866 env : & Env ,
861- rows : & libsql :: Rows ,
867+ column_names : & [ String ] ,
862868 row : & libsql:: Row ,
863869 safe_ints : bool ,
864870 raw : bool ,
865871 pluck : bool ,
866872) -> Result < napi:: JsUnknown > {
867873 let result = if raw {
868- map_row_raw ( env, rows , row, safe_ints, pluck) ?
874+ map_row_raw ( env, column_names , row, safe_ints, pluck) ?
869875 } else {
870- map_row_object ( env, rows , row, safe_ints, pluck) ?. into_unknown ( )
876+ map_row_object ( env, column_names , row, safe_ints, pluck) ?. into_unknown ( )
871877 } ;
872878 Ok ( result)
873879}
@@ -894,12 +900,12 @@ fn convert_value_to_js(
894900
895901fn map_row_object (
896902 env : & Env ,
897- rows : & libsql :: Rows ,
903+ column_names : & [ String ] ,
898904 row : & libsql:: Row ,
899905 safe_ints : bool ,
900906 pluck : bool ,
901907) -> Result < napi:: JsUnknown > {
902- let column_count = rows . column_count ( ) ;
908+ let column_count = column_names . len ( ) ;
903909
904910 let result = if pluck {
905911 if column_count > 0 {
@@ -915,12 +921,12 @@ fn map_row_object(
915921 let mut result = env. create_object ( ) ?;
916922 // If not plucking, get all columns
917923 for idx in 0 ..column_count {
918- let value = match row. get_value ( idx) {
924+ let value = match row. get_value ( idx as i32 ) {
919925 Ok ( v) => v,
920926 Err ( e) => return Err ( napi:: Error :: from_reason ( e. to_string ( ) ) ) ,
921927 } ;
922928
923- let column_name = rows . column_name ( idx) . unwrap ( ) ;
929+ let column_name = column_names [ idx] . as_str ( ) ;
924930 let js_value = convert_value_to_js ( env, & value, safe_ints) ?;
925931 result. set_named_property ( column_name, js_value) ?;
926932 }
@@ -931,16 +937,16 @@ fn map_row_object(
931937
932938fn map_row_raw (
933939 env : & Env ,
934- rows : & libsql :: Rows ,
940+ column_names : & [ String ] ,
935941 row : & libsql:: Row ,
936942 safe_ints : bool ,
937943 pluck : bool ,
938944) -> Result < napi:: JsUnknown > {
939- let column_count = rows . column_count ( ) ;
945+ let column_count = column_names . len ( ) ;
940946 let mut js_array = env. create_array ( column_count as u32 ) ?;
941947
942948 for idx in 0 ..column_count {
943- let value = match row. get_value ( idx) {
949+ let value = match row. get_value ( idx as i32 ) {
944950 Ok ( v) => v,
945951 Err ( e) => return Err ( napi:: Error :: from_reason ( e. to_string ( ) ) ) ,
946952 } ;
0 commit comments