elefant_tools/models/
unique_constraint.rs1use 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 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("e_value_string(comment));
64 sql.push(';');
65 }
66
67 sql
68 }
69}