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