|
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> {
|