Mercurial Hosting > nabble
diff src/jdbcpgbackup/Sequence.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/Sequence.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.List; + +final class Sequence extends DbBackupObject { + + static class SequenceFactory implements DBOFactory<Sequence> { + + @Override + public Iterable<Sequence> getDbBackupObjects(Connection con, Schema schema) throws SQLException { + List<Sequence> sequences = new ArrayList<Sequence>(); + PreparedStatement stmt = null; + try { + stmt = con.prepareStatement( + "SELECT c.relname AS sequencename, pg_get_userbyid(c.relowner) AS owner FROM pg_class c " + + "WHERE c.relkind='S' AND c.relnamespace = ?"); + stmt.setInt(1, schema.getOid()); + ResultSet rs = stmt.executeQuery(); + while (rs.next()) { + Sequence sequence = getSequence(con, schema, rs.getString("sequencename"), rs.getString("owner")); + sequences.add(sequence); + } + rs.close(); + } finally { + if (stmt != null) stmt.close(); + } + return sequences; + } + + @Override + public Sequence getDbBackupObject(Connection con, String sequenceName, Schema schema) throws SQLException { + PreparedStatement stmt = null; + Sequence sequence = null; + try { + stmt = con.prepareStatement( + "SELECT c.relname AS sequencename, pg_get_userbyid(c.relowner) AS owner FROM pg_class c " + + "WHERE c.relkind='S' AND c.relnamespace = ? AND c.relname = ?"); + stmt.setInt(1, schema.getOid()); + stmt.setString(2, sequenceName); + ResultSet rs = stmt.executeQuery(); + if (rs.next()) { + sequence = getSequence(con, schema, rs.getString("sequencename"), rs.getString("owner")); + } else { + throw new RuntimeException("no such sequence " + sequenceName); + } + rs.close(); + } finally { + if (stmt != null) stmt.close(); + } + return sequence; + } + + } + + static class CachingSequenceFactory extends CachingDBOFactory<Sequence> { + + protected CachingSequenceFactory(Schema.CachingSchemaFactory schemaFactory) { + super(schemaFactory); + } + + @Override + protected PreparedStatement getAllStatement(Connection con) throws SQLException { + return con.prepareStatement( + "SELECT c.relname AS sequencename, pg_get_userbyid(c.relowner) AS owner, " + + "c.relnamespace AS schema_oid FROM pg_class c " + + "WHERE c.relkind='S'"); + } + + @Override + protected Sequence newDbBackupObject(Connection con, ResultSet rs, Schema schema) throws SQLException { + return getSequence(con, schema, rs.getString("sequencename"), rs.getString("owner")); + } + + + } + + private static Sequence getSequence(Connection con, Schema schema, String sequenceName, String owner) throws SQLException { + PreparedStatement stmt = null; + Sequence sequence = null; + try { + stmt = con.prepareStatement( + "SELECT * FROM " + schema.getName() + "." + sequenceName); + ResultSet rs = stmt.executeQuery(); + if (rs.next()) + sequence = new Sequence(sequenceName, rs, schema, owner); + else + throw new RuntimeException("no such sequence: " + sequenceName); + rs.close(); + } finally { + if (stmt != null) stmt.close(); + } + return sequence; + } + + private final long last_value; + private final long start_value; + private final long increment_by; + private final long max_value; + private final long min_value; + private final long cache_value; + private final boolean is_cycled; + + private Sequence(String sequenceName, ResultSet rs, Schema schema, String owner) throws SQLException { + //super(rs.getString("sequence_name"), schema, owner); // postgresql bug? not always consistent with pg_class.relname + super(sequenceName, schema, owner); + this.last_value = rs.getLong("last_value"); + this.start_value = rs.getLong("start_value"); + this.increment_by = rs.getLong("increment_by"); + this.max_value = rs.getLong("max_value"); + this.min_value = rs.getLong("min_value"); + this.is_cycled = rs.getBoolean("is_cycled"); + this.cache_value = rs.getLong("cache_value"); + } + + @Override + protected StringBuilder appendCreateSql(StringBuilder buf, DataFilter dataFilter) { + buf.append("CREATE SEQUENCE "); + buf.append(getName()); + if (increment_by != 1) { + buf.append(" INCREMENT BY "); + buf.append(increment_by); + } + buf.append(" MINVALUE "); + buf.append(min_value); + buf.append(" MAXVALUE "); + buf.append(max_value); + if (is_cycled) + buf.append(" CYCLE"); + if (cache_value > 1) { + buf.append(" CACHE "); + buf.append(cache_value); + } + buf.append(" START "); + buf.append(start_value); + buf.append(";\n"); + if (dataFilter.dumpData(schema.getName(), name)) { + buf.append("SELECT setval('"); + buf.append(getName()); + buf.append("',"); + buf.append(last_value); + buf.append(") ;\n"); + } + return buf; + } + + @Override + protected StringBuilder appendCreateSql(StringBuilder buf) { + throw new UnsupportedOperationException(); + } +}