diff --git a/ext/node/ops/sqlite/database.rs b/ext/node/ops/sqlite/database.rs index e935a634ce..b27d08caf8 100644 --- a/ext/node/ops/sqlite/database.rs +++ b/ext/node/ops/sqlite/database.rs @@ -376,7 +376,7 @@ impl DatabaseSync { Ok(Session { inner: raw_session, freed: Cell::new(false), - _db: self.conn.clone(), + db: self.conn.clone(), }) } } diff --git a/ext/node/ops/sqlite/session.rs b/ext/node/ops/sqlite/session.rs index 520904d536..4bc616a9c0 100644 --- a/ext/node/ops/sqlite/session.rs +++ b/ext/node/ops/sqlite/session.rs @@ -24,7 +24,7 @@ pub struct Session { pub(crate) freed: Cell, // Hold a strong reference to the database. - pub(crate) _db: Rc>>, + pub(crate) db: Rc>>, } impl GarbageCollected for Session {} @@ -57,6 +57,10 @@ impl Session { // Closes the session. #[fast] fn close(&self) -> Result<(), SqliteError> { + if self.db.borrow().is_none() { + return Err(SqliteError::AlreadyClosed); + } + self.delete() } @@ -66,6 +70,9 @@ impl Session { // This method is a wrapper around `sqlite3session_changeset()`. #[buffer] fn changeset(&self) -> Result, SqliteError> { + if self.db.borrow().is_none() { + return Err(SqliteError::AlreadyClosed); + } if self.freed.get() { return Err(SqliteError::SessionClosed); } @@ -78,6 +85,9 @@ impl Session { // This method is a wrapper around `sqlite3session_patchset()`. #[buffer] fn patchset(&self) -> Result, SqliteError> { + if self.db.borrow().is_none() { + return Err(SqliteError::AlreadyClosed); + } if self.freed.get() { return Err(SqliteError::SessionClosed); } diff --git a/tests/unit_node/sqlite_test.ts b/tests/unit_node/sqlite_test.ts index 5cfec0d5e4..fcf8292e02 100644 --- a/tests/unit_node/sqlite_test.ts +++ b/tests/unit_node/sqlite_test.ts @@ -96,6 +96,9 @@ Deno.test("[node/sqlite] createSession and changesets", () => { assertThrows(() => session.changeset(), Error, "Session is already closed"); // Close after close should throw. assertThrows(() => session.close(), Error, "Session is already closed"); + + db.close(); + assertThrows(() => session.close(), Error, "Database is already closed"); }); Deno.test("[node/sqlite] StatementSync integer too large", () => {