1use 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}