2323mod auth;
2424
2525use napi:: {
26- bindgen_prelude:: { Array , FromNapiValue } ,
26+ bindgen_prelude:: { Array , FromNapiValue , ToNapiValue } ,
2727 Env , JsUnknown , Result , ValueType ,
2828} ;
2929use napi_derive:: napi;
@@ -210,7 +210,7 @@ pub struct Options {
210210}
211211
212212/// Access mode.
213- ///
213+ ///
214214/// The `better-sqlite3` API allows the caller to configure the format of
215215/// query results. This struct encapsulates the different access mode configs.
216216struct AccessMode {
@@ -607,7 +607,7 @@ pub struct Statement {
607607 // The libSQL statement instance.
608608 stmt : Arc < tokio:: sync:: Mutex < libsql:: Statement > > ,
609609 // The column names.
610- column_names : Vec < String > ,
610+ column_names : Vec < std :: ffi :: CString > ,
611611 // The access mode.
612612 mode : AccessMode ,
613613}
@@ -626,10 +626,10 @@ impl Statement {
626626 stmt : libsql:: Statement ,
627627 mode : AccessMode ,
628628 ) -> Self {
629- let column_names: Vec < String > = stmt
629+ let column_names: Vec < std :: ffi :: CString > = stmt
630630 . columns ( )
631631 . iter ( )
632- . map ( |c| c. name ( ) . to_string ( ) )
632+ . map ( |c| std :: ffi :: CString :: new ( c. name ( ) . to_string ( ) ) . unwrap ( ) )
633633 . collect ( ) ;
634634 let stmt = Arc :: new ( tokio:: sync:: Mutex :: new ( stmt) ) ;
635635 Self {
@@ -715,7 +715,7 @@ impl Statement {
715715 fn get_internal (
716716 env : & Env ,
717717 row : & Option < libsql:: Row > ,
718- column_names : & [ String ] ,
718+ column_names : & [ std :: ffi :: CString ] ,
719719 safe_ints : bool ,
720720 raw : bool ,
721721 pluck : bool ,
@@ -876,12 +876,9 @@ impl Statement {
876876 }
877877}
878878
879+
879880#[ napi]
880- pub fn statement_iterate_sync (
881- stmt : & Statement ,
882- _env : Env ,
883- params : Option < napi:: JsUnknown > ,
884- ) -> Result < RowsIterator > {
881+ pub fn statement_iterate_sync ( stmt : & Statement , _env : Env , params : Option < napi:: JsUnknown > ) -> Result < RowsIterator > {
885882 let rt = runtime ( ) ?;
886883 let safe_ints = stmt. mode . safe_ints . load ( Ordering :: SeqCst ) ;
887884 let raw = stmt. mode . raw . load ( Ordering :: SeqCst ) ;
@@ -894,7 +891,9 @@ pub fn statement_iterate_sync(
894891 let rows = stmt. query ( params) . await . map_err ( Error :: from) ?;
895892 let mut column_names = Vec :: new ( ) ;
896893 for i in 0 ..rows. column_count ( ) {
897- column_names. push ( rows. column_name ( i) . unwrap ( ) . to_string ( ) ) ;
894+ column_names. push (
895+ std:: ffi:: CString :: new ( rows. column_name ( i) . unwrap ( ) . to_string ( ) ) . unwrap ( ) ,
896+ ) ;
898897 }
899898 Ok :: < _ , napi:: Error > ( ( rows, column_names) )
900899 } ) ?;
@@ -1046,7 +1045,7 @@ fn map_value(value: JsUnknown) -> Result<libsql::Value> {
10461045#[ napi]
10471046pub struct RowsIterator {
10481047 rows : Arc < tokio:: sync:: Mutex < libsql:: Rows > > ,
1049- column_names : Vec < String > ,
1048+ column_names : Vec < std :: ffi :: CString > ,
10501049 safe_ints : bool ,
10511050 raw : bool ,
10521051 pluck : bool ,
@@ -1056,7 +1055,7 @@ pub struct RowsIterator {
10561055impl RowsIterator {
10571056 pub fn new (
10581057 rows : Arc < tokio:: sync:: Mutex < libsql:: Rows > > ,
1059- column_names : Vec < String > ,
1058+ column_names : Vec < std :: ffi :: CString > ,
10601059 safe_ints : bool ,
10611060 raw : bool ,
10621061 pluck : bool ,
@@ -1094,7 +1093,7 @@ pub fn iterator_next_sync(iter: &RowsIterator) -> Result<Record> {
10941093#[ napi]
10951094pub struct Record {
10961095 row : Option < libsql:: Row > ,
1097- column_names : Vec < String > ,
1096+ column_names : Vec < std :: ffi :: CString > ,
10981097 safe_ints : bool ,
10991098 raw : bool ,
11001099 pluck : bool ,
@@ -1133,7 +1132,7 @@ fn runtime() -> Result<&'static Runtime> {
11331132
11341133fn map_row (
11351134 env : & Env ,
1136- column_names : & [ String ] ,
1135+ column_names : & [ std :: ffi :: CString ] ,
11371136 row : & libsql:: Row ,
11381137 safe_ints : bool ,
11391138 raw : bool ,
@@ -1169,7 +1168,7 @@ fn convert_value_to_js(
11691168
11701169fn map_row_object (
11711170 env : & Env ,
1172- column_names : & [ String ] ,
1171+ column_names : & [ std :: ffi :: CString ] ,
11731172 row : & libsql:: Row ,
11741173 safe_ints : bool ,
11751174 pluck : bool ,
@@ -1187,7 +1186,8 @@ fn map_row_object(
11871186 env. get_null ( ) ?. into_unknown ( )
11881187 }
11891188 } else {
1190- let mut result = env. create_object ( ) ?;
1189+ let result = env. create_object ( ) ?;
1190+ let result = unsafe { napi:: JsObject :: to_napi_value ( env. raw ( ) , result) ? } ;
11911191 // If not plucking, get all columns
11921192 for idx in 0 ..column_count {
11931193 let value = match row. get_value ( idx as i32 ) {
@@ -1197,16 +1197,24 @@ fn map_row_object(
11971197
11981198 let column_name = & column_names[ idx] ;
11991199 let js_value = convert_value_to_js ( env, & value, safe_ints) ?;
1200- result. set_named_property ( column_name, js_value) ?;
1200+ unsafe {
1201+ napi:: sys:: napi_set_named_property (
1202+ env. raw ( ) ,
1203+ result,
1204+ column_name. as_ptr ( ) ,
1205+ napi:: JsUnknown :: to_napi_value ( env. raw ( ) , js_value) ?,
1206+ ) ;
1207+ }
12011208 }
1209+ let result: napi:: JsObject = unsafe { napi:: JsObject :: from_napi_value ( env. raw ( ) , result) ? } ;
12021210 result. into_unknown ( )
12031211 } ;
12041212 Ok ( result)
12051213}
12061214
12071215fn map_row_raw (
12081216 env : & Env ,
1209- column_names : & [ String ] ,
1217+ column_names : & [ std :: ffi :: CString ] ,
12101218 row : & libsql:: Row ,
12111219 safe_ints : bool ,
12121220 pluck : bool ,
0 commit comments