svn commit: r959868 - /ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/JdbcValueHandler.java

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r959868 - /ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/JdbcValueHandler.java

adrianc
Author: adrianc
Date: Fri Jul  2 06:28:14 2010
New Revision: 959868

URL: http://svn.apache.org/viewvc?rev=959868&view=rev
Log:
Small enhancement to JdbcValueHandler: add support for sub-second Timestamp precision on databases that don't support it.

If a user chooses to do so, they can assign the date-time field type to a CHAR(30) SQL type. This will enable sub-second Timestamp precision on databases that don't support it.

The Timestamp will be stored as a string in JDBC Timestamp format (yyyy-mm-dd hh:mm:ss.fffffffff). Date/time comparisons can still be performed in SQL statements, but any date/time functions performed on the field will fail. Users could create UDFs to mimic those functions.

In addition, the CHAR(30) field will consume more storage space than a native Timestamp field (usually 8 bytes).

It will be up to the user to decide if they want to use this feature. If used in a pure OFBiz environment, everything should work as expected.

Modified:
    ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/JdbcValueHandler.java

Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/JdbcValueHandler.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/JdbcValueHandler.java?rev=959868&r1=959867&r2=959868&view=diff
==============================================================================
--- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/JdbcValueHandler.java (original)
+++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/JdbcValueHandler.java Fri Jul  2 06:28:14 2010
@@ -29,6 +29,7 @@ import java.sql.Blob;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.sql.Timestamp;
 import java.sql.Types;
 import java.util.Map;
 
@@ -698,6 +699,11 @@ public abstract class JdbcValueHandler {
 
     /**
      * A <code>java.sql.Timestamp</code> JDBC value handler.
+     * <p>This <code>JdbcValueHandler</code> accommodates databases that
+     * don't support sub-second precision. If the date-time field type
+     * is a <code>CHAR(30)</code> SQL type, <code>java.sql.Timestamp</code>s
+     * will be stored as JDBC escape strings
+     * (<code>yyyy-mm-dd hh:mm:ss.fffffffff</code>).</p>
      */
     protected static class TimestampJdbcValueHandler extends JdbcValueHandler {
         protected TimestampJdbcValueHandler(int jdbcType) {
@@ -713,7 +719,22 @@ public abstract class JdbcValueHandler {
         }
         @Override
         protected JdbcValueHandler newInstance(int sqlType) {
-            return new TimestampJdbcValueHandler(sqlType);
+            if (sqlType == Types.CHAR) {
+                return new TimestampJdbcValueHandler(sqlType) {
+                    protected void castAndSetValue(PreparedStatement ps, int parameterIndex, Object obj) throws SQLException {
+                        ps.setString(parameterIndex, ((java.sql.Timestamp) obj).toString());
+                    }
+                    public Object getValue(ResultSet rs, int columnIndex) throws SQLException {
+                        String str = rs.getString(columnIndex);
+                        if (str == null) {
+                            return null;
+                        }
+                        return Timestamp.valueOf(str);
+                    }
+                };
+            } else {
+                return new TimestampJdbcValueHandler(sqlType);
+            }
         }
     }
 }