You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2013/07/28 19:14:49 UTC
svn commit: r1507814 - in
/cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc:
ConnectionAwareResultIterator.java SQLTemplateAction.java SelectAction.java
Author: aadamchik
Date: Sun Jul 28 17:14:48 2013
New Revision: 1507814
URL: http://svn.apache.org/r1507814
Log:
CAY-1855 Iterated and paginated queries must print result counts
Modified:
cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc/ConnectionAwareResultIterator.java
cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java
Modified: cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc/ConnectionAwareResultIterator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc/ConnectionAwareResultIterator.java?rev=1507814&r1=1507813&r2=1507814&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc/ConnectionAwareResultIterator.java (original)
+++ cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc/ConnectionAwareResultIterator.java Sun Jul 28 17:14:48 2013
@@ -27,9 +27,10 @@ import org.apache.cayenne.CayenneRuntime
import org.apache.cayenne.ResultIterator;
/**
- * A {@link ResultIterator} wrapper that handles closing a connection. Used in
- * iterators that are returned to the end users and are not implicitly managed
- * by Cayenne.
+ * A {@link ResultIterator} wrapper that handles closing a connection. Also
+ * internally counts processed rows, mostly for the benefit of subclasses.
+ * Subclasses are used in iterators that are returned to the end users and are
+ * not implicitly managed by Cayenne.
*
* @since 3.2
*/
@@ -38,6 +39,7 @@ public class ConnectionAwareResultIterat
private ResultIterator<T> delegate;
private Connection connection;
private boolean closed;
+ protected int rowCounter;
public ConnectionAwareResultIterator(ResultIterator<T> delegate, Connection connection) {
this.delegate = delegate;
@@ -48,33 +50,35 @@ public class ConnectionAwareResultIterat
public void close() {
if (!closed) {
+ doClose();
+ closed = true;
+ }
+ }
- StringBuilder errors = null;
+ protected void doClose() {
+ StringBuilder errors = null;
- try {
- delegate.close();
- } catch (Exception e1) {
- if (errors == null) {
- errors = new StringBuilder();
- }
- errors.append("Error closing ResultSet: " + e1);
+ try {
+ delegate.close();
+ } catch (Exception e1) {
+ if (errors == null) {
+ errors = new StringBuilder();
}
+ errors.append("Error closing ResultSet: " + e1);
+ }
- try {
- connection.close();
- } catch (SQLException e2) {
- if (errors == null) {
- errors = new StringBuilder();
- }
-
- errors.append("Error closing connection: " + e2);
+ try {
+ connection.close();
+ } catch (SQLException e2) {
+ if (errors == null) {
+ errors = new StringBuilder();
}
- if (errors != null) {
- throw new CayenneRuntimeException("Error closing ResultIterator: " + errors.toString());
- }
+ errors.append("Error closing connection: " + e2);
+ }
- closed = true;
+ if (errors != null) {
+ throw new CayenneRuntimeException("Error closing ResultIterator: " + errors.toString());
}
}
@@ -90,6 +94,7 @@ public class ConnectionAwareResultIterat
@Override
public T nextRow() {
+ rowCounter++;
return delegate.nextRow();
}
Modified: cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java?rev=1507814&r1=1507813&r2=1507814&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java Sun Jul 28 17:14:48 2013
@@ -189,7 +189,7 @@ public class SQLTemplateAction implement
}
protected void processSelectResult(SQLStatement compiled, Connection connection, Statement statement,
- ResultSet resultSet, OperationObserver callback, long startTime) throws Exception {
+ ResultSet resultSet, OperationObserver callback, final long startTime) throws Exception {
boolean iteratedResult = callback.isIteratedResult();
@@ -202,30 +202,34 @@ public class SQLTemplateAction implement
ResultIterator it = result;
if (iteratedResult) {
- it = new ConnectionAwareResultIterator(it, connection);
+
+ it = new ConnectionAwareResultIterator(it, connection) {
+ @Override
+ protected void doClose() {
+ adapter.getJdbcEventLogger().logSelectCount(rowCounter, System.currentTimeMillis() - startTime);
+ super.doClose();
+ }
+ };
}
it = new LimitResultIterator(it, getFetchOffset(), query.getFetchLimit());
- if (!iteratedResult) {
-
- // note that we are not closing the iterator here, relying on caller
- // to close
- // the underlying ResultSet on its own... this is a hack, maybe a
- // cleaner flow
- // is due here.
- List<DataRow> resultRows = (List<DataRow>) it.allRows();
-
- adapter.getJdbcEventLogger().logSelectCount(resultRows.size(), System.currentTimeMillis() - startTime);
-
- callback.nextRows(query, resultRows);
- } else {
+ if (iteratedResult) {
try {
callback.nextRows(query, it);
} catch (Exception ex) {
it.close();
throw ex;
}
+ } else {
+ // note that we are not closing the iterator here, relying on caller
+ // to close the underlying ResultSet on its own... this is a hack,
+ // maybe a cleaner flow is due here.
+ List<DataRow> resultRows = (List<DataRow>) it.allRows();
+
+ adapter.getJdbcEventLogger().logSelectCount(resultRows.size(), System.currentTimeMillis() - startTime);
+
+ callback.nextRows(query, resultRows);
}
}
Modified: cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java?rev=1507814&r1=1507813&r2=1507814&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java Sun Jul 28 17:14:48 2013
@@ -62,10 +62,16 @@ public class SelectAction extends BaseSQ
public void performAction(Connection connection, OperationObserver observer) throws SQLException, Exception {
- long t1 = System.currentTimeMillis();
+ final long t1 = System.currentTimeMillis();
- SelectTranslator translator = createTranslator(connection);
+ final SelectTranslator translator = createTranslator(connection);
PreparedStatement prepStmt = translator.createStatement();
+
+ // TODO: ugly... 'createSqlString' is already called inside
+ // 'createStatement', but calling it here again to store for logging
+ // purposes
+ final String sqlString = translator.createSqlString();
+
ResultSet rs;
// need to run in try-catch block to close statement properly if
@@ -87,7 +93,14 @@ public class SelectAction extends BaseSQ
ResultIterator it = workerIterator;
if (observer.isIteratedResult()) {
- it = new ConnectionAwareResultIterator(workerIterator, connection);
+ it = new ConnectionAwareResultIterator(it, connection) {
+ @Override
+ protected void doClose() {
+ //
+ adapter.getJdbcEventLogger().logSelectCount(rowCounter, System.currentTimeMillis() - t1, sqlString);
+ super.doClose();
+ }
+ };
}
// wrap result iterator if distinct has to be suppressed
@@ -157,28 +170,24 @@ public class SelectAction extends BaseSQ
// PreparedStatement in this
// method, instead of relying on DefaultResultIterator to do that later
- if (!observer.isIteratedResult()) {
- // note that we don't need to close ResultIterator
- // since "dataRows" will do it internally
-
+ if (observer.isIteratedResult()) {
+ try {
+ observer.nextRows(translator.getQuery(), it);
+ } catch (Exception ex) {
+ it.close();
+ throw ex;
+ }
+ } else {
List<DataRow> resultRows;
try {
- resultRows = (List<DataRow>) it.allRows();
+ resultRows = it.allRows();
} finally {
it.close();
}
- adapter.getJdbcEventLogger().logSelectCount(resultRows.size(), System.currentTimeMillis() - t1,
- translator.createSqlString());
+ adapter.getJdbcEventLogger().logSelectCount(resultRows.size(), System.currentTimeMillis() - t1, sqlString);
observer.nextRows(query, resultRows);
- } else {
- try {
- observer.nextRows(translator.getQuery(), it);
- } catch (Exception ex) {
- it.close();
- throw ex;
- }
}
}
}