diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdbcpgbackup/Schema.java	Thu Mar 21 19:15:52 2019 -0600
@@ -0,0 +1,157 @@
+/*	Copyright (c) 2012	Tomislav Gountchev <tomi@gountchev.net>	*/
+
+package jdbcpgbackup;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+final class Schema extends DbBackupObject {
+
+	static class SchemaFactory implements DBOFactory<Schema> {
+
+		@Override
+		public List<Schema> getDbBackupObjects(Connection con, Schema ignored) throws SQLException {
+			List<Schema> schemas = new ArrayList<Schema>();
+			PreparedStatement stmt = null;
+			try {
+				stmt = con.prepareStatement(
+						"SELECT nspname, pg_get_userbyid(nspowner) AS owner, oid FROM pg_namespace " +
+								"WHERE nspname NOT LIKE 'pg_%' " +
+						"AND nspname <> 'information_schema'");
+				ResultSet rs = stmt.executeQuery();
+				while (rs.next()) {
+					schemas.add(new Schema(rs.getString("nspname"), rs.getString("owner"), rs.getInt("oid")));
+				}
+				rs.close();
+			} finally {
+				if (stmt != null) stmt.close();
+			}
+			return schemas;
+		}
+
+		@Override
+		public Schema getDbBackupObject(Connection con, String schemaName, Schema ignored) throws SQLException {
+			PreparedStatement stmt = null;
+			Schema schema = null;
+			try {
+				stmt = con.prepareStatement(
+						"SELECT pg_get_userbyid(nspowner) AS owner, oid FROM pg_namespace WHERE nspname = ?");
+				stmt.setString(1, schemaName);
+				ResultSet rs = stmt.executeQuery();
+				if (rs.next())
+					schema = new Schema(schemaName, rs.getString("owner"), rs.getInt("oid"));
+				rs.close();
+			} finally {
+				if (stmt != null) stmt.close();
+			}
+			return schema;
+		}
+
+	}
+
+	static class CachingSchemaFactory implements DBOFactory<Schema> { // does not extend CachingDBOFactory
+
+		protected Map<String,Schema> map = null;
+		private final Map<Integer,Schema> batch = new HashMap<Integer,Schema>();
+		private Iterator<Schema> itr;
+
+		@Override
+		public Collection<Schema> getDbBackupObjects(Connection con, Schema ignored) throws SQLException {
+			if (map == null) {
+				loadMap(con);
+			}
+			return Collections.unmodifiableCollection(map.values());
+		}
+
+		@Override
+		public Schema getDbBackupObject(Connection con, String name, Schema ignored) throws SQLException {
+			if (map == null) {
+				loadMap(con);
+			}
+			return map.get(name);
+		}
+
+		public Collection<Schema> nextBatch(Connection con, int batchSize) throws SQLException {
+			if (itr == null) {
+				itr = getDbBackupObjects(con, null).iterator();
+			}
+			batch.clear();
+			while (itr.hasNext() && batch.size() < batchSize) {
+				Schema schema = itr.next();
+				batch.put(schema.getOid(), schema);
+			}
+			return Collections.unmodifiableCollection(batch.values());
+		}
+
+		public Schema getFromCurrentBatch(int oid) {
+			return batch.get(oid);
+		}
+
+		private void loadMap(Connection con) throws SQLException {
+			map = new HashMap<String,Schema>();
+			PreparedStatement stmt = null;
+			try {
+				stmt = con.prepareStatement(
+						"SELECT nspname AS schemaname, pg_get_userbyid(nspowner) AS owner, oid FROM pg_namespace " +
+								"WHERE nspname NOT LIKE 'pg_%' " +
+						"AND nspname <> 'information_schema'");
+				ResultSet rs = stmt.executeQuery();
+				while (rs.next()) {
+					String schemaName = rs.getString("schemaname");
+					map.put(schemaName, new Schema(rs.getString("schemaname"), rs.getString("owner"), rs.getInt("oid")));
+				}
+				rs.close();
+			} finally {
+				if (stmt != null) stmt.close();
+			}
+		}
+
+	}
+
+	static Schema createSchema(Connection con, String schemaName, String owner, DBOFactory<Schema> schemaFactory) throws SQLException {
+		PreparedStatement stmt = null;
+		try {
+			stmt = con.prepareStatement(
+					"CREATE SCHEMA " + schemaName + " AUTHORIZATION " + owner);
+			stmt.executeUpdate();
+		} finally {
+			if (stmt != null) stmt.close();
+		}
+		return schemaFactory.getDbBackupObject(con, schemaName, null);
+	}
+
+	private final int oid;
+
+	private Schema(String name, String owner, int oid) {
+		super(name, null, owner);
+		this.oid = oid;
+	}
+
+	@Override
+	String getSql(DataFilter dataFilter) {
+		return "CREATE SCHEMA " + name + " AUTHORIZATION " + owner + " ;\n";
+	}
+
+	@Override
+	protected StringBuilder appendCreateSql(StringBuilder buf) {
+		throw new UnsupportedOperationException();
+	}
+
+	@Override
+	String getFullname() {
+		return name;
+	}
+
+	int getOid() {
+		return oid;
+	}
+}