Skip to content

Commit 765c54b

Browse files
committed
HACKS
1 parent 136250b commit 765c54b

3 files changed

Lines changed: 40 additions & 34 deletions

File tree

index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,6 @@ export declare class RowsIterator {
5151
next(): Record
5252
}
5353
export declare class Record {
54-
get value(): unknown | null
54+
get value(): unknown
5555
get done(): boolean
5656
}

perf/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"type": "module",
44
"private": true,
55
"dependencies": {
6-
"better-sqlite3": "^9.5.0",
6+
"better-sqlite3": "^11.10.0",
77
"libsql": "..",
88
"mitata": "^0.1.11"
99
}

src/lib.rs

Lines changed: 38 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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]
765777
pub 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]
773786
impl 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]
819833
pub 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]
828842
impl 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

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

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

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

Comments
 (0)