Mercurial Hosting > nabble
comparison src/jdbcpgbackup/Constraint.java @ 0:7ecd1a4ef557
add content
| author | Franklin Schmidt <fschmidt@gmail.com> |
|---|---|
| date | Thu, 21 Mar 2019 19:15:52 -0600 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:7ecd1a4ef557 |
|---|---|
| 1 /* Copyright (c) 2012 Tomislav Gountchev <tomi@gountchev.net> */ | |
| 2 | |
| 3 package jdbcpgbackup; | |
| 4 | |
| 5 import java.sql.Connection; | |
| 6 import java.sql.PreparedStatement; | |
| 7 import java.sql.ResultSet; | |
| 8 import java.sql.SQLException; | |
| 9 import java.util.ArrayList; | |
| 10 import java.util.List; | |
| 11 | |
| 12 final class Constraint extends DbBackupObject { | |
| 13 | |
| 14 static class ConstraintFactory implements DBOFactory<Constraint> { | |
| 15 | |
| 16 @Override | |
| 17 public Iterable<Constraint> getDbBackupObjects(Connection con, Schema schema) throws SQLException { | |
| 18 List<Constraint> constraints = new ArrayList<Constraint>(); | |
| 19 PreparedStatement stmt = null; | |
| 20 try { | |
| 21 stmt = con.prepareStatement( | |
| 22 "SELECT c.oid, c.conname, p.relname, pg_get_userbyid(p.relowner) AS owner, " + | |
| 23 "pg_get_constraintdef(c.oid) AS constraintdef, c.contype " + | |
| 24 "FROM pg_constraint c, pg_class p " + | |
| 25 "WHERE c.connamespace = ? " + | |
| 26 "AND c.conrelid = p.oid " + | |
| 27 "ORDER BY c.contype DESC"); | |
| 28 stmt.setInt(1, schema.getOid()); | |
| 29 ResultSet rs = stmt.executeQuery(); | |
| 30 while (rs.next()) { | |
| 31 constraints.add(new Constraint(rs.getString("conname"), schema, rs.getString("relname"), | |
| 32 rs.getString("owner"), rs.getString("constraintdef"), rs.getString("contype").charAt(0))); | |
| 33 } | |
| 34 rs.close(); | |
| 35 } finally { | |
| 36 if (stmt != null) stmt.close(); | |
| 37 } | |
| 38 return constraints; | |
| 39 } | |
| 40 | |
| 41 @Override | |
| 42 public Constraint getDbBackupObject(Connection con, String constraintName, Schema schema) throws SQLException { | |
| 43 Constraint constraint = null; | |
| 44 PreparedStatement stmt = null; | |
| 45 try { | |
| 46 stmt = con.prepareStatement( | |
| 47 "SELECT c.oid, c.conname, p.relname, pg_get_userbyid(p.relowner) AS owner, " + | |
| 48 "pg_get_constraintdef(c.oid) AS constraintdef, c.contype " + | |
| 49 "FROM pg_constraint c, pg_class p " + | |
| 50 "WHERE c.connamespace = ? " + | |
| 51 "AND c.conrelid = p.oid " + | |
| 52 "AND c.conname = ? "); | |
| 53 stmt.setInt(1, schema.getOid()); | |
| 54 stmt.setString(2, constraintName); | |
| 55 ResultSet rs = stmt.executeQuery(); | |
| 56 if (rs.next()) { | |
| 57 constraint = new Constraint(constraintName, schema, rs.getString("relname"), | |
| 58 rs.getString("owner"), rs.getString("constraintdef"), rs.getString("contype").charAt(0)); | |
| 59 } else { | |
| 60 throw new RuntimeException("no such constraint: " + constraintName); | |
| 61 } | |
| 62 rs.close(); | |
| 63 } finally { | |
| 64 if (stmt != null) stmt.close(); | |
| 65 } | |
| 66 return constraint; | |
| 67 } | |
| 68 | |
| 69 } | |
| 70 | |
| 71 static class CachingConstraintFactory extends CachingDBOFactory<Constraint> { | |
| 72 | |
| 73 private final Table.CachingTableFactory tableFactory; | |
| 74 | |
| 75 protected CachingConstraintFactory(Schema.CachingSchemaFactory schemaFactory, Table.CachingTableFactory tableFactory) { | |
| 76 super(schemaFactory); | |
| 77 this.tableFactory = tableFactory; | |
| 78 } | |
| 79 | |
| 80 @Override | |
| 81 protected PreparedStatement getAllStatement(Connection con) throws SQLException { | |
| 82 return con.prepareStatement( | |
| 83 "SELECT c.oid, c.conname, c.conrelid AS table_oid, " + | |
| 84 "pg_get_constraintdef(c.oid) AS constraintdef, " + | |
| 85 "c.connamespace AS schema_oid, c.contype " + | |
| 86 "FROM pg_constraint c"); | |
| 87 } | |
| 88 | |
| 89 @Override | |
| 90 protected Constraint newDbBackupObject(Connection con, ResultSet rs, Schema schema) throws SQLException { | |
| 91 Table table = tableFactory.getTable(rs.getInt("table_oid")); | |
| 92 return new Constraint(rs.getString("conname"), schema, table.getName(), | |
| 93 table.getOwner(), rs.getString("constraintdef"), rs.getString("contype").charAt(0)); | |
| 94 } | |
| 95 | |
| 96 // get the primary key constraints before the rest | |
| 97 @Override | |
| 98 public final Iterable<Constraint> getDbBackupObjects(Connection con, Schema schema) throws SQLException { | |
| 99 Iterable<Constraint> constraints = super.getDbBackupObjects(con, schema); | |
| 100 List<Constraint> pklist = new ArrayList<Constraint>(); | |
| 101 List<Constraint> fklist = new ArrayList<Constraint>(); | |
| 102 for (Constraint constraint : constraints) { | |
| 103 if (constraint.type == 'p') pklist.add(constraint); | |
| 104 else fklist.add(constraint); | |
| 105 } | |
| 106 pklist.addAll(fklist); | |
| 107 return pklist; | |
| 108 } | |
| 109 | |
| 110 } | |
| 111 | |
| 112 private final String tableName; | |
| 113 private final String definition; | |
| 114 private final char type; | |
| 115 | |
| 116 private Constraint(String name, Schema schema, String tableName, String tableOwner, String definition, char type) { | |
| 117 super(name, schema, tableOwner); | |
| 118 this.tableName = tableName; | |
| 119 this.definition = definition.replace(" REFERENCES " + schema.getName() + ".", " REFERENCES "); // remove schema name | |
| 120 this.type = type; | |
| 121 } | |
| 122 | |
| 123 @Override | |
| 124 protected StringBuilder appendCreateSql(StringBuilder buf) { | |
| 125 buf.append("ALTER TABLE "); | |
| 126 buf.append(tableName); | |
| 127 buf.append(" ADD CONSTRAINT "); | |
| 128 buf.append(name); | |
| 129 buf.append(" "); | |
| 130 buf.append(definition); | |
| 131 buf.append(" ;\n"); | |
| 132 return buf; | |
| 133 } | |
| 134 | |
| 135 } |
