Skip to main content

elefant_tools/models/
unique_constraint.rs

1use crate::object_id::ObjectId;
2use crate::quoting::AttemptedKeywordUsage::ColumnName;
3use crate::quoting::{quote_value_string, IdentifierQuoter, Quotable};
4use crate::{PostgresSchema, PostgresTable};
5use serde::{Deserialize, Serialize};
6use std::cmp::Ordering;
7
8#[derive(Debug, Eq, PartialEq, Default, Clone, Serialize, Deserialize)]
9pub struct PostgresUniqueConstraint {
10    pub name: String,
11    pub unique_index_name: String,
12    pub comment: Option<String>,
13    /// For temporal unique constraints, stores the constraint definition from pg_get_constraintdef().
14    pub constraint_definition: Option<String>,
15    pub object_id: ObjectId,
16}
17
18impl PartialOrd for PostgresUniqueConstraint {
19    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
20        Some(self.cmp(other))
21    }
22}
23
24impl Ord for PostgresUniqueConstraint {
25    fn cmp(&self, other: &Self) -> Ordering {
26        self.name.cmp(&other.name)
27    }
28}
29
30impl PostgresUniqueConstraint {
31    pub fn get_create_statement(
32        &self,
33        table: &PostgresTable,
34        schema: &PostgresSchema,
35        quoter: &IdentifierQuoter,
36    ) -> String {
37        let mut sql = if let Some(ref constraint_def) = self.constraint_definition {
38            format!(
39                "alter table {}.{} add constraint {} {};",
40                schema.name.quote(quoter, ColumnName),
41                table.name.quote(quoter, ColumnName),
42                self.name.quote(quoter, ColumnName),
43                constraint_def
44            )
45        } else {
46            format!(
47                "alter table {}.{} add constraint {} unique using index {};",
48                schema.name.quote(quoter, ColumnName),
49                table.name.quote(quoter, ColumnName),
50                self.name.quote(quoter, ColumnName),
51                self.unique_index_name.quote(quoter, ColumnName)
52            )
53        };
54
55        if let Some(comment) = &self.comment {
56            sql.push_str("\ncomment on constraint ");
57            sql.push_str(&self.name.quote(quoter, ColumnName));
58            sql.push_str(" on ");
59            sql.push_str(&schema.name.quote(quoter, ColumnName));
60            sql.push('.');
61            sql.push_str(&table.name.quote(quoter, ColumnName));
62            sql.push_str(" is ");
63            sql.push_str(&quote_value_string(comment));
64            sql.push(';');
65        }
66
67        sql
68    }
69}