View Javadoc
1   /**
2    *
3    * The DbUnit Database Testing Framework
4    * Copyright (C)2002-2004, DbUnit.org
5    *
6    * This library is free software; you can redistribute it and/or
7    * modify it under the terms of the GNU Lesser General Public
8    * License as published by the Free Software Foundation; either
9    * version 2.1 of the License, or (at your option) any later version.
10   *
11   * This library is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   * Lesser General Public License for more details.
15   *
16   * You should have received a copy of the GNU Lesser General Public
17   * License along with this library; if not, write to the Free Software
18   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19   *
20   */
21  package org.dbunit.ext.postgresql;
22  
23  import java.lang.reflect.Constructor;
24  import java.lang.reflect.InvocationTargetException;
25  import java.sql.Connection;
26  import java.sql.PreparedStatement;
27  import java.sql.ResultSet;
28  import java.sql.SQLException;
29  import java.sql.Types;
30  
31  import org.dbunit.dataset.datatype.AbstractDataType;
32  import org.dbunit.dataset.datatype.TypeCastException;
33  
34  import org.slf4j.Logger;
35  import org.slf4j.LoggerFactory;
36  
37  /**
38   * Adapter to handle conversion between Postgresql
39   * native Interval type and Strings.
40   *
41   * @author James A. Russo (jr@halo3.net)
42   * @author Last changed by: $Author$
43   * @version $Revision$ $Date$
44   * @since 2.4.6
45   */
46  public class IntervalType extends AbstractDataType {
47  
48      /**
49       * Logger for this class
50       */
51      private static final Logger logger = LoggerFactory.getLogger(IntervalType.class);
52  
53  
54      public IntervalType() {
55          super("interval", Types.OTHER, String.class, false);
56      }
57  
58      public Object getSqlValue(int column, ResultSet resultSet) throws SQLException, TypeCastException {
59          return resultSet.getString(column);
60      }
61  
62      public void setSqlValue(Object interval, int column,
63                              PreparedStatement statement) throws SQLException, TypeCastException {
64          statement.setObject(column,  getInterval(interval, statement.getConnection()));
65      }
66  
67      public Object typeCast(Object arg0) throws TypeCastException {
68          return arg0.toString();
69      }
70  
71      private Object getInterval(Object value, Connection connection) throws TypeCastException { 
72          logger.debug("getInterval(value={}, connection={}) - start", value, connection);
73  
74          Object tempInterval = null;
75  
76          try {
77              Class aPGIntervalClass = super.loadClass("org.postgresql.util.PGInterval", connection);
78              Constructor ct = aPGIntervalClass.getConstructor(new Class[]{String.class});
79              tempInterval = ct.newInstance(new Object[]{value});
80          } catch (ClassNotFoundException e) {
81              throw new TypeCastException(value, this, e);
82          } catch (InvocationTargetException e) {
83              throw new TypeCastException(value, this, e);
84          } catch (NoSuchMethodException e) {
85              throw new TypeCastException(value, this, e);
86          } catch (IllegalAccessException e) {
87              throw new TypeCastException(value, this, e);
88          } catch (InstantiationException e) {
89              throw new TypeCastException(value, this, e);
90          }
91  
92          return tempInterval;
93      }
94  }