diff --git a/bindings/javascript/__test__/better-sqlite3.spec.mjs b/bindings/javascript/__test__/better-sqlite3.spec.mjs index 7587fd7ab..288f62a1a 100644 --- a/bindings/javascript/__test__/better-sqlite3.spec.mjs +++ b/bindings/javascript/__test__/better-sqlite3.spec.mjs @@ -7,11 +7,21 @@ test("Open in-memory database", async (t) => { t.is(db.memory, true); }); -test("Statement.get()", async (t) => { + +test("Statement.get() returns data", async (t) => { const [db] = await connect(":memory:"); const stmt = db.prepare("SELECT 1"); const result = stmt.get(); t.is(result["1"], 1); + const result2 = stmt.get(); + t.is(result2["1"], 1); +}); + +test("Statement.get() returns undefined when no data", async (t) => { + const [db] = await connect(":memory:"); + const stmt = db.prepare("SELECT 1 WHERE 1 = 2"); + const result = stmt.get(); + t.is(result, undefined); }); const connect = async (path) => { diff --git a/bindings/javascript/__test__/limbo.spec.mjs b/bindings/javascript/__test__/limbo.spec.mjs index f9c18c3d5..fd3b5015b 100644 --- a/bindings/javascript/__test__/limbo.spec.mjs +++ b/bindings/javascript/__test__/limbo.spec.mjs @@ -7,11 +7,21 @@ test("Open in-memory database", async (t) => { t.is(db.memory, true); }); -test("Statement.get()", async (t) => { + +test("Statement.get() returns data", async (t) => { const [db] = await connect(":memory:"); const stmt = db.prepare("SELECT 1"); const result = stmt.get(); t.is(result["1"], 1); + const result2 = stmt.get(); + t.is(result2["1"], 1); +}); + +test("Statement.get() returns null when no data", async (t) => { + const [db] = await connect(":memory:"); + const stmt = db.prepare("SELECT 1 WHERE 1 = 2"); + const result = stmt.get(); + t.is(result, undefined); }); const connect = async (path) => { diff --git a/bindings/javascript/src/lib.rs b/bindings/javascript/src/lib.rs index 16ca8c84e..51ef0db9d 100644 --- a/bindings/javascript/src/lib.rs +++ b/bindings/javascript/src/lib.rs @@ -4,7 +4,7 @@ use std::cell::RefCell; use std::rc::Rc; use std::sync::Arc; -use napi::{Env, JsObject, JsUnknown, Result as NapiResult}; +use napi::{Env, JsUnknown, Result as NapiResult}; use napi_derive::napi; #[napi(js_name = "Database")] @@ -69,24 +69,24 @@ impl Statement { } #[napi] - pub fn get(&self, env: Env) -> NapiResult { + pub fn get(&self, env: Env) -> NapiResult { let mut stmt = self.inner.borrow_mut(); + stmt.reset(); match stmt.step() { Ok(limbo_core::StepResult::Row) => { let row = stmt.row().unwrap(); let mut obj = env.create_object()?; - for (idx, value) in row.get_values().iter().enumerate() { - let key = (idx + 1).to_string(); + let key = stmt.get_column_name(idx); let js_value = to_js_value(&env, value); obj.set_named_property(&key, js_value)?; } - Ok(obj) + Ok(obj.into_unknown()) } + Ok(limbo_core::StepResult::Done) => Ok(env.get_undefined().unwrap().into_unknown()), Ok(limbo_core::StepResult::IO) - | Ok(limbo_core::StepResult::Done) | Ok(limbo_core::StepResult::Interrupt) - | Ok(limbo_core::StepResult::Busy) => Ok(env.create_object()?), + | Ok(limbo_core::StepResult::Busy) => todo!(), Err(e) => Err(napi::Error::from_reason(format!("Database error: {:?}", e))), } }