Skip to main content

schema_sql_generator/common/
sql_generator.rs

1use crate::common::function_generator::FunctionGenerator;
2use crate::common::generator_context::GeneratorContext;
3use crate::common::index_generator::IndexGenerator;
4use crate::common::other_sql_generator::OtherSqlGenerator;
5use crate::common::output_mode::OutputMode;
6use crate::common::procedure_generator::ProcedureGenerator;
7use crate::common::relation_generator::RelationGenerator;
8use crate::common::table_generator::TableGenerator;
9use crate::common::trigger_generator::TriggerGenerator;
10use crate::common::view_generator::ViewGenerator;
11use schema_model::model::types::ForeignKeyMode;
12
13pub trait SqlGenerator {
14    fn context(&self) -> &GeneratorContext;
15
16    fn generate(&self)  {
17        self.output_sql();
18    }
19
20    fn output_sql(&self) {
21        self.output_header();
22
23        if self.context().settings().output_mode() == OutputMode::IndexesOnly {
24            self.output_indexes();
25        } else if self.context().settings().output_mode() == OutputMode::TriggersOnly {
26            self.output_triggers();
27        } else {
28            self.output_other_sql_top();
29            self.output_tables();
30
31            if self.context().settings().foreign_key_mode() == ForeignKeyMode::Relations {
32                self.output_relations();
33            }
34
35            self.output_triggers();
36            self.output_functions();
37            self.output_views();
38            self.output_procedures();
39            self.output_other_sql_bottom();
40        }
41    }
42
43    fn output_header(&self);
44
45    fn output_tables(&self);
46
47    fn output_relations(&self);
48
49    fn output_indexes(&self);
50
51    fn output_triggers(&self);
52
53    fn output_functions(&self);
54
55    fn output_views(&self);
56
57    fn output_procedures(&self);
58
59    fn output_other_sql_top(&self);
60
61    fn output_other_sql_bottom(&self);
62}
63
64pub struct DefaultSqlGenerator {
65    context: GeneratorContext,
66    table_generator: Box<dyn TableGenerator>,
67    relation_generator: Box<dyn RelationGenerator>,
68    index_generator: Box<dyn IndexGenerator>,
69    function_generator: Box<dyn FunctionGenerator>,
70    view_generator: Box<dyn ViewGenerator>,
71    procedure_generator: Box<dyn ProcedureGenerator>,
72    trigger_generator: Box<dyn TriggerGenerator>,
73    other_sql_generator: Box<dyn OtherSqlGenerator>,
74}
75
76impl DefaultSqlGenerator {
77    pub fn new(
78        context: GeneratorContext,
79        table_generator: Box<dyn TableGenerator>,
80        relation_generator: Box<dyn RelationGenerator>,
81        index_generator: Box<dyn IndexGenerator>,
82        function_generator: Box<dyn FunctionGenerator>,
83        view_generator: Box<dyn ViewGenerator>,
84        procedure_generator: Box<dyn ProcedureGenerator>,
85        trigger_generator: Box<dyn TriggerGenerator>,
86        other_sql_generator: Box<dyn OtherSqlGenerator>,
87    ) -> Self {
88        Self {
89            context,
90            table_generator,
91            relation_generator,
92            index_generator,
93            function_generator,
94            view_generator,
95            procedure_generator,
96            trigger_generator,
97            other_sql_generator,
98        }
99    }
100}
101
102impl SqlGenerator for DefaultSqlGenerator {
103    fn context(&self) -> &GeneratorContext {
104        &self.context
105    }
106
107    fn generate(&self) {
108        self.output_sql();
109    }
110
111    fn output_sql(&self) {
112        self.output_header();
113
114        if self.context.settings().output_mode() == OutputMode::IndexesOnly {
115            self.output_indexes();
116        } else if self.context.settings().output_mode() == OutputMode::TriggersOnly {
117            self.output_triggers();
118        } else {
119            self.output_other_sql_top();
120            self.output_tables();
121
122            if self.context.settings().foreign_key_mode() == ForeignKeyMode::Relations {
123                self.output_relations();
124            }
125
126            self.output_triggers();
127            self.output_functions();
128            self.output_views();
129            self.output_procedures();
130            self.output_other_sql_bottom();
131        }
132    }
133
134    fn output_header(&self) {
135    }
136
137    fn output_tables(&self) {
138        self.table_generator.output_tables();
139    }
140
141    fn output_relations(&self) {
142        self.relation_generator.output_relations();
143    }
144
145    fn output_indexes(&self) {
146        self.index_generator.output_indexes();
147    }
148
149    fn output_triggers(&self) {
150        self.trigger_generator.output_triggers();
151    }
152
153    fn output_functions(&self) {
154        self.function_generator.output_functions();
155    }
156
157    fn output_views(&self) {
158        self.view_generator.output_views();
159    }
160
161    fn output_procedures(&self) {
162        self.procedure_generator.output_procedures();
163    }
164
165    fn output_other_sql_top(&self) {
166        self.other_sql_generator.output_other_sql_top();
167    }
168
169    fn output_other_sql_bottom(&self) {
170        self.other_sql_generator.output_other_sql_bottom();
171    }
172}