@@ -536,43 +536,92 @@ impl Statement {
536536 }
537537
538538 #[ napi]
539- pub fn columns ( & self , env : Env ) -> Result < Array > {
539+ pub fn run ( & self , params : Option < napi :: JsUnknown > ) -> Result < RunResult > {
540540 let rt = runtime ( ) ?;
541541 rt. block_on ( async move {
542- let stmt = self . stmt . lock ( ) . await ;
543- let columns = stmt. columns ( ) ;
544- let mut js_array = env. create_array ( columns. len ( ) as u32 ) ?;
545- for ( i, col) in columns. iter ( ) . enumerate ( ) {
546- let mut js_obj = env. create_object ( ) ?;
547- js_obj. set_named_property ( "name" , env. create_string ( col. name ( ) ) ?) ?;
548- // origin_name -> column
549- if let Some ( origin_name) = col. origin_name ( ) {
550- js_obj. set_named_property ( "column" , env. create_string ( origin_name) ?) ?;
551- } else {
552- js_obj. set_named_property ( "column" , env. get_null ( ) ?) ?;
553- }
554- // table_name -> table
555- if let Some ( table_name) = col. table_name ( ) {
556- js_obj. set_named_property ( "table" , env. create_string ( table_name) ?) ?;
557- } else {
558- js_obj. set_named_property ( "table" , env. get_null ( ) ?) ?;
559- }
560- // database_name -> database
561- if let Some ( database_name) = col. database_name ( ) {
562- js_obj. set_named_property ( "database" , env. create_string ( database_name) ?) ?;
563- } else {
564- js_obj. set_named_property ( "database" , env. get_null ( ) ?) ?;
565- }
566- // decl_type -> type
567- if let Some ( decl_type) = col. decl_type ( ) {
568- js_obj. set_named_property ( "type" , env. create_string ( decl_type) ?) ?;
542+ let conn = self . conn . lock ( ) . await ;
543+ let total_changes_before = conn. total_changes ( ) ;
544+ let start = std:: time:: Instant :: now ( ) ;
545+
546+ let mut stmt = self . stmt . lock ( ) . await ;
547+ stmt. reset ( ) ;
548+ let params = map_params ( & stmt, params) ?;
549+ stmt. query ( params) . await . map_err ( Error :: from) ?;
550+ let changes = if conn. total_changes ( ) == total_changes_before {
551+ 0
552+ } else {
553+ conn. changes ( )
554+ } ;
555+ let last_insert_row_id = conn. last_insert_rowid ( ) ;
556+ let duration = start. elapsed ( ) . as_secs_f64 ( ) ;
557+ Ok ( RunResult {
558+ changes : changes as f64 ,
559+ duration,
560+ lastInsertRowid : last_insert_row_id,
561+ } )
562+ } )
563+ }
564+
565+ #[ napi]
566+ pub fn get ( & self , env : Env , params : Option < napi:: JsUnknown > ) -> Result < napi:: JsUnknown > {
567+ let rt = runtime ( ) ?;
568+
569+ let safe_ints = self . safe_ints . load ( Ordering :: SeqCst ) ;
570+ let raw = self . raw . load ( Ordering :: SeqCst ) ;
571+ let pluck = self . pluck . load ( Ordering :: SeqCst ) ;
572+
573+ let start = std:: time:: Instant :: now ( ) ;
574+ rt. block_on ( async move {
575+ let mut stmt = self . stmt . lock ( ) . await ;
576+ let params = map_params ( & stmt, params) ?;
577+ let mut rows = stmt. query ( params) . await . map_err ( Error :: from) ?;
578+ let column_names = Self :: get_column_names ( & rows) ?;
579+ let row = rows. next ( ) . await . map_err ( Error :: from) ?;
580+ let duration = start. elapsed ( ) . as_secs_f64 ( ) ;
581+ let result = Self :: get_internal (
582+ & env,
583+ & row,
584+ & column_names,
585+ safe_ints,
586+ raw,
587+ pluck,
588+ duration,
589+ ) ;
590+ stmt. reset ( ) ;
591+ result
592+ } )
593+ }
594+
595+ fn get_internal (
596+ env : & Env ,
597+ row : & Option < libsql:: Row > ,
598+ column_names : & [ std:: ffi:: CString ] ,
599+ safe_ints : bool ,
600+ raw : bool ,
601+ pluck : bool ,
602+ duration : f64 ,
603+ ) -> Result < napi:: JsUnknown > {
604+ match row {
605+ Some ( row) => {
606+ if raw {
607+ let js_array = map_row_raw ( & env, & column_names, & row, safe_ints, pluck) ?;
608+ Ok ( js_array. into_unknown ( ) )
569609 } else {
570- js_obj. set_named_property ( "type" , env. get_null ( ) ?) ?;
610+ let mut js_object =
611+ map_row_object ( & env, & column_names, & row, safe_ints, pluck) ?
612+ . coerce_to_object ( ) ?;
613+ let mut metadata = env. create_object ( ) ?;
614+ let js_duration = env. create_double ( duration) ?;
615+ metadata. set_named_property ( "duration" , js_duration) ?;
616+ js_object. set_named_property ( "_metadata" , metadata) ?;
617+ Ok ( js_object. into_unknown ( ) )
571618 }
572- js_array. set ( i as u32 , js_obj) ?;
573619 }
574- Ok ( js_array)
575- } )
620+ None => {
621+ let undefined = env. get_undefined ( ) ?;
622+ Ok ( undefined. into_unknown ( ) )
623+ }
624+ }
576625 }
577626
578627 #[ napi]
@@ -636,33 +685,6 @@ impl Statement {
636685 ) )
637686 }
638687
639- #[ napi]
640- pub fn run ( & self , params : Option < napi:: JsUnknown > ) -> Result < RunResult > {
641- let rt = runtime ( ) ?;
642- rt. block_on ( async move {
643- let conn = self . conn . lock ( ) . await ;
644- let total_changes_before = conn. total_changes ( ) ;
645- let start = std:: time:: Instant :: now ( ) ;
646-
647- let mut stmt = self . stmt . lock ( ) . await ;
648- stmt. reset ( ) ;
649- let params = map_params ( & stmt, params) ?;
650- stmt. query ( params) . await . map_err ( Error :: from) ?;
651- let changes = if conn. total_changes ( ) == total_changes_before {
652- 0
653- } else {
654- conn. changes ( )
655- } ;
656- let last_insert_row_id = conn. last_insert_rowid ( ) ;
657- let duration = start. elapsed ( ) . as_secs_f64 ( ) ;
658- Ok ( RunResult {
659- changes : changes as f64 ,
660- duration,
661- lastInsertRowid : last_insert_row_id,
662- } )
663- } )
664- }
665-
666688 #[ napi]
667689 pub fn pluck ( & self , pluck : Option < bool > ) -> Result < & Self > {
668690 self . pluck . store ( pluck. unwrap_or ( true ) , Ordering :: SeqCst ) ;
@@ -686,65 +708,43 @@ impl Statement {
686708 }
687709
688710 #[ napi]
689- pub fn get ( & self , env : Env , params : Option < napi :: JsUnknown > ) -> Result < napi :: JsUnknown > {
711+ pub fn columns ( & self , env : Env ) -> Result < Array > {
690712 let rt = runtime ( ) ?;
691-
692- let safe_ints = self . safe_ints . load ( Ordering :: SeqCst ) ;
693- let raw = self . raw . load ( Ordering :: SeqCst ) ;
694- let pluck = self . pluck . load ( Ordering :: SeqCst ) ;
695-
696- let start = std:: time:: Instant :: now ( ) ;
697713 rt. block_on ( async move {
698- let mut stmt = self . stmt . lock ( ) . await ;
699- let params = map_params ( & stmt, params) ?;
700- let mut rows = stmt. query ( params) . await . map_err ( Error :: from) ?;
701- let column_names = Self :: get_column_names ( & rows) ?;
702- let row = rows. next ( ) . await . map_err ( Error :: from) ?;
703- let duration = start. elapsed ( ) . as_secs_f64 ( ) ;
704- let result = Self :: get_internal (
705- & env,
706- & row,
707- & column_names,
708- safe_ints,
709- raw,
710- pluck,
711- duration,
712- ) ;
713- stmt. reset ( ) ;
714- result
715- } )
716- }
717-
718- fn get_internal (
719- env : & Env ,
720- row : & Option < libsql:: Row > ,
721- column_names : & [ std:: ffi:: CString ] ,
722- safe_ints : bool ,
723- raw : bool ,
724- pluck : bool ,
725- duration : f64 ,
726- ) -> Result < napi:: JsUnknown > {
727- match row {
728- Some ( row) => {
729- if raw {
730- let js_array = map_row_raw ( & env, & column_names, & row, safe_ints, pluck) ?;
731- Ok ( js_array. into_unknown ( ) )
714+ let stmt = self . stmt . lock ( ) . await ;
715+ let columns = stmt. columns ( ) ;
716+ let mut js_array = env. create_array ( columns. len ( ) as u32 ) ?;
717+ for ( i, col) in columns. iter ( ) . enumerate ( ) {
718+ let mut js_obj = env. create_object ( ) ?;
719+ js_obj. set_named_property ( "name" , env. create_string ( col. name ( ) ) ?) ?;
720+ // origin_name -> column
721+ if let Some ( origin_name) = col. origin_name ( ) {
722+ js_obj. set_named_property ( "column" , env. create_string ( origin_name) ?) ?;
732723 } else {
733- let mut js_object =
734- map_row_object ( & env, & column_names, & row, safe_ints, pluck) ?
735- . coerce_to_object ( ) ?;
736- let mut metadata = env. create_object ( ) ?;
737- let js_duration = env. create_double ( duration) ?;
738- metadata. set_named_property ( "duration" , js_duration) ?;
739- js_object. set_named_property ( "_metadata" , metadata) ?;
740- Ok ( js_object. into_unknown ( ) )
724+ js_obj. set_named_property ( "column" , env. get_null ( ) ?) ?;
741725 }
726+ // table_name -> table
727+ if let Some ( table_name) = col. table_name ( ) {
728+ js_obj. set_named_property ( "table" , env. create_string ( table_name) ?) ?;
729+ } else {
730+ js_obj. set_named_property ( "table" , env. get_null ( ) ?) ?;
731+ }
732+ // database_name -> database
733+ if let Some ( database_name) = col. database_name ( ) {
734+ js_obj. set_named_property ( "database" , env. create_string ( database_name) ?) ?;
735+ } else {
736+ js_obj. set_named_property ( "database" , env. get_null ( ) ?) ?;
737+ }
738+ // decl_type -> type
739+ if let Some ( decl_type) = col. decl_type ( ) {
740+ js_obj. set_named_property ( "type" , env. create_string ( decl_type) ?) ?;
741+ } else {
742+ js_obj. set_named_property ( "type" , env. get_null ( ) ?) ?;
743+ }
744+ js_array. set ( i as u32 , js_obj) ?;
742745 }
743- None => {
744- let undefined = env. get_undefined ( ) ?;
745- Ok ( undefined. into_unknown ( ) )
746- }
747- }
746+ Ok ( js_array)
747+ } )
748748 }
749749
750750 #[ napi]
0 commit comments