package org.sharegov.cirm.rdb.impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Date; import javax.sql.DataSource; import mjson.Json; import org.sharegov.cirm.rdb.DBU; import org.sharegov.cirm.rdb.DatabaseHook; import org.postgresql.ds.PGSimpleDataSource; import org.postgresql.ds.PGPoolingDataSource; public class PostgresHook implements DatabaseHook { public DataSource createDataSource(Json description) { try { PGSimpleDataSource source = new PGSimpleDataSource(); source.setUrl(description.at("hasUrl").asString()); source.setUser(description.at("hasUsername").asString()); source.setPassword(description.at("hasPassword").asString()); return source; } catch (SQLException ex) { throw new RuntimeException(ex); } } public DataSource createPooledDataSource(Json description) { try { PGPoolingDataSource source = new PGPoolingDataSource(); source.setDataSourceName("CiRM PostgreSQL Pooling Data Source"); source.setUrl(description.at("hasUrl").asString()); source.setUser(description.at("hasUsername").asString()); source.setPassword(description.at("hasPassword").asString()); source.setMaxConnections(10); return source; } catch (SQLException ex) { throw new RuntimeException(ex); } } public long nextSequence(Connection conn, String sequenceName) throws SQLException { ResultSet rs = null; java.sql.Statement stmt = null; try { stmt = conn.createStatement(); rs = stmt.executeQuery("select nextval('" + sequenceName + "')"); rs.next(); long nextId = rs.getLong(1); conn.commit(); return nextId; } finally { DBU.close(null, stmt, rs); } } public String nextSequenceClause(String sequenceName) { return "nextval('" + sequenceName + "')"; } public Date timeStamp(Connection conn) throws SQLException { PreparedStatement stmt = null; ResultSet rs = null; Date result; String select = "select current_timestamp"; try { stmt = conn.prepareStatement(select); rs = stmt.executeQuery(); rs.next(); result = rs.getTimestamp(1); conn.commit(); } finally { DBU.close(null, stmt, rs); } return result; } public String paginate(String sql, long minValue, long maxValue) { return sql + " offset " + (minValue-1) + " limit " + (maxValue - minValue + 1); } public void resetSequence(Connection conn, String sequenceName) throws SQLException { ResultSet rs = null; java.sql.Statement stmt = null; try { stmt = conn.createStatement(); stmt.execute("alter sequence " + sequenceName + " restart" ); conn.commit(); } finally { DBU.close(null, stmt, rs); } } }