use either::Either;
use pollster::FutureExt;
use super::*;
pub struct ReadTransaction<D: AsyncDatabase, S: AsyncSpawner, H> {
pub(super) db: TransactionDB<D, S, H>,
pub(super) read_ts: u64,
}
impl<D, S, H> ReadTransaction<D, S, H>
where
D: AsyncDatabase,
S: AsyncSpawner,
{
pub async fn get<'a: 'b, 'b>(
&'a self,
key: &'b D::Key,
) -> Result<Option<Either<D::ItemRef<'a>, D::Item>>, D::Error> {
self.db.inner.db.get(key, self.read_ts).await
}
pub async fn iter(&self, opts: IteratorOptions) -> D::Iterator<'_> {
self
.db
.inner
.db
.iter(core::iter::empty(), self.read_ts, opts)
.await
}
pub async fn keys(&self, opts: KeysOptions) -> D::Keys<'_> {
self
.db
.inner
.db
.keys(core::iter::empty(), self.read_ts, opts)
.await
}
}
impl<D, S, H> Drop for ReadTransaction<D, S, H>
where
D: AsyncDatabase,
S: AsyncSpawner,
{
fn drop(&mut self) {
self.db.inner.orc.done_read(self.read_ts).block_on();
}
}