native_db_32bit/transaction/query/scan/
mod.rs1mod 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
14pub struct RScan<'db, 'txn> {
16 pub(crate) internal: &'txn InternalRTransaction<'db>,
17}
18
19impl<'txn> RScan<'_, 'txn> {
20 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 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}