HHH-7825 - org.hibernate.type.descriptor.java.DataHelper is incompatible with FireBird JDBC
(cherry picked from commit caf2ee420c
)
This commit is contained in:
parent
a4f6f3069d
commit
87dd786b9a
|
@ -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 ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue