use crate::{
fuel_core_graphql_api::storage::{
blocks::FuelBlockIdsToHeights,
coins::OwnedCoins,
messages::OwnedMessageIds,
transactions::{
OwnedTransactionIndexKey,
OwnedTransactions,
TransactionStatuses,
},
},
graphql_api::ports::worker::OffChainDatabaseTransaction,
};
use fuel_core_storage::{
Error as StorageError,
Result as StorageResult,
StorageAsMut,
StorageAsRef,
StorageMutate,
kv_store::{
KeyValueInspect,
StorageColumn,
},
transactional::{
Modifiable,
StorageTransaction,
},
};
use fuel_core_types::{
fuel_tx::{
Address,
Bytes32,
},
fuel_types::BlockHeight,
services::transaction_status::TransactionExecutionStatus,
};
use statistic::StatisticTable;
pub mod assets;
pub mod balances;
pub mod blocks;
pub mod coins;
pub mod contracts;
pub mod messages;
pub mod old;
pub mod statistic;
pub mod transactions;
pub mod relayed_transactions;
const TX_COUNT: &str = "total_tx_count";
#[repr(u32)]
#[derive(
Copy,
Clone,
Debug,
strum_macros::EnumCount,
strum_macros::IntoStaticStr,
PartialEq,
Eq,
enum_iterator::Sequence,
Hash,
)]
pub enum Column {
Metadata = 0,
GenesisMetadata = 1,
OwnedCoins = 2,
TransactionStatus = 3,
TransactionsByOwnerBlockIdx = 4,
OwnedMessageIds = 5,
Statistic = 6,
FuelBlockIdsToHeights = 7,
ContractsInfo = 8,
OldFuelBlocks = 9,
OldFuelBlockConsensus = 10,
OldTransactions = 11,
RelayedTransactionStatus = 12,
SpentMessages = 13,
CoinBalances = 23,
MessageBalances = 24,
AssetsInfo = 25,
CoinsToSpend = 26,
}
impl Column {
pub const COUNT: usize = <Self as strum::EnumCount>::COUNT;
pub fn as_u32(&self) -> u32 {
*self as u32
}
}
impl StorageColumn for Column {
fn name(&self) -> String {
let str: &str = self.into();
str.to_string()
}
fn id(&self) -> u32 {
self.as_u32()
}
}
impl<S> OffChainDatabaseTransaction for StorageTransaction<S>
where
S: KeyValueInspect<Column = Column> + Modifiable,
StorageTransaction<S>: StorageMutate<OwnedMessageIds, Error = StorageError>
+ StorageMutate<OwnedCoins, Error = StorageError>
+ StorageMutate<FuelBlockIdsToHeights, Error = StorageError>,
{
fn record_tx_id_owner(
&mut self,
owner: &Address,
block_height: BlockHeight,
tx_idx: u16,
tx_id: &Bytes32,
) -> StorageResult<()> {
self.storage::<OwnedTransactions>().insert(
&OwnedTransactionIndexKey::new(owner, block_height, tx_idx),
tx_id,
)
}
fn update_tx_status(
&mut self,
id: &Bytes32,
status: TransactionExecutionStatus,
) -> StorageResult<Option<TransactionExecutionStatus>> {
self.storage::<TransactionStatuses>().replace(id, &status)
}
fn increase_tx_count(&mut self, new_txs_count: u64) -> StorageResult<u64> {
let current_tx_count: u64 = self.get_tx_count()?;
let new_tx_count = current_tx_count.saturating_add(new_txs_count);
<_ as StorageMutate<StatisticTable<u64>>>::insert(self, TX_COUNT, &new_tx_count)?;
Ok(new_tx_count)
}
fn get_tx_count(&self) -> StorageResult<u64> {
let tx_count = self
.storage::<StatisticTable<u64>>()
.get(TX_COUNT)?
.unwrap_or_default()
.into_owned();
Ok(tx_count)
}
fn commit(self) -> StorageResult<()> {
self.commit()?;
Ok(())
}
}