use std::collections::HashSet;
use schemerz_rusqlite::RusqliteMigration;
use uuid::Uuid;
use crate::wallet::init::WalletMigrationError;
use super::v_transactions_pool_crossing;
pub const MIGRATION_ID: Uuid = Uuid::from_u128(0x0a35a9e4_6c1d_4f7a_9c02_51b8de4f7c33);
const DEPENDENCIES: &[Uuid] = &[v_transactions_pool_crossing::MIGRATION_ID];
pub(super) struct Migration;
impl schemerz::Migration<Uuid> for Migration {
fn id(&self) -> Uuid {
MIGRATION_ID
}
fn dependencies(&self) -> HashSet<Uuid> {
DEPENDENCIES.iter().copied().collect()
}
fn description(&self) -> &'static str {
"Adds a column recording each transaction's ZIP 318 classification."
}
}
impl RusqliteMigration for Migration {
type Error = WalletMigrationError;
fn up(&self, conn: &rusqlite::Transaction) -> Result<(), WalletMigrationError> {
conn.execute_batch(
"ALTER TABLE transactions
ADD COLUMN zip318_kind INTEGER NOT NULL DEFAULT 0;",
)?;
Ok(())
}
fn down(&self, conn: &rusqlite::Transaction) -> Result<(), WalletMigrationError> {
conn.execute_batch("ALTER TABLE transactions DROP COLUMN zip318_kind;")?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use zcash_protocol::zip318::Zip318Classification;
use crate::wallet::init::migrations::tests::test_migrate;
#[test]
fn migrate() {
test_migrate(&[super::MIGRATION_ID]);
}
#[test]
fn the_column_default_means_unclassified() {
assert_eq!(Zip318Classification::Unknown.to_code(), 0);
assert_ne!(Zip318Classification::Nonconforming.to_code(), 0);
}
}