From: SVN by r. <sv...@ca...> - 2010-05-07 08:44:11
|
Author: roy Date: 2010-05-07 10:17:22 +0200 (Fri, 07 May 2010) New Revision: 470 Modified: src/main/java/nl/improved/sqlclient/QueryExecutor.java Log: fixes for postgres don't leave connection in an unusable state when a statement failed. call rollback on savepoint Modified: src/main/java/nl/improved/sqlclient/QueryExecutor.java =================================================================== --- src/main/java/nl/improved/sqlclient/QueryExecutor.java 2010-03-08 20:34:54 UTC (rev 469) +++ src/main/java/nl/improved/sqlclient/QueryExecutor.java 2010-05-07 08:17:22 UTC (rev 470) @@ -15,10 +15,12 @@ */ package nl.improved.sqlclient; +import java.sql.Connection; import java.sql.Date; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; +import java.sql.Savepoint; import java.sql.Time; import java.sql.Timestamp; import java.sql.Types; @@ -163,23 +165,37 @@ * @return the formatted result. * @throws SQLException if the database could not execute the SQL query for some reason. */ + private static int savePointCounter = 0; public Iterator<CharSequence> executeQuery(CharSequence command) throws SQLException { cancelled = false; long start = System.currentTimeMillis(); - ResultSet results = DBConnector.getInstance().getStatement().executeQuery(command.toString()); + Connection con = DBConnector.getInstance().getConnection(); + Savepoint savePoint = null; + if (!con.getAutoCommit()) { + String savePointName = "SavePoint"+(++savePointCounter); + savePoint = con.setSavepoint(savePointName); + } + try { + ResultSet results = DBConnector.getInstance().getStatement().executeQuery(command.toString()); - //StringBuffer separator = new StringBuffer(); - //StringBuffer displayValue = new StringBuffer(); + //StringBuffer separator = new StringBuffer(); + //StringBuffer displayValue = new StringBuffer(); - ResultSetMetaData metadata = results.getMetaData(); + ResultSetMetaData metadata = results.getMetaData(); - // TODO specify labels - List<String> labels = new ArrayList<String>(); - for ( int col = 1; col <= metadata.getColumnCount(); col++) { - labels.add(metadata.getColumnLabel(col)); + // TODO specify labels + List<String> labels = new ArrayList<String>(); + for ( int col = 1; col <= metadata.getColumnCount(); col++) { + labels.add(metadata.getColumnLabel(col)); + } + + return new QueryExecutorIterator(start, results, labels, metadata); + } catch(SQLException e) { + if (savePoint != null) { + try {con.rollback(savePoint);} catch(SQLException ex) {} + } + throw e; } - - return new QueryExecutorIterator(start, results, labels, metadata); } private class QueryExecutorIterator implements Iterator<CharSequence> { |