schema_sql_generator/common/
sql_generator.rs1use 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}