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        let connection = ConnectionBuilder::open_file(&dir_path.join("cardano_tx.db"))
45            .with_options(&[ConnectionOptions::EnableForeignKeys])
46            .with_migrations(crate::database::cardano_transaction_migration::get_migrations())
47            .build()?;
48        Ok(connection)
49    }
50
51    #[cfg(test)]
52    pub(crate) fn insert_cardano_blocks_and_transaction(
53        connection: &SqliteConnection,
54        blocks_with_txs: Vec<CardanoBlockWithTransactions>,
55    ) {
56        let (blocks_records, transactions_records) = blocks_with_txs.into_records();
57
58        connection
59            .apply(InsertCardanoBlockQuery::insert_many(blocks_records).unwrap())
60            .unwrap();
61        if !transactions_records.is_empty() {
62            connection
63                .apply(InsertCardanoTransactionQuery::insert_many(transactions_records).unwrap())
64                .unwrap();
65        }
66    }
67}