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 2010/06/04 13:06:09 UTC
svn commit: r951363 - in /db/derby/code/branches/10.5: ./
java/engine/org/apache/derby/iapi/types/
java/engine/org/apache/derby/impl/jdbc/
Author: kristwaa
Date: Fri Jun 4 11:06:09 2010
New Revision: 951363
URL: http://svn.apache.org/viewvc?rev=951363&view=rev
Log:
DERBY-4661: Reduce size of encoding buffer for short character values
DERBY-4543: CLOB values incorrectly stored on disk using the old header format
Merged fixes from trunk (revisions 908418 and 948069).
Modified:
db/derby/code/branches/10.5/ (props changed)
db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/CharStreamHeaderGenerator.java
db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/ClobStreamHeaderGenerator.java
db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/ReaderToUTF8Stream.java
db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/SQLChar.java
db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/SQLClob.java
db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/StreamHeaderGenerator.java
db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/StringDataValue.java
db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/jdbc/EmbedPreparedStatement.java
db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/jdbc/EmbedResultSet.java
Propchange: db/derby/code/branches/10.5/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jun 4 11:06:09 2010
@@ -1 +1 @@
-/db/derby/code/trunk:769596,769602,769606,769962,772090,772337,772449,772534,774281,777105,779681,782991,785131,785139,785163,785570,785662,788369,788670,788674,788968,789264,790218,792434,793089,793588,794106,794303,794955,795166,796020,796027,796316,796372,797147,798347,798742,800523,803548,803948,805696,808494,808850,809643,810860,812669,816531,816536,819006,822289,823659,824694,829022,832379,833430,835286,881074,881444,882732,884163,887246,892912,897161,901165,901648,901760,903108,911315,915733,916075,916897,918359,921028,927430,946794,948045
+/db/derby/code/trunk:769596,769602,769606,769962,772090,772337,772449,772534,774281,777105,779681,782991,785131,785139,785163,785570,785662,788369,788670,788674,788968,789264,790218,792434,793089,793588,794106,794303,794955,795166,796020,796027,796316,796372,797147,798347,798742,800523,803548,803948,805696,808494,808850,809643,810860,812669,816531,816536,819006,822289,823659,824694,829022,832379,833430,835286,881074,881444,882732,884163,887246,892912,897161,901165,901648,901760,903108,908418,911315,915733,916075,916897,918359,921028,927430,946794,948045,948069
Modified: db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/CharStreamHeaderGenerator.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/CharStreamHeaderGenerator.java?rev=951363&r1=951362&r2=951363&view=diff
==============================================================================
--- db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/CharStreamHeaderGenerator.java (original)
+++ db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/CharStreamHeaderGenerator.java Fri Jun 4 11:06:09 2010
@@ -134,4 +134,13 @@ public final class CharStreamHeaderGener
return 0;
}
}
+
+ /**
+ * Returns the maximum header length.
+ *
+ * @return Maximum header length in bytes.
+ */
+ public int getMaxHeaderLength() {
+ return 2;
+ }
}
Modified: db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/ClobStreamHeaderGenerator.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/ClobStreamHeaderGenerator.java?rev=951363&r1=951362&r2=951363&view=diff
==============================================================================
--- db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/ClobStreamHeaderGenerator.java (original)
+++ db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/ClobStreamHeaderGenerator.java Fri Jun 4 11:06:09 2010
@@ -56,7 +56,8 @@ public final class ClobStreamHeaderGener
/**
* Reference to "owning" DVD, used to update it with information about
- * whether the database is being accessed in soft upgrade mode or not.
+ * which header format should be used. This is currently only determined by
+ * consulting the data dictionary about the version.
* <p>
* This is an optimization to avoid having to consult the data dictionary
* on every request to generate a header when a data value descriptor is
@@ -64,15 +65,15 @@ public final class ClobStreamHeaderGener
*/
private final StringDataValue callbackDVD;
/**
- * {@code true} if database is being accessed in soft upgrade mode,
- * {@code false} is not. If {@code null}, the mode will be determined by
- * obtaining the database context through the context service.
+ * {@code true} if the database version is prior to 10.5, {@code false} if
+ * the version is 10.5 or newer. If {@code null}, the version will be
+ * determined by obtaining the database context through the context service.
*/
- private Boolean inSoftUpgradeMode;
+ private Boolean isPreDerbyTenFive;
/**
* Creates a new generator that will use the context manager to determine
- * if the database is being accessed in soft upgrade mode or not.
+ * which header format to use based on the database version.
*
* @param dvd the owning data value descriptor
*/
@@ -84,33 +85,34 @@ public final class ClobStreamHeaderGener
}
/**
- * Creates a new generator for a database in the given mode.
+ * Creates a new generator using the specified header format.
*
- * @param inSoftUpgradeMode {@code true} if the database is being accessed
- * in soft upgrade mode, {@code false} if not
+ * @param isPreDerbyTenFive {@code true} if the database version is prior
+ * to 10.5, {@code false} if the version is 10.5 or newer
*/
- public ClobStreamHeaderGenerator(boolean inSoftUpgradeMode) {
- // Do not try to determine if we are in soft upgrade mode, use the
- // specified value for it.
+ public ClobStreamHeaderGenerator(boolean isPreDerbyTenFive) {
+ // Do not try to determine the version through the cottext service, use
+ // the specified value instead.
this.callbackDVD = null;
- this.inSoftUpgradeMode = Boolean.valueOf(inSoftUpgradeMode);
+ this.isPreDerbyTenFive = Boolean.valueOf(isPreDerbyTenFive);
}
/**
* Tells if the header encodes a character or byte count.
* <p>
* Currently the header expects a character count if the header format is
- * 10.5 (or newer), and a byte count if we are accessing a database in
- * soft upgrade mode.
+ * 10.5 (or newer), and a byte count if we are accessing a database created
+ * by a version prior to 10.5.
*
- * @return {@code false} if in soft upgrade mode, {@code true} if not.
+ * @return {@code false} if a byte count is expected (prior to 10.5),
+ * {@code true} if a character count is expected (10.5 and newer).
*/
public boolean expectsCharCount() {
- if (callbackDVD != null && inSoftUpgradeMode == null) {
- determineMode();
+ if (callbackDVD != null && isPreDerbyTenFive == null) {
+ determineHeaderFormat();
}
- // Expect byte count if in soft upgrade mode, char count otherwise.
- return !inSoftUpgradeMode.booleanValue();
+ // Expect byte count if older than 10.5, char count otherwise.
+ return !isPreDerbyTenFive.booleanValue();
}
/**
@@ -123,11 +125,11 @@ public final class ClobStreamHeaderGener
* @return The number of bytes written into the buffer.
*/
public int generateInto(byte[] buf, int offset, long valueLength) {
- if (callbackDVD != null && inSoftUpgradeMode == null) {
- determineMode();
+ if (callbackDVD != null && isPreDerbyTenFive == null) {
+ determineHeaderFormat();
}
int headerLength = 0;
- if (inSoftUpgradeMode == Boolean.FALSE) {
+ if (isPreDerbyTenFive == Boolean.FALSE) {
// Write a 10.5 stream header format.
// Assume the length specified is a char count.
if (valueLength >= 0){
@@ -159,11 +161,11 @@ public final class ClobStreamHeaderGener
*/
public int generateInto(ObjectOutput out, long valueLength)
throws IOException {
- if (callbackDVD != null && inSoftUpgradeMode == null) {
- determineMode();
+ if (callbackDVD != null && isPreDerbyTenFive == null) {
+ determineHeaderFormat();
}
int headerLength = 0;
- if (inSoftUpgradeMode == Boolean.FALSE) {
+ if (isPreDerbyTenFive == Boolean.FALSE) {
// Write a 10.5 stream header format.
headerLength = 5;
// Assume the length specified is a char count.
@@ -195,10 +197,10 @@ public final class ClobStreamHeaderGener
* @return Number of bytes written (zero or more).
*/
public int writeEOF(byte[] buffer, int offset, long valueLength) {
- if (callbackDVD != null && inSoftUpgradeMode == null) {
- determineMode();
+ if (callbackDVD != null && isPreDerbyTenFive == null) {
+ determineHeaderFormat();
}
- if (!inSoftUpgradeMode.booleanValue()) {
+ if (!isPreDerbyTenFive.booleanValue()) {
if (valueLength < 0) {
System.arraycopy(DERBY_EOF_MARKER, 0,
buffer, offset, DERBY_EOF_MARKER.length);
@@ -221,10 +223,10 @@ public final class ClobStreamHeaderGener
*/
public int writeEOF(ObjectOutput out, long valueLength)
throws IOException {
- if (callbackDVD != null && inSoftUpgradeMode == null) {
- determineMode();
+ if (callbackDVD != null && isPreDerbyTenFive == null) {
+ determineHeaderFormat();
}
- if (!inSoftUpgradeMode.booleanValue()) {
+ if (!isPreDerbyTenFive.booleanValue()) {
if (valueLength < 0) {
out.write(DERBY_EOF_MARKER);
return DERBY_EOF_MARKER.length;
@@ -237,10 +239,24 @@ public final class ClobStreamHeaderGener
}
/**
- * Determines if the database being accessed is accessed in soft upgrade
- * mode or not.
+ * Returns the maximum header length.
+ *
+ * @return Maximum header length in bytes.
+ */
+ public int getMaxHeaderLength() {
+ return 5;
+ }
+
+ /**
+ * Determines which header format to use.
+ * <p>
+ * <em>Implementation note:</em> The header format is determined by
+ * consulting the data dictionary throught the context service. If there is
+ * no context, the operation will fail.
+ *
+ * @throws IllegalStateException if there is no context
*/
- private void determineMode() {
+ private void determineHeaderFormat() {
DatabaseContext dbCtx = (DatabaseContext)
ContextService.getContext(DatabaseContext.CONTEXT_ID);
if (dbCtx == null) {
@@ -249,7 +265,7 @@ public final class ClobStreamHeaderGener
} else {
DataDictionary dd = dbCtx.getDatabase().getDataDictionary();
try {
- inSoftUpgradeMode = Boolean.valueOf(!dd.checkVersion(
+ isPreDerbyTenFive = Boolean.valueOf(!dd.checkVersion(
DataDictionary.DD_VERSION_DERBY_10_5, null));
} catch (StandardException se) {
// This should never happen as long as the second argument
@@ -263,7 +279,7 @@ public final class ClobStreamHeaderGener
// being accessed in. It is assumed that a DVD is only shared
// within a single database, i.e. the mode doesn't change during
// the lifetime of the DVD.
- callbackDVD.setSoftUpgradeMode(inSoftUpgradeMode);
+ callbackDVD.setStreamHeaderFormat(isPreDerbyTenFive);
}
}
}
Modified: db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/ReaderToUTF8Stream.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/ReaderToUTF8Stream.java?rev=951363&r1=951362&r2=951363&view=diff
==============================================================================
--- db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/ReaderToUTF8Stream.java (original)
+++ db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/ReaderToUTF8Stream.java Fri Jun 4 11:06:09 2010
@@ -51,6 +51,8 @@ public final class ReaderToUTF8Stream
/** Constant indicating the first iteration of {@code fillBuffer}. */
private final static int FIRST_READ = Integer.MIN_VALUE;
+ /** Buffer space reserved for one 3 byte encoded char and the EOF marker. */
+ private final static int READ_BUFFER_RESERVATION = 6;
/**
* Constant indicating that no mark is set in the stream, or that the read
* ahead limit of the mark has been exceeded.
@@ -58,10 +60,11 @@ public final class ReaderToUTF8Stream
private final static int MARK_UNSET_OR_EXCEEDED = -1;
/**
* Buffer to hold the data read from stream and converted to the modified
- * UTF-8 format. The initial size is 32 KB, but it may grow if the
+ * UTF-8 format. The initial size is dependent on whether the data value
+ * length is known (limited upwards to 32 KB), but it may grow if
* {@linkplain #mark(int)} is invoked.
*/
- private byte[] buffer = new byte[32*1024];
+ private byte[] buffer;
private int boff;
private int blen = -1;
/** Stream mark, set through {@linkplain #mark(int)}. */
@@ -83,7 +86,7 @@ public final class ReaderToUTF8Stream
* Number of characters to truncate from this stream.
* The SQL standard allows for truncation of trailing spaces for CLOB,
* VARCHAR and CHAR. If zero, no characters are truncated, unless the
- * stream length execeeds the maximum length of the column we are inserting
+ * stream length exceeds the maximum length of the column we are inserting
* into.
*/
private final int charsToTruncate;
@@ -124,11 +127,13 @@ public final class ReaderToUTF8Stream
String typeName,
StreamHeaderGenerator headerGenerator) {
this.reader = new LimitReader(appReader);
- reader.setLimit(valueLength);
this.charsToTruncate = numCharsToTruncate;
this.valueLength = valueLength;
this.typeName = typeName;
this.hdrGen = headerGenerator;
+
+ int absValueLength = Math.abs(valueLength);
+ reader.setLimit(absValueLength);
if (SanityManager.DEBUG) {
// Check the type name
// The national types (i.e. NVARCHAR) are not used/supported.
@@ -138,6 +143,17 @@ public final class ReaderToUTF8Stream
typeName.equals(TypeId.CLOB_NAME)) ||
typeName.equals(TypeId.LONGVARCHAR_NAME));
}
+ // Optimization for small values, where we reduce the memory
+ // requirement during encoding/insertion.
+ // Be conservative, assume three bytes per char.
+ int bz = 32*1024; // 32 KB default
+ if (absValueLength < bz / 3) {
+ // Enforce a minimum size of the buffer, otherwise read may loop
+ // indefinitely (must enter for loop in fillBuffer to detect EOF).
+ bz = hdrGen.getMaxHeaderLength() +
+ Math.max(READ_BUFFER_RESERVATION, absValueLength * 3 +3);
+ }
+ buffer = new byte[bz];
}
/**
@@ -167,7 +183,6 @@ public final class ReaderToUTF8Stream
throw new IllegalArgumentException("Maximum length for a capped " +
"stream cannot be negative: " + maximumLength);
}
- reader.setLimit(maximumLength);
}
/**
@@ -325,7 +340,7 @@ public final class ReaderToUTF8Stream
if (mark >= 0) {
// Add 6 bytes reserved for one 3 byte character encoding and the
// 3 byte Derby EOF marker (see encoding loop further down).
- int spaceRequired = readAheadLimit + 6;
+ int spaceRequired = readAheadLimit + READ_BUFFER_RESERVATION;
if (mark + spaceRequired > buffer.length) {
if (blen != -1) {
// Calculate the new offset, as we may have to shift bytes
@@ -347,7 +362,7 @@ public final class ReaderToUTF8Stream
// 6! need to leave room for a three byte UTF8 encoding
// and 3 bytes for our special end of file marker.
- for (; off <= buffer.length - 6; )
+ for (; off <= buffer.length - READ_BUFFER_RESERVATION; )
{
int c = reader.read();
if (c < 0) {
@@ -558,7 +573,7 @@ public final class ReaderToUTF8Stream
*/
public void reset()
throws IOException {
- // Throw execption if the stream has been closed implicitly or
+ // Throw exception if the stream has been closed implicitly or
// explicitly.
if (buffer == null) {
throw new EOFException(MessageService.getTextMessage
Modified: db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/SQLChar.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/SQLChar.java?rev=951363&r1=951362&r2=951363&view=diff
==============================================================================
--- db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/SQLChar.java (original)
+++ db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/SQLChar.java Fri Jun 4 11:06:09 2010
@@ -3044,7 +3044,7 @@ readingLoop:
* in soft upgrade mode, {@code false} if not, and {@code null} if
* unknown
*/
- public void setSoftUpgradeMode(Boolean inSoftUpgradeMode) {
+ public void setStreamHeaderFormat(Boolean inSoftUpgradeMode) {
// Ignore this for CHAR, VARCHAR and LONG VARCHAR.
}
Modified: db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/SQLClob.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/SQLClob.java?rev=951363&r1=951362&r2=951363&view=diff
==============================================================================
--- db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/SQLClob.java (original)
+++ db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/SQLClob.java Fri Jun 4 11:06:09 2010
@@ -56,10 +56,6 @@ import java.util.Calendar;
public class SQLClob
extends SQLVarchar
{
-
- /** The maximum number of bytes used by the stream header. */
- private static final int MAX_STREAM_HEADER_LENGTH = 5;
-
/** The header generator used for 10.4 (or older) databases. */
private static final StreamHeaderGenerator TEN_FOUR_CLOB_HEADER_GENERATOR =
new ClobStreamHeaderGenerator(true);
@@ -69,6 +65,14 @@ public class SQLClob
new ClobStreamHeaderGenerator(false);
/**
+ * The maximum number of bytes used by the stream header.
+ * <p>
+ * Use the length specified by the ten five header generator.
+ */
+ private static final int MAX_STREAM_HEADER_LENGTH =
+ TEN_FIVE_CLOB_HEADER_GENERATOR.getMaxHeaderLength();
+
+ /**
* The descriptor for the stream. If there is no stream this should be
* {@code null}, which is also true if the descriptor hasen't been
* constructed yet.
@@ -577,7 +581,7 @@ public class SQLClob
* <p>
* <em>NOTE</em>: To guarantee a successful generation, one of the following
* two conditions must be met at header or EOF generation time:
- * <ul> <li>{@code setSoftUpgradeMode} has been invoked before the header
+ * <ul> <li>{@code setStreamHeaderFormat} has been invoked before the header
* generator was obtained.</li>
* <li>There is context at generation time, such that the mode can be
* determined by obtaining the database context and by consulting
@@ -606,7 +610,7 @@ public class SQLClob
* @param inSoftUpgradeMode {@code TRUE} if the database is accessed in
* soft upgrade mode, {@code FALSE} is not, or {@code null} if unknown
*/
- public void setSoftUpgradeMode(Boolean inSoftUpgradeMode) {
+ public void setStreamHeaderFormat(Boolean inSoftUpgradeMode) {
this.inSoftUpgradeMode = inSoftUpgradeMode;
}
Modified: db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/StreamHeaderGenerator.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/StreamHeaderGenerator.java?rev=951363&r1=951362&r2=951363&view=diff
==============================================================================
--- db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/StreamHeaderGenerator.java (original)
+++ db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/StreamHeaderGenerator.java Fri Jun 4 11:06:09 2010
@@ -86,4 +86,11 @@ public interface StreamHeaderGenerator {
* @throws IOException if writing to the destination stream fails
*/
int writeEOF(ObjectOutput out, long valueLength) throws IOException;
+
+ /**
+ * Returns the maximum length of the header.
+ *
+ * @return Max header length in bytes.
+ */
+ int getMaxHeaderLength();
}
Modified: db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/StringDataValue.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/StringDataValue.java?rev=951363&r1=951362&r2=951363&view=diff
==============================================================================
--- db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/StringDataValue.java (original)
+++ db/derby/code/branches/10.5/java/engine/org/apache/derby/iapi/types/StringDataValue.java Fri Jun 4 11:06:09 2010
@@ -208,19 +208,18 @@ public interface StringDataValue extends
* Note that the generator may fail to generate a header if there is no
* context at the time the header is asked for, and the mode hasn't been
* set explicitly.
- * @see #setSoftUpgradeMode
+ * @see #setStreamHeaderFormat
*/
public StreamHeaderGenerator getStreamHeaderGenerator();
/**
- * Tells the data value descriptor whether the database is being accessed
- * in soft upgrade mode or not.
+ * Tells the data value descriptor which CLOB stream header format to use.
*
- * @param inSoftUpgradeMode {@code true} if the database is being accessed
- * in soft upgrade mode, {@code false} if not, and {@code null} if
- * unknown
+ * @param usePreTenFiveHdrFormat {@code true} if the database accessed is
+ * prior to version 10.5, {@code false} if the version is 10.5 or
+ * newer, and {@code null} if unknown at this time
*/
- public void setSoftUpgradeMode(Boolean inSoftUpgradeMode);
+ public void setStreamHeaderFormat(Boolean usePreTenFiveHdrFormat);
/**
* Returns a descriptor for the input stream for this data value.
Modified: db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/jdbc/EmbedPreparedStatement.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/jdbc/EmbedPreparedStatement.java?rev=951363&r1=951362&r2=951363&view=diff
==============================================================================
--- db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/jdbc/EmbedPreparedStatement.java (original)
+++ db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/jdbc/EmbedPreparedStatement.java Fri Jun 4 11:06:09 2010
@@ -93,12 +93,13 @@ public abstract class EmbedPreparedState
protected PreparedStatement preparedStatement;
private Activation activation;
/**
- * Tells if we're accessing a database in soft upgrade mode or not.
+ * Tells which header format to use when writing CLOBs into the store.
* <p>
- * This is lazily set if we need it.
- * @see #isSoftUpgraded()
+ * This is lazily set if we need it, and there are currently only two
+ * valid header formats to choose between.
+ * @see #usePreTenFiveHdrFormat()
*/
- private Boolean inSoftUpgradeMode;
+ private Boolean usePreTenFiveHdrFormat;
private BrokeredConnectionControl bcc=null;
@@ -743,7 +744,7 @@ public abstract class EmbedPreparedState
ReaderToUTF8Stream utfIn;
final StringDataValue dvd = (StringDataValue)
getParms().getParameter(parameterIndex -1);
- dvd.setSoftUpgradeMode(isSoftUpgraded());
+ dvd.setStreamHeaderFormat(usePreTenFiveHdrFormat());
// Need column width to figure out if truncation is needed
DataTypeDescriptor dtd[] = preparedStatement
.getParameterTypes();
@@ -809,21 +810,23 @@ public abstract class EmbedPreparedState
}
/**
- * Tells if the database being accessed is soft upgraded or not.
+ * Determines which header format to use for CLOBs when writing them to
+ * the store.
*
- * @return {@code true} if database is soft upgraded, {@code false} if not.
+ * @return {@code true} if the pre Derby 10.5 header format is to be used,
+ * {@code false} if the new header format can be used (10.5 or newer)
* @throws StandardException if obtaining the access mode fails
*/
- private Boolean isSoftUpgraded()
+ private Boolean usePreTenFiveHdrFormat()
throws StandardException {
- // Determine if we are accessing a soft upgraded database or not.
+ // Determine the version of the database we are accessing.
// This is required to write the correct stream header format for Clobs.
- if (inSoftUpgradeMode == null) {
- inSoftUpgradeMode = Boolean.valueOf(
- lcc.getDataDictionary().checkVersion(
- DataDictionary.DD_VERSION_CURRENT, null));
+ if (usePreTenFiveHdrFormat == null) {
+ usePreTenFiveHdrFormat = Boolean.valueOf(
+ !lcc.getDataDictionary().checkVersion(
+ DataDictionary.DD_VERSION_DERBY_10_5, null));
}
- return inSoftUpgradeMode;
+ return usePreTenFiveHdrFormat;
}
/**
Modified: db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/jdbc/EmbedResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/jdbc/EmbedResultSet.java?rev=951363&r1=951362&r2=951363&view=diff
==============================================================================
--- db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/jdbc/EmbedResultSet.java (original)
+++ db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/jdbc/EmbedResultSet.java Fri Jun 4 11:06:09 2010
@@ -2929,11 +2929,10 @@ public abstract class EmbedResultSet ext
getDVDforColumnToBeUpdated(columnIndex, updateMethodName);
// In the case of updatable result sets, we cannot guarantee that a
// context is pushed when the header needs to be generated. To fix
- // this, tell the DVD/generator whether we are running in soft
- // upgrade mode or not.
- dvd.setSoftUpgradeMode(Boolean.valueOf(
+ // this, tell the DVD/generator which header format to use.
+ dvd.setStreamHeaderFormat(Boolean.valueOf(
!getEmbedConnection().getDatabase().getDataDictionary().
- checkVersion(DataDictionary.DD_VERSION_CURRENT, null)));
+ checkVersion(DataDictionary.DD_VERSION_DERBY_10_5, null)));
ReaderToUTF8Stream utfIn;
int usableLength = DataValueDescriptor.UNKNOWN_LOGICAL_LENGTH;
if (!lengthLess) {