@@ -512,6 +512,7 @@ pub fn database_prepare_sync(db: &Database, sql: String) -> Result<Statement> {
512512pub struct Statement {
513513 stmt : Arc < tokio:: sync:: Mutex < libsql:: Statement > > ,
514514 conn : Arc < tokio:: sync:: Mutex < libsql:: Connection > > ,
515+ column_names : Vec < std:: ffi:: CString > ,
515516 safe_ints : AtomicBool ,
516517 raw : AtomicBool ,
517518 pluck : AtomicBool ,
@@ -526,9 +527,13 @@ impl Statement {
526527 raw : bool ,
527528 pluck : bool ,
528529 ) -> Self {
530+ let column_names: Vec < std:: ffi:: CString > = stmt. columns ( ) . iter ( ) . map ( |c| {
531+ std:: ffi:: CString :: new ( c. name ( ) . to_string ( ) ) . unwrap ( )
532+ } ) . collect ( ) ;
529533 Self {
530534 stmt : Arc :: new ( tokio:: sync:: Mutex :: new ( stmt) ) ,
531535 conn,
536+ column_names,
532537 safe_ints : AtomicBool :: new ( safe_ints) ,
533538 raw : AtomicBool :: new ( raw) ,
534539 pluck : AtomicBool :: new ( pluck) ,
@@ -575,13 +580,12 @@ impl Statement {
575580 let mut stmt = self . stmt . lock ( ) . await ;
576581 let params = map_params ( & stmt, params) ?;
577582 let mut rows = stmt. query ( params) . await . map_err ( Error :: from) ?;
578- let column_names = Self :: get_column_names ( & rows) ?;
579583 let row = rows. next ( ) . await . map_err ( Error :: from) ?;
580584 let duration = start. elapsed ( ) . as_secs_f64 ( ) ;
581585 let result = Self :: get_internal (
582586 & env,
583587 & row,
584- & column_names,
588+ & self . column_names ,
585589 safe_ints,
586590 raw,
587591 pluck,
@@ -644,8 +648,8 @@ impl Statement {
644648 let rows = stmt. lock ( ) . await . query ( params) . await . map_err ( Error :: from) ?;
645649 Ok :: < _ , napi:: Error > ( rows)
646650 } ;
651+ let column_names = self . column_names . clone ( ) ;
647652 env. execute_tokio_future ( future, move |& mut _env, result| {
648- let column_names = Self :: get_column_names ( & result) ?;
649653 Ok ( RowsIterator :: new (
650654 Arc :: new ( tokio:: sync:: Mutex :: new ( result) ) ,
651655 column_names,
@@ -764,18 +768,6 @@ impl Statement {
764768 . map_err ( Error :: from) ?;
765769 Ok ( ( ) )
766770 }
767-
768- fn get_column_names ( rows : & libsql:: Rows ) -> Result < Vec < std:: ffi:: CString > > {
769- let mut column_names = Vec :: new ( ) ;
770- for i in 0 ..rows. column_count ( ) {
771- let column_name = match rows. column_name ( i) {
772- Some ( name) => name. to_string ( ) ,
773- None => return Err ( napi:: Error :: from_reason ( "Failed to get column name" ) ) ,
774- } ;
775- column_names. push ( std:: ffi:: CString :: new ( column_name) . unwrap ( ) ) ;
776- }
777- Ok ( column_names)
778- }
779771}
780772
781773/// SQLite `run()` result object
0 commit comments