sea_query/extension/postgres/
extension.rs1use crate::{QueryBuilder, QuotedBuilder, SqlWriter};
2
3#[derive(Debug, Default, Clone, PartialEq, Eq)]
7pub struct Extension;
8
9impl Extension {
10 pub fn create() -> ExtensionCreateStatement {
12 ExtensionCreateStatement::new()
13 }
14
15 pub fn drop() -> ExtensionDropStatement {
17 ExtensionDropStatement::new()
18 }
19}
20
21#[derive(Debug, Default, Clone, PartialEq, Eq)]
57pub struct ExtensionCreateStatement {
58 pub(crate) name: String,
59 pub(crate) schema: Option<String>,
60 pub(crate) version: Option<String>,
61
62 pub(crate) if_not_exists: bool,
64
65 pub(crate) cascade: bool,
67}
68
69impl ExtensionCreateStatement {
70 pub fn new() -> Self {
71 Self::default()
72 }
73
74 pub fn name<T: Into<String>>(&mut self, name: T) -> &mut Self {
76 self.name = name.into();
77 self
78 }
79
80 pub fn schema<T: Into<String>>(&mut self, schema: T) -> &mut Self {
82 self.schema = Some(schema.into());
83 self
84 }
85
86 pub fn version<T: Into<String>>(&mut self, version: T) -> &mut Self {
88 self.version = Some(version.into());
89 self
90 }
91
92 pub fn cascade(&mut self) -> &mut Self {
94 self.cascade = true;
95 self
96 }
97
98 pub fn if_not_exists(&mut self) -> &mut Self {
100 self.if_not_exists = true;
101 self
102 }
103}
104
105#[derive(Debug, Default, Clone, PartialEq, Eq)]
136pub struct ExtensionDropStatement {
137 pub(crate) name: String,
138 pub(crate) schema: Option<String>,
139 pub(crate) version: Option<String>,
140
141 pub(crate) if_exists: bool,
143
144 pub(crate) restrict: bool,
146
147 pub(crate) cascade: bool,
149}
150
151impl ExtensionDropStatement {
152 pub fn new() -> Self {
153 Self::default()
154 }
155
156 pub fn name<T: Into<String>>(&mut self, name: T) -> &mut Self {
158 self.name = name.into();
159 self
160 }
161
162 pub fn if_exists(&mut self) -> &mut Self {
164 self.if_exists = true;
165 self
166 }
167
168 pub fn cascade(&mut self) -> &mut Self {
170 self.cascade = true;
171 self
172 }
173
174 pub fn restrict(&mut self) -> &mut Self {
176 self.restrict = true;
177 self
178 }
179}
180
181pub trait ExtensionBuilder: QuotedBuilder {
182 fn prepare_extension_create_statement(
184 &self,
185 create: &ExtensionCreateStatement,
186 sql: &mut dyn SqlWriter,
187 );
188
189 fn prepare_extension_drop_statement(
191 &self,
192 drop: &ExtensionDropStatement,
193 sql: &mut dyn SqlWriter,
194 );
195}
196
197macro_rules! impl_extension_statement_builder {
198 ( $struct_name: ident, $func_name: ident ) => {
199 impl $struct_name {
200 pub fn build_ref<T: ExtensionBuilder>(&self, extension_builder: &T) -> String {
201 let mut sql = String::with_capacity(256);
202 self.build_collect_ref(extension_builder, &mut sql)
203 }
204
205 pub fn build_collect<T: ExtensionBuilder>(
206 &self,
207 extension_builder: T,
208 sql: &mut dyn SqlWriter,
209 ) -> String {
210 self.build_collect_ref(&extension_builder, sql)
211 }
212
213 pub fn build_collect_ref<T: ExtensionBuilder>(
214 &self,
215 extension_builder: &T,
216 sql: &mut dyn SqlWriter,
217 ) -> String {
218 extension_builder.$func_name(self, sql);
219 sql.to_string()
220 }
221
222 pub fn to_string<T>(&self, extension_builder: T) -> String
224 where
225 T: ExtensionBuilder + QueryBuilder,
226 {
227 self.build_ref(&extension_builder)
228 }
229 }
230 };
231}
232
233impl_extension_statement_builder!(ExtensionCreateStatement, prepare_extension_create_statement);
234impl_extension_statement_builder!(ExtensionDropStatement, prepare_extension_drop_statement);
235
236#[cfg(test)]
237mod test {
238 use super::super::PgLTree;
239 use super::*;
240
241 #[test]
242 fn creates_a_stmt_for_create_extension() {
243 let create_extension_stmt = Extension::create()
244 .name(PgLTree)
245 .schema("public")
246 .version("v0.1.0")
247 .cascade()
248 .if_not_exists()
249 .to_owned();
250
251 assert_eq!(create_extension_stmt.name, "ltree");
252 assert_eq!(create_extension_stmt.schema, Some("public".to_string()));
253 assert_eq!(create_extension_stmt.version, Some("v0.1.0".to_string()));
254 assert!(create_extension_stmt.cascade);
255 assert!(create_extension_stmt.if_not_exists);
256 }
257
258 #[test]
259 fn creates_a_stmt_for_drop_extension() {
260 let drop_extension_stmt = Extension::drop()
261 .name(PgLTree)
262 .cascade()
263 .if_exists()
264 .restrict()
265 .to_owned();
266
267 assert_eq!(drop_extension_stmt.name, "ltree");
268 assert!(drop_extension_stmt.cascade);
269 assert!(drop_extension_stmt.if_exists);
270 assert!(drop_extension_stmt.restrict);
271 }
272}