Skip to content

Commit 136250b

Browse files
committed
HACKS
1 parent 3893e2a commit 136250b

3 files changed

Lines changed: 62 additions & 23 deletions

File tree

index.d.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ export declare class Statement {
4848
interrupt(): void
4949
}
5050
export declare class RowsIterator {
51-
next(): object
52-
[Symbol.iterator](): this
51+
next(): Record
52+
}
53+
export declare class Record {
54+
get value(): unknown | null
55+
get done(): boolean
5356
}

index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,10 +310,11 @@ if (!nativeBinding) {
310310
throw new Error(`Failed to load native binding`)
311311
}
312312

313-
const { SqliteError, Database, databasePrepareSync, Statement, RowsIterator } = nativeBinding
313+
const { SqliteError, Database, databasePrepareSync, Statement, RowsIterator, Record } = nativeBinding
314314

315315
module.exports.SqliteError = SqliteError
316316
module.exports.Database = Database
317317
module.exports.databasePrepareSync = databasePrepareSync
318318
module.exports.Statement = Statement
319319
module.exports.RowsIterator = RowsIterator
320+
module.exports.Record = Record

src/lib.rs

Lines changed: 55 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ mod auth;
77
#[macro_use]
88
extern crate napi_derive;
99

10-
use napi::bindgen_prelude::{Array, FromNapiValue, JsFunction};
11-
use napi::{Env, JsUnknown, Result, ValueType};
10+
use napi::bindgen_prelude::{Array, FromNapiValue};
11+
use napi::{Env, JsString, JsUnknown, Result, ValueType};
1212
use once_cell::sync::OnceCell;
1313
use std::sync::atomic::{AtomicBool, Ordering};
1414
use std::sync::Arc;
@@ -610,11 +610,7 @@ impl Statement {
610610
}
611611

612612
#[napi]
613-
pub fn iterate_sync(
614-
&self,
615-
env: Env,
616-
params: Option<napi::JsUnknown>,
617-
) -> Result<RowsIterator> {
613+
pub fn iterate_sync(&self, env: Env, params: Option<napi::JsUnknown>) -> Result<RowsIterator> {
618614
let rt = runtime()?;
619615
let safe_ints = self.safe_ints.load(Ordering::SeqCst);
620616
let raw = self.raw.load(Ordering::SeqCst);
@@ -792,28 +788,67 @@ impl RowsIterator {
792788
}
793789

794790
#[napi]
795-
pub fn next(&self, env: Env) -> Result<napi::JsObject> {
791+
pub fn next(&self, env: Env) -> Result<Record> {
796792
let rt = runtime()?;
797793
let rows = self.rows.clone();
798794
rt.block_on(async move {
799795
let mut rows = rows.lock().await;
800796
let next_row = rows.next().await.map_err(Error::from)?;
801-
let mut result = env.create_object()?;
802-
match next_row {
803-
Some(row) => {
804-
let value = map_row(&env, &rows, &row, self.safe_ints, self.raw, self.pluck)?;
805-
result.set_named_property("value", value)?;
806-
result.set_named_property("done", env.get_boolean(false)?)?;
807-
}
808-
None => {
809-
result.set_named_property("done", env.get_boolean(true)?)?;
810-
}
811-
}
812-
Ok(result)
797+
let record = match next_row {
798+
Some(row) => Record {
799+
rows: self.rows.clone(),
800+
row: Some(row),
801+
safe_ints: self.safe_ints,
802+
raw: self.raw,
803+
pluck: self.pluck,
804+
},
805+
None => Record {
806+
rows: self.rows.clone(),
807+
row: None,
808+
safe_ints: self.safe_ints,
809+
raw: self.raw,
810+
pluck: self.pluck,
811+
},
812+
};
813+
Ok(record)
813814
})
814815
}
815816
}
816817

818+
#[napi]
819+
pub struct Record {
820+
rows: Arc<tokio::sync::Mutex<libsql::Rows>>,
821+
row: Option<libsql::Row>,
822+
safe_ints: bool,
823+
raw: bool,
824+
pluck: bool,
825+
}
826+
827+
#[napi]
828+
impl Record {
829+
#[napi(getter)]
830+
pub fn value(&self, env: Env) -> Option<napi::JsUnknown> {
831+
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)
841+
} else {
842+
None
843+
}
844+
}
845+
846+
#[napi(getter)]
847+
pub fn done(&self) -> bool {
848+
self.row.is_none()
849+
}
850+
}
851+
817852
fn runtime() -> Result<&'static Runtime> {
818853
static RUNTIME: OnceCell<Runtime> = OnceCell::new();
819854

0 commit comments

Comments
 (0)