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 dj...@apache.org on 2006/04/26 23:51:21 UTC
svn commit: r397313 -
/db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedBlob.java
Author: djd
Date: Wed Apr 26 14:51:20 2006
New Revision: 397313
URL: http://svn.apache.org/viewcvs?rev=397313&view=rev
Log:
DERBY-438 (partial) Optimize Blob.length() to avoid reading the whole stream if the length
is encoded in the stream from the store or the length has already been obtained once.
Modified:
db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedBlob.java
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedBlob.java
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedBlob.java?rev=397313&r1=397312&r2=397313&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedBlob.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedBlob.java Wed Apr 26 14:51:20 2006
@@ -70,9 +70,15 @@
final class EmbedBlob extends ConnectionChild implements Blob
{
- // clob is either bytes or stream
+ // blob is either bytes or stream
private boolean isBytes;
private InputStream myStream;
+ /*
+ * Length of the BLOB if known. Set to -1 if
+ * the current length of the BLOB is not known.
+ */
+ private long myLength = -1;
+
private byte[] myBytes;
// note: cannot control position of the stream since user can do a getBinaryStream
private long pos;
@@ -107,6 +113,7 @@
if (SanityManager.DEBUG)
SanityManager.ASSERT(dvdBytes != null,"blob has a null value underneath");
+ myLength = dvdBytes.length;
myBytes = new byte[dvdBytes.length];
System.arraycopy(dvdBytes, 0, myBytes, 0, dvdBytes.length);
}
@@ -208,12 +215,13 @@
public long length()
throws SQLException
{
+ if (myLength != -1)
+ return myLength;
+
boolean pushStack = false;
try
{
- if (isBytes)
- return myBytes.length;
- // we have a stream
+ // we have a stream
synchronized (getConnectionSynchronization())
{
pushStack = !getEmbedConnection().isClosed();
@@ -221,6 +229,14 @@
setupContextStack();
setPosition(0);
+ // If possible get the length from the encoded
+ // length at the front of the raw stream.
+ if ((myLength = biStream.getLength()) != -1) {
+ biStream.close();
+ return myLength;
+ }
+
+ // Otherwise have to read the entire stream!
for (;;)
{
int size = biStream.read(buf);
@@ -228,6 +244,9 @@
break;
pos += size;
}
+ // Save for future uses.
+ myLength = pos;
+ biStream.close();
return pos;
}
}