HHH-7825 - org.hibernate.type.descriptor.java.DataHelper is incompatible with FireBird JDBC

(cherry picked from commit caf2ee420c)
This commit is contained in:
Steve Ebersole 2012-11-26 17:49:55 -06:00
parent a4f6f3069d
commit 87dd786b9a
1 changed files with 26 additions and 10 deletions

View File

@ -30,6 +30,7 @@ import java.io.Reader;
import java.io.StringReader; import java.io.StringReader;
import java.sql.Clob; import java.sql.Clob;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import org.jboss.logging.Logger; import org.jboss.logging.Logger;
@ -268,26 +269,41 @@ public class DataHelper {
/** /**
* Extract the contents of the given Clob as a string. * Extract the contents of the given Clob as a string.
* *
* @param reader The reader for the content * @param value The clob to to be extracted from
* *
* @return The content as string * @return The content as string
*/ */
public static String extractString(final Clob value) { public static String extractString(final Clob value) {
try { try {
Reader characterStream = value.getCharacterStream(); final Reader characterStream = value.getCharacterStream();
long length = value.length(); final long length = determineLengthForBufferSizing( value );
if ( length > Integer.MAX_VALUE ) { return length > Integer.MAX_VALUE
return extractString( characterStream, Integer.MAX_VALUE ); ? extractString( characterStream, Integer.MAX_VALUE )
} : extractString( characterStream, (int) length );
else {
return extractString( characterStream, (int) length );
}
} }
catch ( SQLException e ) { catch ( SQLException e ) {
throw new HibernateException( "Unable to access lob stream", e ); throw new HibernateException( "Unable to access lob stream", e );
} }
} }
/**
* Determine a buffer size for reading the underlying character stream.
*
* @param value The Clob value
*
* @return The appropriate buffer size ({@link java.sql.Clob#length()} by default.
*
* @throws SQLException
*/
private static long determineLengthForBufferSizing(Clob value) throws SQLException {
try {
return value.length();
}
catch ( SQLFeatureNotSupportedException e ) {
return BUFFER_SIZE;
}
}
/** /**
* Make sure we allocate a buffer sized not bigger than 2048, * Make sure we allocate a buffer sized not bigger than 2048,
* not higher than what is actually needed, and at least one. * not higher than what is actually needed, and at least one.
@ -295,7 +311,7 @@ public class DataHelper {
* @param lengthHint the expected size of the full value * @param lengthHint the expected size of the full value
* @return the buffer size * @return the buffer size
*/ */
private static final int getSuggestedBufferSize(final int lengthHint) { private static int getSuggestedBufferSize(final int lengthHint) {
return Math.max( 1, Math.min( lengthHint , BUFFER_SIZE ) ); return Math.max( 1, Math.min( lengthHint , BUFFER_SIZE ) );
} }
} }