mod index;
mod store;
pub use self::{index::StoreIndex, store::Store};
use idb::Transaction as IdbTransaction;
use crate::{Error, Result, TransactionMode, TransactionResult};
pub struct Transaction {
pub(crate) transaction: IdbTransaction,
}
impl Transaction {
pub fn mode(&self) -> Result<TransactionMode> {
self.transaction.mode().map_err(Into::into)
}
pub fn store_names(&self) -> Vec<String> {
self.transaction.store_names()
}
pub async fn abort(self) -> Result<()> {
let result = self.transaction.abort()?.await?;
if result.is_aborted() {
Ok(())
} else {
Err(Error::TransactionAbortFailed)
}
}
pub async fn commit(self) -> Result<()> {
let result = self.transaction.commit()?.await?;
if result.is_committed() {
Ok(())
} else {
Err(Error::TransactioncommitFailed)
}
}
pub async fn done(self) -> Result<TransactionResult> {
self.transaction.await.map_err(Into::into)
}
pub fn store(&self, store_name: &str) -> Result<Store> {
self.transaction
.object_store(store_name)
.map(|object_store| Store { object_store })
.map_err(Into::into)
}
}