database_migration/migration/
mod.rs

1use crate::checksum::Checksum;
2use chrono::{DateTime, NaiveDateTime, Utc};
3use serde::{Deserialize, Serialize};
4use std::fmt::{Display, Formatter};
5use std::path::PathBuf;
6use std::time::Duration;
7
8#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
9pub enum MigrationKind {
10    Baseline,
11    Up,
12    Down,
13}
14
15impl MigrationKind {
16    pub const fn as_str(&self) -> &'static str {
17        match self {
18            Self::Baseline => "baseline",
19            Self::Up => "up",
20            Self::Down => "down",
21        }
22    }
23
24    pub fn is_backward(&self) -> bool {
25        *self == Self::Down
26    }
27
28    pub fn is_forward(&self) -> bool {
29        !self.is_backward()
30    }
31
32    pub const fn is_any(&self) -> bool {
33        true
34    }
35}
36
37impl Display for MigrationKind {
38    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
39        write!(f, "{}", self.as_str())
40    }
41}
42
43#[derive(Debug, Clone, PartialEq, Eq)]
44pub struct NewMigration {
45    pub key: NaiveDateTime,
46    pub title: String,
47    pub kind: MigrationKind,
48}
49
50#[derive(Debug, Clone, PartialEq, Eq)]
51pub struct Migration {
52    pub key: NaiveDateTime,
53    pub title: String,
54    pub kind: MigrationKind,
55    pub script_path: PathBuf,
56}
57
58#[derive(Debug, Clone, PartialEq, Eq)]
59pub struct ScriptContent {
60    pub key: NaiveDateTime,
61    pub kind: MigrationKind,
62    pub path: PathBuf,
63    pub content: String,
64    pub checksum: Checksum,
65}
66
67#[derive(Debug, Clone, PartialEq, Eq)]
68pub struct ApplicableMigration {
69    pub key: NaiveDateTime,
70    pub kind: MigrationKind,
71    pub script_content: String,
72    pub checksum: Checksum,
73}
74
75#[derive(Debug, Clone, PartialEq, Eq)]
76pub struct Execution {
77    pub key: NaiveDateTime,
78    pub applied_rank: i64,
79    pub applied_by: String,
80    pub applied_at: DateTime<Utc>,
81    pub checksum: Checksum,
82    pub execution_time: Duration,
83}
84
85#[derive(Debug, Clone, PartialEq, Eq)]
86pub struct Reversion {
87    pub key: NaiveDateTime,
88    pub reverted_by: String,
89    pub reverted_at: DateTime<Utc>,
90    pub execution_time: Duration,
91}
92
93#[derive(Debug, Clone, PartialEq, Eq)]
94pub struct ProblematicMigration {
95    pub key: NaiveDateTime,
96    pub kind: MigrationKind,
97    pub script_path: PathBuf,
98    pub problem: Problem,
99}
100
101#[derive(Debug, Clone, PartialEq, Eq)]
102pub enum Problem {
103    ChecksumMismatch {
104        definition_checksum: Checksum,
105        execution_checksum: Checksum,
106    },
107    OutOfOrder {
108        definition_key: NaiveDateTime,
109        last_applied_key: NaiveDateTime,
110    },
111}
112
113#[derive(Debug, Clone, PartialEq, Eq)]
114pub enum MigrationsTableInfo {
115    NoTables,
116    Missing,
117    Table {
118        name: String,
119        version: Option<String>,
120        definition: String,
121    },
122}
123
124#[cfg(test)]
125mod tests;