mithril_persistence/database/record/
cardano_transaction.rs

1use sqlite::Row;
2
3use mithril_common::entities::{
4    BlockHash, BlockNumber, CardanoTransaction, SlotNumber, TransactionHash,
5};
6
7use crate::database::Hydrator;
8use crate::sqlite::{HydrationError, Projection, SqLiteEntity};
9
10/// Cardano Transaction record is the representation of a cardano transaction.
11///
12/// It can't be stored in the database directly and must be obtained using a join with the block table.
13#[derive(Debug, PartialEq, Clone)]
14pub struct CardanoTransactionRecord {
15    /// Unique hash of the transaction
16    pub transaction_hash: TransactionHash,
17
18    /// Block number of the transaction
19    pub block_number: BlockNumber,
20
21    /// Slot number of the transaction
22    pub slot_number: SlotNumber,
23
24    /// Block hash of the transaction
25    pub block_hash: BlockHash,
26}
27
28impl CardanoTransactionRecord {
29    /// CardanoTransactionRecord factory
30    pub fn new<T: Into<TransactionHash>, U: Into<BlockHash>>(
31        hash: T,
32        block_number: BlockNumber,
33        slot_number: SlotNumber,
34        block_hash: U,
35    ) -> Self {
36        Self {
37            transaction_hash: hash.into(),
38            block_number,
39            slot_number,
40            block_hash: block_hash.into(),
41        }
42    }
43}
44
45impl From<CardanoTransaction> for CardanoTransactionRecord {
46    fn from(transaction: CardanoTransaction) -> Self {
47        Self {
48            transaction_hash: transaction.transaction_hash,
49            block_number: transaction.block_number,
50            slot_number: transaction.slot_number,
51            block_hash: transaction.block_hash,
52        }
53    }
54}
55
56impl From<CardanoTransactionRecord> for CardanoTransaction {
57    fn from(other: CardanoTransactionRecord) -> CardanoTransaction {
58        CardanoTransaction {
59            transaction_hash: other.transaction_hash,
60            block_number: other.block_number,
61            slot_number: other.slot_number,
62            block_hash: other.block_hash,
63        }
64    }
65}
66
67impl SqLiteEntity for CardanoTransactionRecord {
68    fn hydrate(row: Row) -> Result<Self, HydrationError>
69    where
70        Self: Sized,
71    {
72        let transaction_hash = row.read::<&str, _>(0);
73        let block_number =
74            Hydrator::try_to_u64("cardano_block.block_number", row.read::<i64, _>(1))?;
75        let slot_number = Hydrator::try_to_u64("cardano_block.slot_number", row.read::<i64, _>(2))?;
76        let block_hash = row.read::<&str, _>(3);
77
78        Ok(Self {
79            transaction_hash: transaction_hash.to_string(),
80            block_number: BlockNumber(block_number),
81            slot_number: SlotNumber(slot_number),
82            block_hash: block_hash.to_string(),
83        })
84    }
85
86    fn get_projection() -> Projection {
87        Projection::from(&[
88            (
89                "transaction_hash",
90                "{:cardano_tx:}.transaction_hash",
91                "text",
92            ),
93            ("block_number", "{:cardano_block:}.block_number", "int"),
94            ("slot_number", "{:cardano_block:}.slot_number", "int"),
95            ("block_hash", "{:cardano_tx:}.block_hash", "text"),
96        ])
97    }
98}