| 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.Collections; | 
|  | 10 import java.util.HashMap; | 
|  | 11 import java.util.Map; | 
|  | 12 | 
|  | 13 public abstract class CachingDBOFactory<T extends DbBackupObject> implements DBOFactory<T> { | 
|  | 14 | 
|  | 15 	protected final Schema.CachingSchemaFactory schemaFactory; | 
|  | 16 | 
|  | 17 	protected Map<String,Map<String,T>> map = null; | 
|  | 18 | 
|  | 19 	protected CachingDBOFactory(Schema.CachingSchemaFactory schemaFactory) { | 
|  | 20 		this.schemaFactory = schemaFactory; | 
|  | 21 	} | 
|  | 22 | 
|  | 23 	@Override | 
|  | 24 	public Iterable<T> getDbBackupObjects(Connection con, Schema schema) throws SQLException { | 
|  | 25 		if (map == null) { | 
|  | 26 			loadMap(con); | 
|  | 27 		} | 
|  | 28 		Map<String,T> dbos = map.get(schema.getName()); | 
|  | 29 		if (dbos == null) return Collections.emptyList(); | 
|  | 30 		else return Collections.unmodifiableCollection(dbos.values()); | 
|  | 31 	} | 
|  | 32 | 
|  | 33 	@Override | 
|  | 34 	public T getDbBackupObject(Connection con, String name, Schema schema) throws SQLException { | 
|  | 35 		if (map == null) { | 
|  | 36 			loadMap(con); | 
|  | 37 		} | 
|  | 38 		Map<String,T> dbos = map.get(schema.getName()); | 
|  | 39 		return dbos == null ? null : dbos.get(name); | 
|  | 40 	} | 
|  | 41 | 
|  | 42 	protected void loadMap(Connection con) throws SQLException { | 
|  | 43 		map = new HashMap<String,Map<String,T>>(); | 
|  | 44 		PreparedStatement stmt = null; | 
|  | 45 		try { | 
|  | 46 			stmt = getAllStatement(con); | 
|  | 47 			ZipBackup.debug("loading map in " + CachingDBOFactory.this.getClass()); | 
|  | 48 			ResultSet rs = stmt.executeQuery(); | 
|  | 49 			while (rs.next()) { | 
|  | 50 				Schema schema = schemaFactory.getFromCurrentBatch(rs.getInt("schema_oid")); | 
|  | 51 				if (schema == null) continue; | 
|  | 52 				Map<String,T> dbos = map.get(schema.getName()); | 
|  | 53 				if (dbos == null) { | 
|  | 54 					dbos = new HashMap<String,T>(); | 
|  | 55 					map.put(schema.getName(), dbos); | 
|  | 56 				} | 
|  | 57 				T dbo = newDbBackupObject(con, rs, schema); | 
|  | 58 				dbos.put(dbo.getName(), dbo); | 
|  | 59 			} | 
|  | 60 			rs.close(); | 
|  | 61 		} finally { | 
|  | 62 			if (stmt != null) stmt.close(); | 
|  | 63 		} | 
|  | 64 	} | 
|  | 65 | 
|  | 66 	protected abstract PreparedStatement getAllStatement(Connection con) throws SQLException; | 
|  | 67 | 
|  | 68 	protected abstract T newDbBackupObject(Connection con, ResultSet rs, Schema schema) throws SQLException; | 
|  | 69 | 
|  | 70 } |