Skip to main content

safe_migrate/db/
cache.rs

1// FILE: src/db/cache.rs
2use crate::ast::identifiers::ObjectId;
3use crate::model::function::FunctionState;
4use crate::model::relation::RelationState;
5use serde::{Deserialize, Serialize};
6use std::collections::HashMap;
7
8#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
9pub struct ForeignKeyCache {
10    pub constraint_name: String,
11    pub from_table: ObjectId,
12    pub to_table: ObjectId,
13}
14
15#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
16pub struct IndexCache {
17    pub index_id: ObjectId,
18    pub table_id: ObjectId,
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct TriggerCache {
23    pub trigger_id: ObjectId,
24    pub table_id: ObjectId,
25    pub function_id: ObjectId,
26}
27
28#[derive(Debug, Clone, Serialize, Deserialize)]
29pub struct DbCache {
30    pub pg_version_num: Option<u32>,
31
32    pub relations: HashMap<ObjectId, RelationState>,
33
34    #[serde(default)]
35    pub foreign_keys: Vec<ForeignKeyCache>,
36
37    #[serde(default)]
38    pub indexes: Vec<IndexCache>,
39
40    #[serde(default)]
41    pub triggers: Vec<TriggerCache>,
42
43    #[serde(default)]
44    pub functions: HashMap<ObjectId, FunctionState>,
45}
46
47pub const CACHE_FORMAT_VERSION: u32 = 1;
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub enum DbCacheVersioned {
51    V1(DbCache),
52}
53
54impl Default for DbCache {
55    fn default() -> Self {
56        Self::new()
57    }
58}
59
60impl DbCache {
61    pub fn new() -> Self {
62        Self {
63            pg_version_num: None,
64            relations: HashMap::new(),
65            foreign_keys: Vec::new(),
66            indexes: Vec::new(),
67            triggers: Vec::new(),
68            functions: HashMap::new(),
69        }
70    }
71
72    pub fn insert_baseline(&mut self, id: ObjectId, state: RelationState) {
73        self.relations.insert(id, state);
74    }
75
76    pub fn baseline_relations(&self) -> impl Iterator<Item = (&ObjectId, &RelationState)> {
77        self.relations.iter()
78    }
79}