Sybase by default silently truncates a string which is longer than the column length without raising an exception

Details

Description

By default, Sybase silently truncates a string which is longer than the column length without raising an exception. To override this behavior, string_rtruncation must be set on. In order to be consistent with other databases (which raise exceptions when a string length is longer than the column length), we will set string_rtruncation on by default for Sybase. For an application that wants to keep Sybase silent truncation behavior, a DBDictionary property "setStringRightTruncationOn" is introduced. When it is set to false in the persistence.xml, the string will be silently truncated during insert/update.

Activity

Following part of the patch in JDBCStoreManager appears to be too specifc

public Connection getConnection() {
connect(true);
+ try

{
+ _dict.raiseRightTruncationException(_conn);
+ }

catch (SQLException se)

{
+ throw SQLExceptions.getStore(se, _dict);
+ }

return _conn;
}

Suggested
a) more generic name such as DBDictionary.setConnection(Connection conn) or DBDictionary.initializeSettings(Connection conn) or similar.
b) more importantly, the more appropriate location for this invocation is internal connect(boolean) method itself where the exception handling is carried out.

{
// connect if the connection is currently null, or if
// the connection has been closed out from under us
if (_conn == null)
_conn = connectInternal();
if (ref)
_conn.ref();
+ _dict.initializeSettings(_conn);
}

catch (SQLException se)

{
throw SQLExceptions.getStore(se, _dict);
} finally {

actually be
try {
// connect if the connection is currently null, or if
// the connection has been closed out from under us
- if (_conn == null)
+ if (_conn == null) {
_conn = connectInternal();
+ _dict.initializeSettings(_conn);
+ }
if (ref)
_conn.ref();
} catch (SQLException se) {
throw SQLExceptions.getStore(se, _dict);
}

finally {

It seems like we'd only need to set the truncation property the first time we obtain a connection, not every time the store uses it.

Michael Dick
added a comment - 20/Oct/08 23:27 Shouldn't :
— openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java (revision 706319)
+++ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java (working copy)
@@ -920,6 +920,7 @@
try
{
// connect if the connection is currently null, or if
// the connection has been closed out from under us
if (_conn == null)
_conn = connectInternal();
if (ref)
_conn.ref();
+ _dict.initializeSettings(_conn);
}
catch (SQLException se)
{
throw SQLExceptions.getStore(se, _dict);
} finally {
actually be
try {
// connect if the connection is currently null, or if
// the connection has been closed out from under us
- if (_conn == null)
+ if (_conn == null) {
_conn = connectInternal();
+ _dict.initializeSettings(_conn);
+ }
if (ref)
_conn.ref();
} catch (SQLException se) {
throw SQLExceptions.getStore(se, _dict);
}
finally {
It seems like we'd only need to set the truncation property the first time we obtain a connection, not every time the store uses it.