Skip to content

Commit f510fed

Browse files
committed
Revert "Unoptimize row iteration"
This reverts commit d4e7c6c. Turns out it had nothing to do with the SIGSEGV, which was related to loading extensions.
1 parent 04f3842 commit f510fed

File tree

1 file changed

+28
-20
lines changed

1 file changed

+28
-20
lines changed

src/lib.rs

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
mod auth;
2424

2525
use napi::{
26-
bindgen_prelude::{Array, FromNapiValue},
26+
bindgen_prelude::{Array, FromNapiValue, ToNapiValue},
2727
Env, JsUnknown, Result, ValueType,
2828
};
2929
use 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.
216216
struct 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]
10471046
pub 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 {
10561055
impl 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]
10951094
pub 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

11341133
fn 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

11701169
fn 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

12071215
fn 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

Comments
 (0)