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 2006/05/09 02:33:55 UTC
svn commit: r405244 - in
/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access:
DataContext.java jdbc/JDBCResultIterator.java
Author: aadamchik
Date: Mon May 8 17:33:53 2006
New Revision: 405244
URL: http://svn.apache.org/viewcvs?rev=405244&view=rev
Log:
CAY-545
Modified:
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataContext.java
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/jdbc/JDBCResultIterator.java
Modified: incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataContext.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataContext.java?rev=405244&r1=405243&r2=405244&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataContext.java (original)
+++ incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataContext.java Mon May 8 17:33:53 2006
@@ -934,8 +934,8 @@
public boolean visitCollectionArc(CollectionProperty property) {
property.injectValueHolder(object);
-
- if(!property.isFault(object)) {
+
+ if (!property.isFault(object)) {
Iterator it = ((Collection) property.readProperty(object)).iterator();
while (it.hasNext()) {
Object target = it.next();
@@ -961,7 +961,7 @@
if (target instanceof DataObject) {
DataObject targetDO = (DataObject) target;
-
+
// make sure it is registered
registerNewObject(targetDO);
getObjectStore().recordArcCreated(
@@ -977,6 +977,7 @@
}
});
}
+
/**
* Unregisters a Collection of DataObjects from the DataContext and the underlying
* ObjectStore. This operation also unsets DataContext and ObjectId for each object
@@ -1298,10 +1299,57 @@
}
/**
- * Performs a single database select query returning result as a ResultIterator.
- * Returned ResultIterator will provide access to DataRows.
+ * Performs a single database select query returning result as a ResultIterator. It is
+ * caller's responsibility to explicitly close the ResultIterator. A failure to do so
+ * will result in a database connection not being released. Another side effect of an
+ * open ResultIterator is that an internal Cayenne transaction that originated in this
+ * method stays open until the iterator is closed. So users should normally close the
+ * iterator within the same thread that opened it.
*/
public ResultIterator performIteratedQuery(Query query) throws CayenneException {
+ if (Transaction.getThreadTransaction() != null) {
+ return internalPerformIteratedQuery(query);
+ }
+ else {
+
+ // manually manage a transaction, so that a ResultIterator wrapper could close
+ // it when it is done.
+ Transaction tx = getParentDataDomain().createTransaction();
+ Transaction.bindThreadTransaction(tx);
+
+ ResultIterator result;
+ try {
+ result = internalPerformIteratedQuery(query);
+ }
+ catch (Exception e) {
+ Transaction.bindThreadTransaction(null);
+ tx.setRollbackOnly();
+ throw new CayenneException(e);
+ }
+ finally {
+ // note: we are keeping the transaction bound to the current thread on
+ // success - iterator will unbind it. Unsetting a transaction here would
+ // result in some strangeness, at least on Ingres
+
+ if (tx.getStatus() == Transaction.STATUS_MARKED_ROLLEDBACK) {
+ try {
+ tx.rollback();
+ }
+ catch (Exception rollbackEx) {
+ }
+ }
+ }
+
+ return new TransactionResultIteratorDecorator(result, tx);
+ }
+ }
+
+ /**
+ * Runs an iterated query in transactional context provided by the caller.
+ *
+ * @since 1.2
+ */
+ ResultIterator internalPerformIteratedQuery(Query query) throws CayenneException {
// note that for now DataChannel API does not support cursors (aka
// ResultIterator), so we have to go directly to the DataDomain.
IteratedSelectObserver observer = new IteratedSelectObserver();
Modified: incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/jdbc/JDBCResultIterator.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/jdbc/JDBCResultIterator.java?rev=405244&r1=405243&r2=405244&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/jdbc/JDBCResultIterator.java (original)
+++ incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/jdbc/JDBCResultIterator.java Mon May 8 17:33:53 2006
@@ -237,6 +237,10 @@
}
}
+ // TODO: andrus, 5/8/2006 - closing connection within JDBCResultIterator is
+ // obsolete as this is bound to transaction closing in DataContext. Deprecate
+ // this after 1.2
+
// close connection, if this object was explicitly configured to be
// responsible for doing it
if (connection != null && isClosingConnection()) {