mithril_persistence/database/
mod.rs

1//! database module.
2//! This module contains queries and entities shared between all application types.
3
4pub mod cardano_transaction_migration;
5mod db_version;
6mod hydrator;
7pub(crate) mod query;
8pub mod record;
9pub mod repository;
10mod version_checker;
11
12pub use db_version::*;
13pub use hydrator::Hydrator;
14pub use version_checker::{DatabaseVersionChecker, SqlMigration};
15
16/// Database version.
17pub type DbVersion = i64;
18
19#[cfg(test)]
20pub(crate) mod test_helper {
21    use std::path::Path;
22
23    use mithril_common::StdResult;
24    use mithril_common::entities::CardanoBlockWithTransactions;
25
26    use crate::database::query::{InsertCardanoBlockQuery, InsertCardanoTransactionQuery};
27    use crate::database::record::IntoRecords;
28    use crate::sqlite::{
29        ConnectionBuilder, ConnectionExtensions, ConnectionOptions, SqliteConnection,
30    };
31
32    /// In-memory sqlite database with foreign key support and cardano db migrations applied
33    pub fn cardano_tx_db_connection() -> StdResult<SqliteConnection> {
34        let connection = ConnectionBuilder::open_memory()
35            .with_options(&[ConnectionOptions::EnableForeignKeys])
36            .with_migrations(crate::database::cardano_transaction_migration::get_migrations())
37            .build()?;
38        Ok(connection)
39    }
40
41    /// In-memory sqlite database with foreign key support and cardano db migrations applied
42    #[allow(unused)] // Useful for debugging
43    pub fn cardano_tx_db_connection_file(dir_path: &Path) -> StdResult<SqliteConnection> {
44        cardano_tx_db_connection_builder(dir_path).build()
45    }
46
47    /// File sqlite database with foreign key support and cardano db migrations applied
48    pub fn cardano_tx_db_connection_builder(dir_path: &Path) -> ConnectionBuilder {
49        ConnectionBuilder::open_file(&dir_path.join("cardano_tx.db"))
50            .with_options(&[ConnectionOptions::EnableForeignKeys])
51            .with_migrations(crate::database::cardano_transaction_migration::get_migrations())
52    }
53
54    #[cfg(test)]
55    pub(crate) fn insert_cardano_blocks_and_transaction(
56        connection: &SqliteConnection,
57        blocks_with_txs: Vec<CardanoBlockWithTransactions>,
58    ) {
59        let (blocks_records, transactions_records) = blocks_with_txs.into_records();
60
61        connection
62            .apply(InsertCardanoBlockQuery::insert_many(blocks_records).unwrap())
63            .unwrap();
64        if !transactions_records.is_empty() {
65            connection
66                .apply(InsertCardanoTransactionQuery::insert_many(transactions_records).unwrap())
67                .unwrap();
68        }
69    }
70}