Skip to content

Commit 98d5083

Browse files
committed
feat(database): provide active transaction (instead of database) to async upgrade needed callback
BREAKING CHANGE: The callback provided to `OpenDbRequestBuilder::with_on_upgrade_needed_fut` must now accept a reference to a `Transaction` rather than a `Database`. For most cases, existing code can be made compatible by calling `Transaction::database` in order to get access to the underlying database. The caveat is that the `Transaction::database` provides a reference, rather than ownership of the `Database`.
1 parent 2834586 commit 98d5083

File tree

4 files changed

+52
-41
lines changed

4 files changed

+52
-41
lines changed

internal_macros/src/generic_bounds.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ make_opts!(Opts => {
5252
db_version => crate::factory::DBVersion,
5353
blocked_cb => ::core::ops::FnOnce(crate::database::VersionChangeEvent) -> crate::Result<()> + 'static,
5454
upgrade_cb => ::core::ops::FnOnce(crate::database::VersionChangeEvent, &crate::transaction::Transaction<'_>) -> crate::Result<()> + 'static,
55-
upgrade_async_cb => ::core::ops::AsyncFnOnce(crate::database::VersionChangeEvent, crate::database::Database) -> crate::Result<()> + 'static,
55+
upgrade_async_cb => ::core::ops::AsyncFnOnce(crate::database::VersionChangeEvent, &crate::transaction::Transaction<'_>) -> crate::Result<()> + 'static,
5656
});
5757

5858
#[inline]

src/future/open_db/listener.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -176,11 +176,21 @@ const _: () = {
176176
};
177177

178178
Self::set_status(&status, Status::Pending, LBL_UPGRADE)?;
179-
let fut = callback(VersionChangeEvent::new(evt), db);
180-
181179
wasm_bindgen_futures::spawn_local(async move {
182-
let result = match fut.await {
183-
Ok(()) => Status::Ok,
180+
let db = db;
181+
let result = match Transaction::from_raw_version_change_event(&db, &evt) {
182+
Ok(mut transaction) => {
183+
match callback(VersionChangeEvent::new(evt), &transaction).await {
184+
Ok(_) => {
185+
// If the callback succeeded, we want to ensure that
186+
// the transaction is committed when dropped and not
187+
// aborted.
188+
transaction.on_drop(OnTransactionDrop::Commit);
189+
Status::Ok
190+
}
191+
Err(e) => Status::Err(e),
192+
}
193+
}
184194
Err(e) => Status::Err(e),
185195
};
186196
let _ = Self::set_status(&status, result, LBL_UPGRADE);

tests/tests/example_reproductions.rs

Lines changed: 33 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -44,54 +44,53 @@ pub async fn multi_threaded_executor() {
4444
#[wasm_bindgen_test]
4545
#[cfg(all(feature = "tx-done", feature = "async-upgrade"))]
4646
pub async fn opening_a_database_and_making_some_schema_changes() {
47-
use indexed_db_futures::database::{Database, VersionChangeEvent};
47+
use indexed_db_futures::database::Database;
4848
use indexed_db_futures::prelude::*;
4949
use indexed_db_futures::transaction::TransactionMode;
5050

5151
let _ = Database::open("opening_a_database_and_making_some_schema_changes")
5252
.with_version(2u8)
5353
.with_on_blocked(|_| Ok(()))
54-
.with_on_upgrade_needed_fut(|event: VersionChangeEvent, db: Database| {
54+
.with_on_upgrade_needed_fut(async |event, tx| {
55+
let db = tx.db();
5556
// Convert versions from floats to integers to allow using them in match expressions
5657
let old_version = event.old_version() as u64;
5758
let new_version = event.new_version().map(|v| v as u64);
5859

59-
async move {
60-
match (old_version, new_version) {
61-
(0, Some(1)) => {
62-
db.create_object_store("my_store")
63-
.with_auto_increment(true)
64-
.build()?;
60+
match (old_version, new_version) {
61+
(0, Some(1)) => {
62+
db.create_object_store("my_store")
63+
.with_auto_increment(true)
64+
.build()?;
65+
}
66+
(prev, Some(2)) => {
67+
if prev == 1 {
68+
db.delete_object_store("my_store")?;
6569
}
66-
(prev, Some(2)) => {
67-
if prev == 1 {
68-
db.delete_object_store("my_store")?;
69-
}
7070

71-
// Create an object store and await its transaction before inserting data.
72-
db.create_object_store("my_other_store")
73-
.with_auto_increment(true)
74-
.build()?
75-
.transaction()
76-
.on_done()?
77-
.await
78-
.into_result()?;
79-
80-
//- Start a new transaction & add some data
81-
let tx = db
82-
.transaction("my_other_store")
83-
.with_mode(TransactionMode::Readwrite)
84-
.build()?;
85-
let store = tx.object_store("my_other_store")?;
86-
store.add("foo").await?;
87-
store.add("bar").await?;
88-
tx.commit().await?;
89-
}
90-
_ => {}
71+
// Create an object store and await its transaction before inserting data.
72+
db.create_object_store("my_other_store")
73+
.with_auto_increment(true)
74+
.build()?
75+
.transaction()
76+
.on_done()?
77+
.await
78+
.into_result()?;
79+
80+
//- Start a new transaction & add some data
81+
let tx = db
82+
.transaction("my_other_store")
83+
.with_mode(TransactionMode::Readwrite)
84+
.build()?;
85+
let store = tx.object_store("my_other_store")?;
86+
store.add("foo").await?;
87+
store.add("bar").await?;
88+
tx.commit().await?;
9189
}
92-
93-
Ok(())
90+
_ => {}
9491
}
92+
93+
Ok(())
9594
})
9695
.await
9796
.expect("Error opening DB");

tests/tests/transaction/on_done.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ pub mod async_upgrade {
4040

4141
let err = Database::open(random_str())
4242
.with_version(2u8)
43-
.with_on_upgrade_needed_fut(move |_, db: Database| async move {
43+
.with_on_upgrade_needed_fut(async |_, tx| {
44+
let db = tx.db();
4445
// Create an object store and await its transaction
4546
db.create_object_store(STORE_NAME)
4647
.with_auto_increment(true)
@@ -74,7 +75,8 @@ pub mod async_upgrade {
7475
.with_version(2u8)
7576
.with_on_upgrade_needed_fut({
7677
let events = Arc::clone(&events);
77-
move |_, db: Database| async move {
78+
async move |_, tx| {
79+
let db = tx.db();
7880
events.lock().unwrap().push(Event::CallbackStart);
7981

8082
// Create an object store and await its transaction

0 commit comments

Comments
 (0)