You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by kr...@apache.org on 2008/08/29 09:10:31 UTC

svn commit: r690133 - in /db/derby/code/trunk/java/client/org/apache/derby/client: am/LOBStateTracker.java am/ResultSet.java net/NetCursor.java

Author: kristwaa
Date: Fri Aug 29 00:10:31 2008
New Revision: 690133

URL: http://svn.apache.org/viewvc?rev=690133&view=rev
Log:
DERBY-3601: Optimize LOBStateTracker for non-locator servers.
Cleanup patch changing comments and code naming. No functional changes.
Patch file: derby-3601-1a-comments_and_renaming.diff

Modified:
    db/derby/code/trunk/java/client/org/apache/derby/client/am/LOBStateTracker.java
    db/derby/code/trunk/java/client/org/apache/derby/client/am/ResultSet.java
    db/derby/code/trunk/java/client/org/apache/derby/client/net/NetCursor.java

Modified: db/derby/code/trunk/java/client/org/apache/derby/client/am/LOBStateTracker.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/client/org/apache/derby/client/am/LOBStateTracker.java?rev=690133&r1=690132&r2=690133&view=diff
==============================================================================
--- db/derby/code/trunk/java/client/org/apache/derby/client/am/LOBStateTracker.java (original)
+++ db/derby/code/trunk/java/client/org/apache/derby/client/am/LOBStateTracker.java Fri Aug 29 00:10:31 2008
@@ -23,16 +23,24 @@
 import java.util.Arrays;
 
 /**
- * An object that tracks the state of large objects (LOBs) in a result set.
+ * An object that tracks the state of large objects (LOBs) for the current row
+ * in a result set.
  * <p>
- * This object covers two types of functionality regarding LOBs;
+ * A LOB's state is either unpublished or published. When a LOB is published, it
+ * means that the end-user has been given a reference to the LOB object. This
+ * implies that the LOB cannot be automatically freed/released when the
+ * result set position changes (i.e. typically {@code rs.next()}), because the
+ * LOB object must be kept valid/alive until the transaction is ended or the
+ * LOB object is explicitly freed.
+ * <p>
+ * This class covers two types of functionality regarding LOBs;
  * <ul>
- *      <li>Keep track of whether a LOB column has been accessed.</li>
+ *      <li>Keep track of whether a LOB column has been published or not.</li>
  *      <li>Release LOB locators on the server.</li>
  * </ul>
- * The former functionality is always present in a tracker object. The latter
- * functionality may or may not be available. This is decided by whether
- * locators are supported by the server or not.
+ * Both functionalities will be disabled if the server doesn't support locators.
+ * If locators are enabled, they will be freed when {@link checkCurrentRow} is
+ * called.
  * <p>
  * The tracker has a notion of current row. The current row is changed by
  * calling {@link #checkCurrentRow checkCurrentRow}. The owner of the tracker
@@ -44,21 +52,23 @@
  */
 class LOBStateTracker {
 
-    /** Instance to use when there are no LOBs in the result set. */
+    /**
+     * Instance to use when there are no LOBs in the result set, or when the
+     * server doesn't support locators.
+     */
     public static final LOBStateTracker NO_OP_TRACKER =
             new LOBStateTracker(new int[0], new boolean[0], false);
-
     /** 1-based column indexes for the LOBs to track. */
     private final int[] columns;
-    /** Tells whether a LOB is Blob or a Clob. */
+    /** Tells whether the LOB is Blob or a Clob. */
     private final boolean[] isBlob;
-    /** Tells whether a LOB colum has been accessed in the current row.  */
-    private final boolean[] accessed;
+    /** Tells whether the LOB colum has been published for the current row. */
+    private final boolean[] published;
     /**
      * Tells whether locators shall be released. This will be {@code false} if
      * locators are not supported by the server.
      */
-    private final boolean release;
+    private final boolean doRelease;
     /**
      * The last locator values seen when releasing. These values are used to
      * detect if {@linkplain #checkCurrentRow} is being executed more than once
@@ -71,15 +81,15 @@
      *
      * @param lobIndexes the 1-based indexes of the LOB columns
      * @param isBlob whether the LOB is a Blob or a Clob
-     * @param release whether locators shall be released
+     * @param doRelease whether locators shall be released
      * @see #NO_OP_TRACKER
      */
-    LOBStateTracker(int[] lobIndexes, boolean[] isBlob, boolean release) {
+    LOBStateTracker(int[] lobIndexes, boolean[] isBlob, boolean doRelease) {
         this.columns = lobIndexes;
         this.isBlob = isBlob;
-        this.accessed = new boolean[columns.length];
-        this.release = release;
-        // Zero is an invalid locator, so don't fill with different value.
+        this.published = new boolean[columns.length];
+        this.doRelease = doRelease;
+        // Zero is an invalid locator, don't fill with a valid value.
         this.lastLocatorSeen = new int[columns.length];
     }
 
@@ -94,12 +104,12 @@
      */
     void checkCurrentRow(Cursor cursor)
             throws SqlException {
-        if (this.release) {
+        if (this.doRelease) {
             CallableLocatorProcedures procs = cursor.getLocatorProcedures();
             for (int i=0; i < this.columns.length; i++) {
                 // Note the conversion from 1-based to 0-based index when
                 // checking if the column has a NULL value.
-                if (!this.accessed[i] && !cursor.isNull_[this.columns[i] -1]) {
+                if (!this.published[i] && !cursor.isNull_[this.columns[i] -1]) {
                     // Fetch the locator so we can free it.
                     int locator = cursor.locator(this.columns[i]);
                     if (locator == this.lastLocatorSeen[i]) {
@@ -122,7 +132,7 @@
             }
         }
         // Reset state for the next row.
-        Arrays.fill(this.accessed, false);
+        Arrays.fill(this.published, false);
     }
 
     /**
@@ -133,24 +143,24 @@
      * to release them from the client side in this case.
      */
     void discardState() {
-        // Force the internal state to accessed for all LOB columns.
+        // Force the state to published for all LOB columns.
         // This will cause checkCurrentRow to ignore all LOBs on the next
-        // invocation. The method markAccessed cannot be called before after
+        // invocation. The method markAsPublished cannot be called before after
         // checkCurrentRow has been called again.
-        Arrays.fill(this.accessed, true);
+        Arrays.fill(this.published, true);
     }
 
     /**
-     * Marks the specified column of the current row as accessed, which implies
+     * Marks the specified column of the current row as published, which implies
      * that the tracker should not release the associated locator.
      * <p>
-     * Columns must be marked as accessed when a LOB object is created on
+     * Columns must be marked as published when a LOB object is created on
      * the client, to avoid releasing the corresponding locator too early.
      *
      * @param index 1-based column index
      */
-    void markAccessed(int index) {
+    void markAsPublished(int index) {
         int internalIndex = Arrays.binarySearch(this.columns, index);
-        this.accessed[internalIndex] = true;
+        this.published[internalIndex] = true;
     }
 }

Modified: db/derby/code/trunk/java/client/org/apache/derby/client/am/ResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/client/org/apache/derby/client/am/ResultSet.java?rev=690133&r1=690132&r2=690133&view=diff
==============================================================================
--- db/derby/code/trunk/java/client/org/apache/derby/client/am/ResultSet.java (original)
+++ db/derby/code/trunk/java/client/org/apache/derby/client/am/ResultSet.java Fri Aug 29 00:10:31 2008
@@ -6201,16 +6201,17 @@
     }
 
     /**
-     * Marks the LOB at the specified column as accessed.
+     * Marks the LOB at the specified column as published.
      * <p>
-     * When a LOB is marked as accessed, the release mechanism will not be
+     * When a LOB is marked as published, the release mechanism will not be
      * invoked by the result set. It is expected that the code accessing the
-     * LOB releases the locator when it is done with the LOB.
+     * LOB releases the locator when it is done with the LOB, or that the
+     * commit/rollback handles the release.
      *
      * @param index 1-based column index
      */
-    public final void markLOBAsAccessed(int index) {
-        this.lobState.markAccessed(index);
+    public final void markLOBAsPublished(int index) {
+        this.lobState.markAsPublished(index);
     }
 
     /**

Modified: db/derby/code/trunk/java/client/org/apache/derby/client/net/NetCursor.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/client/org/apache/derby/client/net/NetCursor.java?rev=690133&r1=690132&r2=690133&view=diff
==============================================================================
--- db/derby/code/trunk/java/client/org/apache/derby/client/net/NetCursor.java (original)
+++ db/derby/code/trunk/java/client/org/apache/derby/client/net/NetCursor.java Fri Aug 29 00:10:31 2008
@@ -1083,7 +1083,7 @@
             throws SqlException {
         // Only inform the tracker if the Blob is published to the user.
         if (toBePublished) {
-            netResultSet_.markLOBAsAccessed(column);
+            netResultSet_.markLOBAsPublished(column);
         }
         // Check for locator
         int locator = locator(column);
@@ -1125,7 +1125,7 @@
             throws SqlException {
         // Only inform the tracker if the Clob is published to the user.
         if (toBePublished) {
-            netResultSet_.markLOBAsAccessed(column);
+            netResultSet_.markLOBAsPublished(column);
         }
         // Check for locator
         int locator = locator(column);