native_db_32bit/transaction/query/scan/
mod.rs

1mod primary_scan;
2mod secondary_scan;
3
4use crate::db_type::{
5    DatabaseInnerKeyValue, DatabaseSecondaryKeyOptions, Input, KeyDefinition, Result,
6};
7pub use primary_scan::*;
8pub use secondary_scan::*;
9
10use crate::transaction::internal::private_readable_transaction::PrivateReadableTransaction;
11use crate::transaction::internal::r_transaction::InternalRTransaction;
12use crate::transaction::internal::rw_transaction::InternalRwTransaction;
13
14/// Get values from the database.
15pub struct RScan<'db, 'txn> {
16    pub(crate) internal: &'txn InternalRTransaction<'db>,
17}
18
19impl<'txn> RScan<'_, 'txn> {
20    /// Get a values from the database by primary key.
21    pub fn primary<T: Input>(
22        &self,
23    ) -> Result<PrimaryScan<redb::ReadOnlyTable<'txn, DatabaseInnerKeyValue, &'static [u8]>, T>>
24    {
25        let model = T::native_db_model();
26        let table = self.internal.get_primary_table(&model)?;
27        let out = PrimaryScan::new(table);
28        Ok(out)
29    }
30
31    /// Get a values from the database by secondary key.
32    pub fn secondary<T: Input>(
33        &self,
34        key_def: impl KeyDefinition<DatabaseSecondaryKeyOptions>,
35    ) -> Result<
36        SecondaryScan<
37            redb::ReadOnlyTable<'txn, DatabaseInnerKeyValue, &'static [u8]>,
38            redb::ReadOnlyTable<'txn, DatabaseInnerKeyValue, DatabaseInnerKeyValue>,
39            T,
40        >,
41    > {
42        let model = T::native_db_model();
43        let primary_table = self.internal.get_primary_table(&model)?;
44        let secondary_key = key_def.database_key();
45        let secondary_table = self.internal.get_secondary_table(&model, &secondary_key)?;
46        let out = SecondaryScan::new(primary_table, secondary_table);
47        Ok(out)
48    }
49}
50
51pub struct RwScan<'db, 'txn> {
52    pub(crate) internal: &'txn InternalRwTransaction<'db>,
53}
54
55impl<'db, 'txn> RwScan<'db, 'txn> {
56    pub fn primary<T: Input>(
57        &self,
58    ) -> Result<PrimaryScan<redb::Table<'db, 'txn, DatabaseInnerKeyValue, &'static [u8]>, T>> {
59        let model = T::native_db_model();
60        let table = self.internal.get_primary_table(&model)?;
61        let out = PrimaryScan::new(table);
62        Ok(out)
63    }
64
65    pub fn secondary<T: Input>(
66        &self,
67        key_def: impl KeyDefinition<DatabaseSecondaryKeyOptions>,
68    ) -> Result<
69        SecondaryScan<
70            redb::Table<'db, 'txn, DatabaseInnerKeyValue, &'static [u8]>,
71            redb::Table<'db, 'txn, DatabaseInnerKeyValue, DatabaseInnerKeyValue>,
72            T,
73        >,
74    > {
75        let model = T::native_db_model();
76        let primary_table = self.internal.get_primary_table(&model)?;
77        let secondary_key = key_def.database_key();
78        let secondary_table = self.internal.get_secondary_table(&model, &secondary_key)?;
79        let out = SecondaryScan::new(primary_table, secondary_table);
80        Ok(out)
81    }
82}