0
|
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 }
|