Skip to main content

reinhardt_query/query/schema/
alter_schema.rs

1//! ALTER SCHEMA statement builder
2//!
3//! This module provides the `AlterSchemaStatement` type for building SQL ALTER SCHEMA queries.
4
5use crate::{
6	backend::QueryBuilder,
7	types::{DynIden, IntoIden},
8};
9
10use crate::query::traits::{QueryBuilderTrait, QueryStatementBuilder, QueryStatementWriter};
11
12/// ALTER SCHEMA operation types
13///
14/// This enum represents the different operations that can be performed on a schema.
15///
16/// # Examples
17///
18/// ```rust
19/// use reinhardt_query::query::AlterSchemaOperation;
20/// use reinhardt_query::types::IntoIden;
21///
22/// // Rename schema
23/// let op = AlterSchemaOperation::RenameTo("new_schema".into_iden());
24///
25/// // Change owner
26/// let op = AlterSchemaOperation::OwnerTo("new_owner".into_iden());
27/// ```
28#[derive(Debug, Clone)]
29pub enum AlterSchemaOperation {
30	/// RENAME TO new_name
31	RenameTo(DynIden),
32	/// OWNER TO new_owner
33	OwnerTo(DynIden),
34}
35
36/// ALTER SCHEMA statement builder
37///
38/// This struct provides a fluent API for constructing ALTER SCHEMA queries.
39///
40/// # Examples
41///
42/// ```rust
43/// use reinhardt_query::prelude::*;
44///
45/// // ALTER SCHEMA old_schema RENAME TO new_schema
46/// let query = Query::alter_schema()
47///     .name("old_schema")
48///     .rename_to("new_schema");
49///
50/// // ALTER SCHEMA my_schema OWNER TO new_owner
51/// let query = Query::alter_schema()
52///     .name("my_schema")
53///     .owner_to("new_owner");
54/// ```
55#[derive(Debug, Clone)]
56pub struct AlterSchemaStatement {
57	pub(crate) schema_name: Option<DynIden>,
58	pub(crate) operation: Option<AlterSchemaOperation>,
59}
60
61impl AlterSchemaStatement {
62	/// Create a new ALTER SCHEMA statement
63	///
64	/// # Examples
65	///
66	/// ```rust
67	/// use reinhardt_query::prelude::*;
68	///
69	/// let query = Query::alter_schema();
70	/// ```
71	pub fn new() -> Self {
72		Self {
73			schema_name: None,
74			operation: None,
75		}
76	}
77
78	/// Take the ownership of data in the current [`AlterSchemaStatement`]
79	pub fn take(&mut self) -> Self {
80		Self {
81			schema_name: self.schema_name.take(),
82			operation: self.operation.take(),
83		}
84	}
85
86	/// Set the schema name
87	///
88	/// # Examples
89	///
90	/// ```rust
91	/// use reinhardt_query::prelude::*;
92	///
93	/// let query = Query::alter_schema()
94	///     .name("my_schema");
95	/// ```
96	pub fn name<N>(&mut self, name: N) -> &mut Self
97	where
98		N: IntoIden,
99	{
100		self.schema_name = Some(name.into_iden());
101		self
102	}
103
104	/// Rename the schema to a new name
105	///
106	/// # Examples
107	///
108	/// ```rust
109	/// use reinhardt_query::prelude::*;
110	///
111	/// let query = Query::alter_schema()
112	///     .name("old_schema")
113	///     .rename_to("new_schema");
114	/// ```
115	pub fn rename_to<N>(&mut self, new_name: N) -> &mut Self
116	where
117		N: IntoIden,
118	{
119		self.operation = Some(AlterSchemaOperation::RenameTo(new_name.into_iden()));
120		self
121	}
122
123	/// Change the owner of the schema
124	///
125	/// # Examples
126	///
127	/// ```rust
128	/// use reinhardt_query::prelude::*;
129	///
130	/// let query = Query::alter_schema()
131	///     .name("my_schema")
132	///     .owner_to("new_owner");
133	/// ```
134	pub fn owner_to<O>(&mut self, new_owner: O) -> &mut Self
135	where
136		O: IntoIden,
137	{
138		self.operation = Some(AlterSchemaOperation::OwnerTo(new_owner.into_iden()));
139		self
140	}
141}
142
143impl Default for AlterSchemaStatement {
144	fn default() -> Self {
145		Self::new()
146	}
147}
148
149impl QueryStatementBuilder for AlterSchemaStatement {
150	fn build_any(&self, query_builder: &dyn QueryBuilderTrait) -> (String, crate::value::Values) {
151		// Downcast to concrete QueryBuilder type
152		use std::any::Any;
153		if let Some(builder) =
154			(query_builder as &dyn Any).downcast_ref::<crate::backend::PostgresQueryBuilder>()
155		{
156			return builder.build_alter_schema(self);
157		}
158		if let Some(builder) =
159			(query_builder as &dyn Any).downcast_ref::<crate::backend::MySqlQueryBuilder>()
160		{
161			return builder.build_alter_schema(self);
162		}
163		if let Some(builder) =
164			(query_builder as &dyn Any).downcast_ref::<crate::backend::SqliteQueryBuilder>()
165		{
166			return builder.build_alter_schema(self);
167		}
168		panic!("Unsupported query builder type");
169	}
170}
171
172impl QueryStatementWriter for AlterSchemaStatement {}
173
174#[cfg(test)]
175mod tests {
176	use super::*;
177	use rstest::*;
178
179	#[rstest]
180	fn test_alter_schema_new() {
181		let stmt = AlterSchemaStatement::new();
182		assert!(stmt.schema_name.is_none());
183		assert!(stmt.operation.is_none());
184	}
185
186	#[rstest]
187	fn test_alter_schema_with_name() {
188		let mut stmt = AlterSchemaStatement::new();
189		stmt.name("my_schema");
190		assert_eq!(stmt.schema_name.as_ref().unwrap().to_string(), "my_schema");
191	}
192
193	#[rstest]
194	fn test_alter_schema_rename_to() {
195		let mut stmt = AlterSchemaStatement::new();
196		stmt.name("old_schema").rename_to("new_schema");
197		assert_eq!(stmt.schema_name.as_ref().unwrap().to_string(), "old_schema");
198		match &stmt.operation {
199			Some(AlterSchemaOperation::RenameTo(name)) => {
200				assert_eq!(name.to_string(), "new_schema");
201			}
202			_ => panic!("Expected RenameTo operation"),
203		}
204	}
205
206	#[rstest]
207	fn test_alter_schema_owner_to() {
208		let mut stmt = AlterSchemaStatement::new();
209		stmt.name("my_schema").owner_to("new_owner");
210		assert_eq!(stmt.schema_name.as_ref().unwrap().to_string(), "my_schema");
211		match &stmt.operation {
212			Some(AlterSchemaOperation::OwnerTo(owner)) => {
213				assert_eq!(owner.to_string(), "new_owner");
214			}
215			_ => panic!("Expected OwnerTo operation"),
216		}
217	}
218
219	#[rstest]
220	fn test_alter_schema_take() {
221		let mut stmt = AlterSchemaStatement::new();
222		stmt.name("my_schema").rename_to("new_schema");
223		let taken = stmt.take();
224		assert!(stmt.schema_name.is_none());
225		assert!(stmt.operation.is_none());
226		assert_eq!(taken.schema_name.as_ref().unwrap().to_string(), "my_schema");
227		match &taken.operation {
228			Some(AlterSchemaOperation::RenameTo(name)) => {
229				assert_eq!(name.to_string(), "new_schema");
230			}
231			_ => panic!("Expected RenameTo operation"),
232		}
233	}
234}