Skip to main content

pgevolve_core/diff/
owner_op.rs

1//! `AlterObjectOwner` — uniform owner-change op across grantable families.
2
3use serde::{Deserialize, Serialize};
4
5use crate::identifier::{Identifier, QualifiedName};
6
7/// Object kind discriminant for the renderer (`ALTER TABLE x OWNER TO`,
8/// `ALTER SCHEMA x OWNER TO`, etc.).
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
10#[serde(rename_all = "snake_case")]
11pub enum OwnerObjectKind {
12    /// `ALTER SCHEMA x OWNER TO`.
13    Schema,
14    /// `ALTER SEQUENCE x OWNER TO`.
15    Sequence,
16    /// `ALTER TABLE x OWNER TO`.
17    Table,
18    /// `ALTER VIEW x OWNER TO`.
19    View,
20    /// `ALTER MATERIALIZED VIEW x OWNER TO`.
21    MaterializedView,
22    /// `ALTER FUNCTION x() OWNER TO`.
23    Function,
24    /// `ALTER PROCEDURE x() OWNER TO`.
25    Procedure,
26    /// `ALTER TYPE x OWNER TO`.
27    UserType,
28    /// `ALTER PUBLICATION x OWNER TO`.
29    Publication,
30}
31
32impl OwnerObjectKind {
33    /// The SQL keyword(s) used in `ALTER <keyword> <name> OWNER TO <role>`.
34    #[must_use]
35    pub const fn sql_keyword(self) -> &'static str {
36        match self {
37            Self::Schema => "SCHEMA",
38            Self::Sequence => "SEQUENCE",
39            Self::Table => "TABLE",
40            Self::View => "VIEW",
41            Self::MaterializedView => "MATERIALIZED VIEW",
42            Self::Function => "FUNCTION",
43            Self::Procedure => "PROCEDURE",
44            Self::UserType => "TYPE",
45            Self::Publication => "PUBLICATION",
46        }
47    }
48}
49
50/// An `ALTER <kind> <qname> OWNER TO <to>` statement, paired with the previous
51/// owner for audit / rollback purposes.
52#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
53pub struct AlterObjectOwner {
54    /// Which kind of object is being re-owned.
55    pub kind: OwnerObjectKind,
56    /// Qualified name of the object.
57    pub qname: QualifiedName,
58    /// Optional argument-signature suffix for routines (e.g., `(int, text)`).
59    /// Empty for non-routine kinds.
60    #[serde(default)]
61    pub signature: String,
62    /// Previous owner (taken from the target catalog; `__unknown_owner__` when
63    /// the catalog did not record an owner).
64    pub from: Identifier,
65    /// Desired new owner (taken from the source catalog).
66    pub to: Identifier,
67}
68
69#[cfg(test)]
70mod tests {
71    use super::*;
72
73    #[test]
74    fn sql_keywords_match_pg() {
75        assert_eq!(OwnerObjectKind::Schema.sql_keyword(), "SCHEMA");
76        assert_eq!(OwnerObjectKind::Sequence.sql_keyword(), "SEQUENCE");
77        assert_eq!(OwnerObjectKind::Table.sql_keyword(), "TABLE");
78        assert_eq!(OwnerObjectKind::View.sql_keyword(), "VIEW");
79        assert_eq!(
80            OwnerObjectKind::MaterializedView.sql_keyword(),
81            "MATERIALIZED VIEW"
82        );
83        assert_eq!(OwnerObjectKind::Function.sql_keyword(), "FUNCTION");
84        assert_eq!(OwnerObjectKind::Procedure.sql_keyword(), "PROCEDURE");
85        assert_eq!(OwnerObjectKind::UserType.sql_keyword(), "TYPE");
86        assert_eq!(OwnerObjectKind::Publication.sql_keyword(), "PUBLICATION");
87    }
88}