Mercurial Hosting > nabble
comparison src/jdbcpgbackup/Schema.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.Collection; | |
| 11 import java.util.Collections; | |
| 12 import java.util.HashMap; | |
| 13 import java.util.Iterator; | |
| 14 import java.util.List; | |
| 15 import java.util.Map; | |
| 16 | |
| 17 final class Schema extends DbBackupObject { | |
| 18 | |
| 19 static class SchemaFactory implements DBOFactory<Schema> { | |
| 20 | |
| 21 @Override | |
| 22 public List<Schema> getDbBackupObjects(Connection con, Schema ignored) throws SQLException { | |
| 23 List<Schema> schemas = new ArrayList<Schema>(); | |
| 24 PreparedStatement stmt = null; | |
| 25 try { | |
| 26 stmt = con.prepareStatement( | |
| 27 "SELECT nspname, pg_get_userbyid(nspowner) AS owner, oid FROM pg_namespace " + | |
| 28 "WHERE nspname NOT LIKE 'pg_%' " + | |
| 29 "AND nspname <> 'information_schema'"); | |
| 30 ResultSet rs = stmt.executeQuery(); | |
| 31 while (rs.next()) { | |
| 32 schemas.add(new Schema(rs.getString("nspname"), rs.getString("owner"), rs.getInt("oid"))); | |
| 33 } | |
| 34 rs.close(); | |
| 35 } finally { | |
| 36 if (stmt != null) stmt.close(); | |
| 37 } | |
| 38 return schemas; | |
| 39 } | |
| 40 | |
| 41 @Override | |
| 42 public Schema getDbBackupObject(Connection con, String schemaName, Schema ignored) throws SQLException { | |
| 43 PreparedStatement stmt = null; | |
| 44 Schema schema = null; | |
| 45 try { | |
| 46 stmt = con.prepareStatement( | |
| 47 "SELECT pg_get_userbyid(nspowner) AS owner, oid FROM pg_namespace WHERE nspname = ?"); | |
| 48 stmt.setString(1, schemaName); | |
| 49 ResultSet rs = stmt.executeQuery(); | |
| 50 if (rs.next()) | |
| 51 schema = new Schema(schemaName, rs.getString("owner"), rs.getInt("oid")); | |
| 52 rs.close(); | |
| 53 } finally { | |
| 54 if (stmt != null) stmt.close(); | |
| 55 } | |
| 56 return schema; | |
| 57 } | |
| 58 | |
| 59 } | |
| 60 | |
| 61 static class CachingSchemaFactory implements DBOFactory<Schema> { // does not extend CachingDBOFactory | |
| 62 | |
| 63 protected Map<String,Schema> map = null; | |
| 64 private final Map<Integer,Schema> batch = new HashMap<Integer,Schema>(); | |
| 65 private Iterator<Schema> itr; | |
| 66 | |
| 67 @Override | |
| 68 public Collection<Schema> getDbBackupObjects(Connection con, Schema ignored) throws SQLException { | |
| 69 if (map == null) { | |
| 70 loadMap(con); | |
| 71 } | |
| 72 return Collections.unmodifiableCollection(map.values()); | |
| 73 } | |
| 74 | |
| 75 @Override | |
| 76 public Schema getDbBackupObject(Connection con, String name, Schema ignored) throws SQLException { | |
| 77 if (map == null) { | |
| 78 loadMap(con); | |
| 79 } | |
| 80 return map.get(name); | |
| 81 } | |
| 82 | |
| 83 public Collection<Schema> nextBatch(Connection con, int batchSize) throws SQLException { | |
| 84 if (itr == null) { | |
| 85 itr = getDbBackupObjects(con, null).iterator(); | |
| 86 } | |
| 87 batch.clear(); | |
| 88 while (itr.hasNext() && batch.size() < batchSize) { | |
| 89 Schema schema = itr.next(); | |
| 90 batch.put(schema.getOid(), schema); | |
| 91 } | |
| 92 return Collections.unmodifiableCollection(batch.values()); | |
| 93 } | |
| 94 | |
| 95 public Schema getFromCurrentBatch(int oid) { | |
| 96 return batch.get(oid); | |
| 97 } | |
| 98 | |
| 99 private void loadMap(Connection con) throws SQLException { | |
| 100 map = new HashMap<String,Schema>(); | |
| 101 PreparedStatement stmt = null; | |
| 102 try { | |
| 103 stmt = con.prepareStatement( | |
| 104 "SELECT nspname AS schemaname, pg_get_userbyid(nspowner) AS owner, oid FROM pg_namespace " + | |
| 105 "WHERE nspname NOT LIKE 'pg_%' " + | |
| 106 "AND nspname <> 'information_schema'"); | |
| 107 ResultSet rs = stmt.executeQuery(); | |
| 108 while (rs.next()) { | |
| 109 String schemaName = rs.getString("schemaname"); | |
| 110 map.put(schemaName, new Schema(rs.getString("schemaname"), rs.getString("owner"), rs.getInt("oid"))); | |
| 111 } | |
| 112 rs.close(); | |
| 113 } finally { | |
| 114 if (stmt != null) stmt.close(); | |
| 115 } | |
| 116 } | |
| 117 | |
| 118 } | |
| 119 | |
| 120 static Schema createSchema(Connection con, String schemaName, String owner, DBOFactory<Schema> schemaFactory) throws SQLException { | |
| 121 PreparedStatement stmt = null; | |
| 122 try { | |
| 123 stmt = con.prepareStatement( | |
| 124 "CREATE SCHEMA " + schemaName + " AUTHORIZATION " + owner); | |
| 125 stmt.executeUpdate(); | |
| 126 } finally { | |
| 127 if (stmt != null) stmt.close(); | |
| 128 } | |
| 129 return schemaFactory.getDbBackupObject(con, schemaName, null); | |
| 130 } | |
| 131 | |
| 132 private final int oid; | |
| 133 | |
| 134 private Schema(String name, String owner, int oid) { | |
| 135 super(name, null, owner); | |
| 136 this.oid = oid; | |
| 137 } | |
| 138 | |
| 139 @Override | |
| 140 String getSql(DataFilter dataFilter) { | |
| 141 return "CREATE SCHEMA " + name + " AUTHORIZATION " + owner + " ;\n"; | |
| 142 } | |
| 143 | |
| 144 @Override | |
| 145 protected StringBuilder appendCreateSql(StringBuilder buf) { | |
| 146 throw new UnsupportedOperationException(); | |
| 147 } | |
| 148 | |
| 149 @Override | |
| 150 String getFullname() { | |
| 151 return name; | |
| 152 } | |
| 153 | |
| 154 int getOid() { | |
| 155 return oid; | |
| 156 } | |
| 157 } |
