Skip to main content

Database

Struct Database 

Source
pub struct Database { /* private fields */ }

Implementations§

Source§

impl Database

Source§

impl Database

These impls control the keystore transaction lifecycle.

Source

pub async fn new_transaction(&self) -> Result<(), CryptoKeystoreError>

Waits for the current transaction to be committed or rolled back, then starts a new one.

Source

pub async fn try_new_immediate_transaction( &self, ) -> Result<(), CryptoKeystoreError>

Start a new transaction if no other transaction is currently in progress.

If a transaction is currently in progress, this will produce a TransactionInProgress error.

Source

pub async fn commit_transaction(&self) -> Result<(), CryptoKeystoreError>

Source

pub async fn rollback_transaction(&self) -> Result<(), CryptoKeystoreError>

Source

pub async fn transactionally<R>( &self, operation: impl AsyncFnOnce(&KeystoreTransaction) -> Result<R, CryptoKeystoreError>, ) -> Result<R, CryptoKeystoreError>

Do an operation on a keystore transaction on this database.

This is a convenience method abstracting over Self::new_transaction, Self::commit_transaction, and Self::rollback_transaction.

If the operation succeeds, the transaction is committed. Otherwise, it is rolled back.

Source§

impl Database

These impls are convenience methods to modify the keystore transaction.

Be aware that we are likely to remove these in the future: WPB-23951

Source

pub async fn save<E>( &self, entity: E, ) -> Result<<E as EntityDatabaseMutation>::AutoGeneratedFields, CryptoKeystoreError>

Source

pub async fn remove<E>( &self, id: &<E as PrimaryKey>::PrimaryKey, ) -> Result<(), CryptoKeystoreError>

Source

pub async fn remove_borrowed<E>( &self, id: &<E as BorrowPrimaryKey>::BorrowedPrimaryKey, ) -> Result<(), CryptoKeystoreError>

Source

pub async fn restore<E>( &self, id: &<E as BorrowPrimaryKey>::BorrowedPrimaryKey, ) -> Result<(), CryptoKeystoreError>

Restore an entity that was deleted in this transaction by removing it from the deleted list. This is idempotent: if the entity doesn’t exist in the deleted list, do nothing.

NOTE: This will only work if the entity has been added in an earlier transaction, because otherwise, removing its id from the deleted list wouldn’t suffice: we’d need to replay its insertion.

Source§

impl Database

Source

pub async fn open( path: &str, database_key: &DatabaseKey, ) -> Result<Arc<Database>, CryptoKeystoreError>

Open an encrypted Database at the provided location.

When compiled with target_os = "unknown", this opens a database encrypted via sqlite3-multiple-ciphers using its default encryption mechanism, stored in IndexedDB via the relaxed-idb shim.

When compiled normally, this opens a database encrypted via sqlcipher at a path in the local filesystem.

Source

pub fn open_in_memory() -> Result<Arc<Database>, CryptoKeystoreError>

Open an in-memory Database.

In-memory databases are never encrypted.

Source

pub async fn update_key( &self, new_key: &DatabaseKey, ) -> Result<(), CryptoKeystoreError>

Change the encryption key for this database.

Source

pub async fn close(self) -> Result<(), CryptoKeystoreError>

Source

pub async fn wipe(self) -> Result<(), CryptoKeystoreError>

Close and remove this database.

This deletes the database, including its encryption key. Future opens will always succeed with any arbitrary encryption key; they will simply open an empty database.

Source

pub async fn location(&self) -> Option<String>

Get the location of the database.

Returns None if the database is in-memory.

Source

pub async fn export_copy( &self, destination_path: &str, ) -> Result<(), CryptoKeystoreError>

Export a copy of the database to the specified path using VACUUM INTO.

This creates a fully vacuumed and optimized copy of the database. The copy will be encrypted with the same key as the source database.

§Arguments
  • destination_path - The file path where the database copy should be created
Source§

impl Database

Source

pub async fn mls_fetch_key_packages<V>( &self, count: u32, ) -> Result<Vec<V>, CryptoKeystoreError>
where V: MlsEntity,

Fetches Keypackages

§Arguments
  • count - amount of entries to be returned
§Errors

Any common error that can happen during a database connection. IoError being a common error for example.

Source

pub async fn mls_group_exists(&self, group_id: impl AsRef<[u8]> + Send) -> bool

Checks if the given MLS group id exists in the keystore Note: in case of any error, this will return false

§Arguments
  • group_id - group/conversation id
Source

pub async fn mls_group_persist( &self, group_id: impl AsRef<[u8]> + Send, state: &[u8], parent_group_id: Option<&[u8]>, ) -> Result<(), CryptoKeystoreError>

Persists a MlsGroup

§Arguments
  • group_id - group/conversation id
  • state - the group state
§Errors

Any common error that can happen during a database connection. IoError being a common error for example.

Source

pub async fn mls_groups_restore( &self, ) -> Result<HashMap<Vec<u8>, (Option<Vec<u8>>, Vec<u8>)>, CryptoKeystoreError>

Loads MlsGroups from the database. It will be returned as a HashMap where the key is the group/conversation id and the value the group state

§Errors

Any common error that can happen during a database connection. IoError being a common error for example.

Source

pub async fn mls_group_delete( &self, group_id: impl AsRef<[u8]> + Send, ) -> Result<(), CryptoKeystoreError>

Deletes MlsGroups from the database.

§Errors

Any common error that can happen during a database connection. IoError being a common error for example.

Source

pub async fn mls_pending_groups_save( &self, group_id: impl AsRef<[u8]> + Send, mls_group: &[u8], custom_configuration: &[u8], parent_group_id: Option<&[u8]>, ) -> Result<(), CryptoKeystoreError>

Saves a MlsGroup in a temporary table (typically used in scenarios where the group cannot be committed until the backend acknowledges it, like external commits)

§Arguments
  • group_id - group/conversation id
  • mls_group - the group/conversation state
  • custom_configuration - local group configuration
§Errors

Any common error that can happen during a database connection. IoError being a common error for example.

Source

pub async fn mls_pending_groups_load( &self, group_id: impl AsRef<[u8]> + Send, ) -> Result<Option<(Vec<u8>, Vec<u8>)>, CryptoKeystoreError>

Loads a temporary MlsGroup and its configuration from the database

§Arguments
  • id - group/conversation id
§Errors

Any common error that can happen during a database connection. IoError being a common error for example.

Source

pub async fn mls_pending_groups_delete( &self, group_id: impl AsRef<[u8]> + Send, ) -> Result<(), CryptoKeystoreError>

Deletes a temporary MlsGroup from the database

§Arguments
  • id - group/conversation id
§Errors

Any common error that can happen during a database connection. IoError being a common error for example.

Source

pub async fn save_e2ei_enrollment( &self, id: &[u8], content: &[u8], ) -> Result<(), CryptoKeystoreError>

Persists an enrollment instance

§Arguments
  • id - hash of the enrollment and unique identifier
  • content - serialized enrollment
Source

pub async fn pop_e2ei_enrollment( &self, id: &[u8], ) -> Result<Option<Vec<u8>>, CryptoKeystoreError>

Fetches and delete the enrollment instance

§Arguments
  • id - hash of the enrollment and unique identifier
Source§

impl Database

Source

pub async fn proteus_store_prekey( &self, id: u16, prekey: &[u8], ) -> Result<(), CryptoKeystoreError>

Trait Implementations§

Source§

impl Debug for Database

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl FetchFromDatabase for Database

Source§

fn get<'life0, 'life1, 'async_trait, E>( &'life0 self, id: &'life1 <E as PrimaryKey>::PrimaryKey, ) -> Pin<Box<dyn Future<Output = Result<Option<E>, CryptoKeystoreError>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, E: 'static + Entity + Clone + Send + Sync + 'async_trait, Database: 'async_trait,

Get an instance of E from the database by its primary key.
Source§

fn get_borrowed<'life0, 'life1, 'async_trait, E>( &'life0 self, id: &'life1 <E as BorrowPrimaryKey>::BorrowedPrimaryKey, ) -> Pin<Box<dyn Future<Output = Result<Option<E>, CryptoKeystoreError>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, E: 'static + EntityGetBorrowed + Clone + Send + Sync + 'async_trait, <E as PrimaryKey>::PrimaryKey: Borrow<<E as BorrowPrimaryKey>::BorrowedPrimaryKey>, &'a <E as BorrowPrimaryKey>::BorrowedPrimaryKey: for<'a> KeyType, Database: 'async_trait,

Get an instance of E from the database by the borrowed form of its primary key.
Source§

fn count<'life0, 'async_trait, E>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<u32, CryptoKeystoreError>> + Send + 'async_trait>>
where 'life0: 'async_trait, E: 'static + Entity + Clone + Send + Sync + 'async_trait, Database: 'async_trait,

Count the number of Es in the database.
Source§

fn load_all<'life0, 'async_trait, E>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Vec<E>, CryptoKeystoreError>> + Send + 'async_trait>>
where 'life0: 'async_trait, E: 'static + Entity + Clone + Send + Sync + 'async_trait, Database: 'async_trait,

Load all Es from the database.
Source§

fn search<'life0, 'life1, 'async_trait, E, SearchKey>( &'life0 self, search_key: &'life1 SearchKey, ) -> Pin<Box<dyn Future<Output = Result<Vec<E>, CryptoKeystoreError>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, E: 'static + Entity + SearchableEntity<SearchKey> + Clone + Send + Sync + 'async_trait, SearchKey: KeyType + 'async_trait, Database: 'async_trait,

Search for relevant instances of E given a search key.
Source§

fn get_unique<'a, 'life0, 'async_trait, U>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Option<U>, CryptoKeystoreError>> + Send + 'async_trait>>
where 'a: 'async_trait, 'life0: 'async_trait, U: 'static + UniqueEntityExt + Entity + Clone + Send + Sync + 'async_trait, Self: 'async_trait,

Get the requested unique entity from the database.
Source§

fn exists<'a, 'life0, 'async_trait, U>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<bool, CryptoKeystoreError>> + Send + 'async_trait>>
where 'a: 'async_trait, 'life0: 'async_trait, U: 'static + UniqueEntityExt + Entity + Clone + Send + Sync + 'async_trait, Self: 'async_trait,

Determine whether a unique entity is present in the database.
Source§

impl OpenMlsKeyStore for Database

Source§

type Error = CryptoKeystoreError

The error type returned by the [OpenMlsKeyStore].
Source§

fn store<'life0, 'life1, 'life2, 'async_trait, V>( &'life0 self, id: &'life1 [u8], value: &'life2 V, ) -> Pin<Box<dyn Future<Output = Result<(), <Database as OpenMlsKeyStore>::Error>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, Database: Sized + 'async_trait, V: 'async_trait + MlsEntity + Sync,

Store a value v that implements the [MlsEntity] trait for serialization for ID k. Read more
Source§

fn read<'life0, 'life1, 'async_trait, V>( &'life0 self, id: &'life1 [u8], ) -> Pin<Box<dyn Future<Output = Option<V>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, Database: Sized + 'async_trait, V: 'async_trait + MlsEntity,

Read and return a value stored for ID k that implements the [MlsEntity] trait for deserialization. Read more
Source§

fn delete<'life0, 'life1, 'async_trait, V>( &'life0 self, id: &'life1 [u8], ) -> Pin<Box<dyn Future<Output = Result<(), <Database as OpenMlsKeyStore>::Error>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, V: 'async_trait + MlsEntity, Database: 'async_trait,

Delete a value stored for ID k. Read more
Source§

impl PreKeyStore for Database

Source§

type Error = CryptoKeystoreError

Source§

fn prekey<'life0, 'async_trait>( &'life0 self, id: u16, ) -> Pin<Box<dyn Future<Output = Result<Option<Vec<u8>>, <Database as PreKeyStore>::Error>> + Send + 'async_trait>>
where 'life0: 'async_trait, Database: 'async_trait,

Lookup prekey by ID.
Source§

fn remove<'life0, 'async_trait>( &'life0 self, id: u16, ) -> Pin<Box<dyn Future<Output = Result<(), <Database as PreKeyStore>::Error>> + Send + 'async_trait>>
where 'life0: 'async_trait, Database: 'async_trait,

Remove prekey by ID.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> ErasedDestructor for T
where T: 'static,

§

impl<T> MaybeSendSync for T