native_db_32bit/transaction/query/get.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
use crate::db_type::{DatabaseSecondaryKeyOptions, InnerKeyValue, Input, KeyDefinition, Result};
use crate::transaction::internal::private_readable_transaction::PrivateReadableTransaction;
use crate::transaction::internal::r_transaction::InternalRTransaction;
use crate::transaction::internal::rw_transaction::InternalRwTransaction;
/// Get a value from the database.
pub struct RGet<'db, 'txn> {
pub(crate) internal: &'txn InternalRTransaction<'db>,
}
impl RGet<'_, '_> {
/// Get a value from the database by primary key.
///
/// # Example
/// ```rust
/// use native_db::*;
/// use native_model::{native_model, Model};
/// use serde::{Deserialize, Serialize};
///
/// #[derive(Serialize, Deserialize)]
/// #[native_model(id=1, version=1)]
/// #[native_db]
/// struct Data {
/// #[primary_key]
/// id: u64,
/// }
///
/// fn main() -> Result<(), db_type::Error> {
/// let mut builder = DatabaseBuilder::new();
/// builder.define::<Data>()?;
/// let db = builder.create_in_memory()?;
///
/// // Open a read transaction
/// let r = db.r_transaction()?;
///
/// // Get a value by primary key
/// let _value: Option<Data> = r.get().primary(1u64)?;
/// Ok(())
/// }
/// ```
pub fn primary<T: Input>(&self, key: impl InnerKeyValue) -> Result<Option<T>> {
let model = T::native_db_model();
let result = self.internal.get_by_primary_key(model, key)?;
Ok(result.map(|value| value.inner()))
}
/// Get a value from the database by secondary key.
///
/// /!\ The secondary key **must** be [`unique`](crate::DatabaseBuilder#unique) else this method will return an error [`SecondaryKeyConstraintMismatch`](crate::db_type::Error::SecondaryKeyConstraintMismatch).
/// If the secondary key is not unique, use [`scan()`](crate::transaction::RTransaction::scan) instead.
///
/// Anatomy of a secondary key it is a `enum` with the following structure: `<table_name>Key::<name>`.
///
/// # Example
/// ```rust
/// use native_db::*;
/// use native_model::{native_model, Model};
/// use serde::{Deserialize, Serialize};
///
/// #[derive(Serialize, Deserialize)]
/// #[native_model(id=1, version=1)]
/// #[native_db]
/// struct Data {
/// #[primary_key]
/// id: u64,
/// #[secondary_key(unique)] // Must be unique to use get()
/// name: String,
/// }
///
/// fn main() -> Result<(), db_type::Error> {
/// let mut builder = DatabaseBuilder::new();
/// builder.define::<Data>()?;
/// let db = builder.create_in_memory()?;
///
/// // Open a read transaction
/// let r = db.r_transaction()?;
///
/// // Get a value by primary key
/// let _value: Option<Data> = r.get().secondary(DataKey::name, "test")?;
/// Ok(())
/// }
/// ```
pub fn secondary<T: Input>(
&self,
key_def: impl KeyDefinition<DatabaseSecondaryKeyOptions>,
key: impl InnerKeyValue,
) -> Result<Option<T>> {
let model = T::native_db_model();
let result = self.internal.get_by_secondary_key(model, key_def, key)?;
Ok(result.map(|value| value.inner()))
}
}
pub struct RwGet<'db, 'txn> {
pub(crate) internal: &'txn InternalRwTransaction<'db>,
}
impl RwGet<'_, '_> {
/// Get a value from the database by primary key.
///
/// Same as [`RGet::primary()`](struct.RGet.html#method.primary).
pub fn primary<T: Input>(&self, key: impl InnerKeyValue) -> Result<Option<T>> {
let model = T::native_db_model();
let result = self.internal.get_by_primary_key(model, key)?;
Ok(result.map(|value| value.inner()))
}
/// Get a value from the database by secondary key.
///
/// Same as [`RGet::secondary()`](struct.RGet.html#method.secondary).
pub fn secondary<T: Input>(
&self,
key_def: impl KeyDefinition<DatabaseSecondaryKeyOptions>,
key: impl InnerKeyValue,
) -> Result<Option<T>> {
let model = T::native_db_model();
let result = self.internal.get_by_secondary_key(model, key_def, key)?;
Ok(result.map(|value| value.inner()))
}
}