1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.dbunit.dataset.datatype;
23
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26
27 import java.sql.PreparedStatement;
28 import java.sql.ResultSet;
29 import java.sql.SQLException;
30 import java.sql.Types;
31
32
33
34
35
36
37
38
39
40
41
42 public abstract class DataType
43 {
44
45
46
47
48 private static final Logger logger = LoggerFactory.getLogger(DataType.class);
49
50 public static final DataType UNKNOWN = new UnknownDataType();
51
52 public static final DataType CHAR = new StringDataType(
53 "CHAR", Types.CHAR);
54 public static final DataType VARCHAR = new StringDataType(
55 "VARCHAR", Types.VARCHAR);
56 public static final DataType LONGVARCHAR = new StringDataType(
57 "LONGVARCHAR", Types.LONGVARCHAR);
58 public static final DataType CLOB = new ClobDataType();
59
60 public static final DataType NUMERIC = new NumberDataType(
61 "NUMERIC", Types.NUMERIC);
62 public static final DataType DECIMAL = new NumberDataType(
63 "DECIMAL", Types.DECIMAL);
64
65 public static final DataType BOOLEAN = new BooleanDataType();
66 public static final DataType BIT = new BitDataType();
67
68 public static final DataType TINYINT = new IntegerDataType(
69 "TINYINT", Types.TINYINT);
70 public static final DataType SMALLINT = new IntegerDataType(
71 "SMALLINT", Types.SMALLINT);
72 public static final DataType INTEGER = new IntegerDataType(
73 "INTEGER", Types.INTEGER);
74
75
76 public static final DataType BIGINT = new BigIntegerDataType();
77
78
79
80
81 public static final DataType BIGINT_AUX_LONG = new LongDataType();
82
83 public static final DataType REAL = new FloatDataType();
84
85 public static final DataType FLOAT = new DoubleDataType(
86 "FLOAT", Types.FLOAT);
87 public static final DataType DOUBLE = new DoubleDataType(
88 "DOUBLE", Types.DOUBLE);
89
90 public static final DataType DATE = new DateDataType();
91 public static final DataType TIME = new TimeDataType();
92 public static final DataType TIMESTAMP = new TimestampDataType();
93
94 public static final DataType BINARY = new BytesDataType(
95 "BINARY", Types.BINARY);
96 public static final DataType VARBINARY = new BytesDataType(
97 "VARBINARY", Types.VARBINARY);
98 public static final DataType LONGVARBINARY = new BytesDataType(
99 "LONGVARBINARY", Types.LONGVARBINARY);
100 public static final DataType BLOB = new BlobDataType();
101
102
103
104
105 public static final DataType NCHAR = new StringDataType(
106 "NCHAR", -15);
107
108 public static final DataType NVARCHAR = new StringDataType(
109 "NVARCHAR", -9);
110
111 public static final DataType LONGNVARCHAR = new StringDataType(
112 "LONGNVARCHAR", -16);
113
114 private static final DataType[] TYPES = {
115 VARCHAR, CHAR, LONGVARCHAR, NCHAR, NVARCHAR, LONGNVARCHAR, CLOB, NUMERIC, DECIMAL, BOOLEAN, BIT, INTEGER,
116 TINYINT, SMALLINT, BIGINT, REAL, DOUBLE, FLOAT, DATE, TIME, TIMESTAMP,
117 VARBINARY, BINARY, LONGVARBINARY, BLOB,
118
119 BIGINT_AUX_LONG
120 };
121
122
123
124
125 public abstract Object typeCast(Object value) throws TypeCastException;
126
127
128
129
130
131
132
133
134
135
136 public abstract int compare(Object o1, Object o2) throws TypeCastException;
137
138
139
140
141 public abstract int getSqlType();
142
143
144
145
146 public abstract Class getTypeClass();
147
148
149
150
151
152 public abstract boolean isNumber();
153
154
155
156
157
158 public abstract boolean isDateTime();
159
160
161
162
163 public abstract Object getSqlValue(int column, ResultSet resultSet)
164 throws SQLException, TypeCastException;
165
166
167
168
169 public abstract void setSqlValue(Object value, int column,
170 PreparedStatement statement) throws SQLException, TypeCastException;
171
172
173
174
175 public static String asString(Object value) throws TypeCastException
176 {
177 logger.debug("asString(value={}) - start", value);
178
179 return (String)DataType.VARCHAR.typeCast(value);
180 }
181
182
183
184
185
186
187 public static DataType forSqlType(int sqlType) throws DataTypeException
188 {
189 if(logger.isDebugEnabled())
190 logger.debug("forSqlType(sqlType={}) - start", new Integer(sqlType));
191
192 for (int i = 0; i < TYPES.length; i++)
193 {
194 if (sqlType == TYPES[i].getSqlType())
195 {
196 return TYPES[i];
197 }
198 }
199
200 return UNKNOWN;
201 }
202
203
204
205
206
207
208
209 public static DataType forSqlTypeName(String sqlTypeName) throws DataTypeException
210 {
211 if(logger.isDebugEnabled())
212 logger.debug("forSqlTypeName(sqlTypeName=" + sqlTypeName + ") - start");
213
214 for (int i = 0; i < TYPES.length; i++)
215 {
216 if (sqlTypeName.equals(TYPES[i].toString()))
217 {
218 return TYPES[i];
219 }
220 }
221
222 return UNKNOWN;
223 }
224
225
226
227
228
229
230 public static DataType forObject(Object value)
231 {
232 logger.debug("forObject(value={}) - start", value);
233
234 if (value == null)
235 {
236 return UNKNOWN;
237 }
238
239 for (int i = 0; i < TYPES.length; i++)
240 {
241 Class typeClass = TYPES[i].getTypeClass();
242 if (typeClass.isInstance(value))
243 {
244 return TYPES[i];
245 }
246 }
247
248 return UNKNOWN;
249 }
250 }
251
252
253
254
255
256
257
258
259
260