Skip to main content

surrealdb_expr/expr/statements/alter/
mod.rs

1use revision::{DeserializeRevisioned, Revisioned, SerializeRevisioned};
2use surrealdb_types::{SqlFormat, ToSql};
3
4pub mod access;
5pub mod analyzer;
6pub mod api;
7pub mod bucket;
8pub mod config;
9pub mod database;
10pub mod event;
11pub mod field;
12pub mod function;
13pub mod index;
14pub mod module;
15pub mod namespace;
16pub mod param;
17pub mod sequence;
18pub mod system;
19pub mod table;
20pub mod user;
21
22pub use access::AlterAccessStatement;
23pub use analyzer::AlterAnalyzerStatement;
24pub use api::{AlterApiClause, AlterApiStatement};
25pub use bucket::AlterBucketStatement;
26pub use config::AlterConfigStatement;
27pub use database::AlterDatabaseStatement;
28pub use event::AlterEventStatement;
29pub use field::{AlterDefault, AlterFieldStatement};
30pub use function::AlterFunctionStatement;
31pub use index::AlterIndexStatement;
32pub use module::AlterModuleStatement;
33pub use namespace::AlterNamespaceStatement;
34pub use param::AlterParamStatement;
35pub use sequence::AlterSequenceStatement;
36pub use system::AlterSystemStatement;
37pub use table::AlterTableStatement;
38pub use user::AlterUserStatement;
39#[derive(Clone, Debug, Default, Eq, PartialEq, Hash)]
40/// Helper to express a tri‑state alteration:
41/// - `None`: leave the current value unchanged
42/// - `Set(T)`: set/replace the current value to `T`
43/// - `Drop`: remove/clear the current value
44pub enum AlterKind<T> {
45	#[default]
46	None,
47	Set(T),
48	Drop,
49}
50
51impl<T: Revisioned> Revisioned for AlterKind<T> {
52	fn revision() -> u16 {
53		1
54	}
55}
56
57impl<T: Revisioned + SerializeRevisioned> SerializeRevisioned for AlterKind<T> {
58	fn serialize_revisioned<W: std::io::Write>(
59		&self,
60		w: &mut W,
61	) -> std::result::Result<(), revision::Error> {
62		SerializeRevisioned::serialize_revisioned(&Self::revision(), w)?;
63		match self {
64			AlterKind::None => SerializeRevisioned::serialize_revisioned(&0u32, w)?,
65			AlterKind::Set(x) => {
66				SerializeRevisioned::serialize_revisioned(&1u32, w)?;
67				SerializeRevisioned::serialize_revisioned(x, w)?;
68			}
69			AlterKind::Drop => {
70				SerializeRevisioned::serialize_revisioned(&2u32, w)?;
71			}
72		}
73		Ok(())
74	}
75}
76
77impl<T: Revisioned + DeserializeRevisioned> DeserializeRevisioned for AlterKind<T> {
78	fn deserialize_revisioned<R: std::io::Read>(
79		r: &mut R,
80	) -> std::result::Result<Self, revision::Error>
81	where
82		Self: Sized,
83	{
84		match DeserializeRevisioned::deserialize_revisioned(r)? {
85			1u16 => {
86				let variant: u32 = DeserializeRevisioned::deserialize_revisioned(r)?;
87				match variant {
88					0 => Ok(AlterKind::None),
89					1 => Ok(AlterKind::Set(DeserializeRevisioned::deserialize_revisioned(r)?)),
90					2 => Ok(AlterKind::Drop),
91					x => Err(revision::Error::Deserialize(format!(
92						"Unknown variant `{x}` for AlterKind"
93					))),
94				}
95			}
96			x => Err(revision::Error::Deserialize(format!("Unknown revision `{x}` for AlterKind"))),
97		}
98	}
99}
100
101#[derive(Clone, Debug, Eq, PartialEq, Hash)]
102/// Execution‑time representation of all `ALTER` statements.
103///
104/// Variants map to specific resources and delegate execution to their
105/// corresponding implementations.
106pub enum AlterStatement {
107	System(AlterSystemStatement),
108	Namespace(AlterNamespaceStatement),
109	Database(AlterDatabaseStatement),
110	Table(AlterTableStatement),
111	Api(AlterApiStatement),
112	Event(AlterEventStatement),
113	Index(AlterIndexStatement),
114	Sequence(AlterSequenceStatement),
115	Field(Box<AlterFieldStatement>),
116	Param(AlterParamStatement),
117	Bucket(AlterBucketStatement),
118	Config(AlterConfigStatement),
119	Analyzer(AlterAnalyzerStatement),
120	Function(AlterFunctionStatement),
121	User(AlterUserStatement),
122	Access(AlterAccessStatement),
123	Module(AlterModuleStatement),
124}
125
126impl ToSql for AlterStatement {
127	fn fmt_sql(&self, f: &mut String, fmt: SqlFormat) {
128		match self {
129			Self::System(v) => v.fmt_sql(f, fmt),
130			Self::Namespace(v) => v.fmt_sql(f, fmt),
131			Self::Database(v) => v.fmt_sql(f, fmt),
132			Self::Table(v) => v.fmt_sql(f, fmt),
133			Self::Api(v) => v.fmt_sql(f, fmt),
134			Self::Event(v) => v.fmt_sql(f, fmt),
135			Self::Index(v) => v.fmt_sql(f, fmt),
136			Self::Sequence(v) => v.fmt_sql(f, fmt),
137			Self::Field(v) => v.fmt_sql(f, fmt),
138			Self::Param(v) => v.fmt_sql(f, fmt),
139			Self::Bucket(v) => v.fmt_sql(f, fmt),
140			Self::Config(v) => v.fmt_sql(f, fmt),
141			Self::Analyzer(v) => v.fmt_sql(f, fmt),
142			Self::Function(v) => v.fmt_sql(f, fmt),
143			Self::User(v) => v.fmt_sql(f, fmt),
144			Self::Access(v) => v.fmt_sql(f, fmt),
145			Self::Module(v) => v.fmt_sql(f, fmt),
146		}
147	}
148}