Index: src/test/org/dbunit/dataset/datatype/TimestampDataTypeTest.java =================================================================== --- src/test/org/dbunit/dataset/datatype/TimestampDataTypeTest.java (revision 1020) +++ src/test/org/dbunit/dataset/datatype/TimestampDataTypeTest.java (working copy) @@ -79,6 +79,15 @@ new Timestamp(1234).toString(), new Date(1234).toString(), new java.util.Date(1234), + new String("addDays(1970-01-01 00:00:00.0, 1)"), + new String("addHours(1970-01-01 00:00:00.0, 1)"), + new String("addMinutes(1970-01-01 00:00:00.0, 1)"), + new String("addSeconds(1970-01-01 00:00:00.0, 1)"), + new String("addSeconds(1980-01-01 00:00:00.0, -1)"), + new String("addMinutes(1980-01-01 00:00:00.0, -1)"), + new String("addHours(1980-01-01 00:00:00.0, -1)"), + new String("addDays(1980-01-01 00:00:00.0, -1)") + }; Timestamp[] expected = { @@ -89,6 +98,14 @@ new Timestamp(1234), new Timestamp(Date.valueOf((new Date(1234).toString())).getTime()), new Timestamp(1234), + Timestamp.valueOf("1970-01-02 00:00:00.0"), + Timestamp.valueOf("1970-01-01 01:00:00.0"), + Timestamp.valueOf("1970-01-01 00:01:00.0"), + Timestamp.valueOf("1970-01-01 00:00:01.0"), + Timestamp.valueOf("1979-12-31 23:59:59.0"), + Timestamp.valueOf("1979-12-31 23:59:00.0"), + Timestamp.valueOf("1979-12-31 23:00:00.0"), + Timestamp.valueOf("1979-12-31 00:00:00.0") }; assertEquals("actual vs expected count", values.length, expected.length); Index: src/java/org/dbunit/dataset/datatype/TimestampDataType.java =================================================================== --- src/java/org/dbunit/dataset/datatype/TimestampDataType.java (revision 1020) +++ src/java/org/dbunit/dataset/datatype/TimestampDataType.java (working copy) @@ -21,11 +21,13 @@ package org.dbunit.dataset.datatype; +import java.lang.reflect.Method; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.sql.Types; +import java.util.Date; import org.dbunit.dataset.ITable; import org.slf4j.Logger; @@ -40,6 +42,8 @@ public class TimestampDataType extends AbstractDataType { + private static final String[] methods = new String[] {"addDays", "addHours", "addMinutes", "addSeconds"}; + /** * Logger for this class */ @@ -96,7 +100,9 @@ // Was not a java.sql.Date, let Timestamp handle this value } } - + if (isDynamic(stringValue)) { + return evalDynamicValue(stringValue); + } try { return java.sql.Timestamp.valueOf(stringValue); @@ -110,6 +116,36 @@ throw new TypeCastException(value, this); } + private Object evalDynamicValue(String stringValue) throws TypeCastException { + for (int i = 0; i < methods.length; i++) { + if (stringValue.startsWith(methods[i])) { + String method = methods[i]; + Class [] parameterClasses = { String.class, String.class }; + String param1 = stringValue.substring(stringValue.indexOf("(") + 1, stringValue.indexOf(",")).trim(); + String param2 = stringValue.substring(stringValue.indexOf(",") + 1, stringValue.lastIndexOf(")")).trim(); + Method execMethod = null; + try { + execMethod = this.getClass().getMethod(method, parameterClasses); + return execMethod.invoke(this, new Object[]{param1, param2}); + } catch (Exception e) { + throw new TypeCastException(stringValue, this, e); + } + } + } + return null; + } + + private boolean isDynamic(String stringValue) { + for (int i = 0; i < methods.length; i++) { + if (stringValue.startsWith(methods[i])) { + return true; + } + } + return false; + } + + + public boolean isDateTime() { logger.debug("isDateTime() - start"); @@ -140,6 +176,54 @@ statement.setTimestamp(column, (java.sql.Timestamp)typeCast(value)); } + + public java.sql.Timestamp addDays(String param1, String days) throws TypeCastException { + long number = extractNumber(days);; + number = number * 24 * 60 * 60 * 1000; + return addTime(param1, number); + } + + public java.sql.Timestamp addHours(String param1, String hours) throws TypeCastException { + long number = extractNumber(hours);; + number = number * 60 * 60 * 1000; + return addTime(param1, number); + } + + public java.sql.Timestamp addMinutes(String param1, String hours) throws TypeCastException { + long number = extractNumber(hours);; + number = number * 60 * 1000; + return addTime(param1, number); + } + + public java.sql.Timestamp addSeconds(String param1, String hours) throws TypeCastException { + long number = extractNumber(hours);; + number = number * 1000; + return addTime(param1, number); + } + + + private long extractNumber(String number) throws TypeCastException { + try { + return Integer.valueOf(number).longValue(); + } catch (NumberFormatException e) { + throw new TypeCastException(number, this, e); + } + } + + private java.sql.Timestamp addTime(String param1, long time) throws TypeCastException { + long date1 = 0; + if (param1.toUpperCase().equals("NOW()")) { + date1 = new Date().getTime(); + } else { + try { + date1 = java.sql.Timestamp.valueOf(param1).getTime();; + } + catch (IllegalArgumentException e) { + throw new TypeCastException(param1, this, e); + } + } + return new java.sql.Timestamp(date1 + time); + } }