1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package goldengate.common.database.data;
22
23 import java.io.FileInputStream;
24 import java.io.FileNotFoundException;
25 import java.io.IOException;
26 import java.io.InputStream;
27 import java.io.InputStreamReader;
28 import java.io.Reader;
29 import java.sql.Date;
30 import java.sql.Timestamp;
31 import java.sql.Types;
32 import java.text.DateFormat;
33 import java.text.ParseException;
34
35 import org.jboss.netty.buffer.ChannelBuffer;
36 import org.jboss.netty.buffer.ChannelBuffers;
37
38 import goldengate.common.database.exception.GoldenGateDatabaseSqlException;
39
40
41
42
43
44
45 public class DbValue {
46
47
48
49 public Object value;
50
51
52
53 public int type;
54
55
56
57 public String column;
58
59 public DbValue(String value) {
60 this.value = value;
61 type = Types.VARCHAR;
62 }
63
64 public DbValue(String value, boolean LONG) {
65 this.value = value;
66 type = Types.LONGVARCHAR;
67 }
68
69 public DbValue(boolean value) {
70 this.value = value;
71 type = Types.BIT;
72 }
73
74 public DbValue(byte value) {
75 this.value = value;
76 type = Types.TINYINT;
77 }
78
79 public DbValue(short value) {
80 this.value = value;
81 type = Types.SMALLINT;
82 }
83
84 public DbValue(int value) {
85 this.value = value;
86 type = Types.INTEGER;
87 }
88
89 public DbValue(long value) {
90 this.value = value;
91 type = Types.BIGINT;
92 }
93
94 public DbValue(float value) {
95 this.value = value;
96 type = Types.REAL;
97 }
98
99 public DbValue(double value) {
100 this.value = value;
101 type = Types.DOUBLE;
102 }
103
104 public DbValue(byte[] value) {
105 this.value = value;
106 type = Types.VARBINARY;
107 }
108
109 public DbValue(Date value) {
110 this.value = value;
111 type = Types.DATE;
112 }
113
114 public DbValue(Timestamp value) {
115 this.value = value;
116 type = Types.TIMESTAMP;
117 }
118
119 public DbValue(java.util.Date value) {
120 this.value = new Timestamp(value.getTime());
121 type = Types.TIMESTAMP;
122 }
123
124 public DbValue(String value, String name) {
125 this.value = value;
126 type = Types.VARCHAR;
127 column = name;
128 }
129
130 public DbValue(String value, String name, boolean LONG) {
131 this.value = value;
132 type = Types.LONGVARCHAR;
133 column = name;
134 }
135
136 public DbValue(boolean value, String name) {
137 this.value = value;
138 type = Types.BIT;
139 column = name;
140 }
141
142 public DbValue(byte value, String name) {
143 this.value = value;
144 type = Types.TINYINT;
145 column = name;
146 }
147
148 public DbValue(short value, String name) {
149 this.value = value;
150 type = Types.SMALLINT;
151 column = name;
152 }
153
154 public DbValue(int value, String name) {
155 this.value = value;
156 type = Types.INTEGER;
157 column = name;
158 }
159
160 public DbValue(long value, String name) {
161 this.value = value;
162 type = Types.BIGINT;
163 column = name;
164 }
165
166 public DbValue(float value, String name) {
167 this.value = value;
168 type = Types.REAL;
169 column = name;
170 }
171
172 public DbValue(double value, String name) {
173 this.value = value;
174 type = Types.DOUBLE;
175 column = name;
176 }
177
178 public DbValue(byte[] value, String name) {
179 this.value = value;
180 type = Types.VARBINARY;
181 column = name;
182 }
183
184 public DbValue(Date value, String name) {
185 this.value = value;
186 type = Types.DATE;
187 column = name;
188 }
189
190 public DbValue(Timestamp value, String name) {
191 this.value = value;
192 type = Types.TIMESTAMP;
193 column = name;
194 }
195
196 public DbValue(java.util.Date value, String name) {
197 this.value = new Timestamp(value.getTime());
198 type = Types.TIMESTAMP;
199 column = name;
200 }
201
202 public DbValue(Reader value, String name) {
203 this.value = value;
204 type = Types.CLOB;
205 column = name;
206 }
207
208 public DbValue(InputStream value, String name) {
209 this.value = value;
210 type = Types.BLOB;
211 column = name;
212 }
213
214 public void setValue(String value) {
215 this.value = value;
216 }
217
218 public void setValue(boolean value) {
219 this.value = value;
220 }
221
222 public void setValue(byte value) {
223 this.value = value;
224 }
225
226 public void setValue(short value) {
227 this.value = value;
228 }
229
230 public void setValue(int value) {
231 this.value = value;
232 }
233
234 public void setValue(long value) {
235 this.value = value;
236 }
237
238 public void setValue(float value) {
239 this.value = value;
240 }
241
242 public void setValue(double value) {
243 this.value = value;
244 }
245
246 public void setValue(byte[] value) {
247 this.value = value;
248 }
249
250 public void setValue(Date value) {
251 this.value = value;
252 }
253
254 public void setValue(Timestamp value) {
255 this.value = value;
256 }
257
258 public void setValue(java.util.Date value) {
259 this.value = new Timestamp(value.getTime());
260 }
261
262 public void setValue(Reader value) {
263 this.value = value;
264 }
265
266 public void setValue(InputStream value) {
267 this.value = value;
268 }
269
270 public Object getValue() throws GoldenGateDatabaseSqlException {
271 switch (type) {
272 case Types.VARCHAR:
273 case Types.LONGVARCHAR:
274 case Types.BIT:
275 case Types.TINYINT:
276 case Types.SMALLINT:
277 case Types.INTEGER:
278 case Types.BIGINT:
279 case Types.REAL:
280 case Types.DOUBLE:
281 case Types.VARBINARY:
282 case Types.DATE:
283 case Types.TIMESTAMP:
284 case Types.CLOB:
285 case Types.BLOB:
286 return value;
287 default:
288 throw new GoldenGateDatabaseSqlException("Type unknown: " + type);
289 }
290 }
291
292 public String getValueAsString() throws GoldenGateDatabaseSqlException {
293 switch (type) {
294 case Types.VARCHAR:
295 case Types.LONGVARCHAR:
296 return (String) value;
297 case Types.BIT:
298 return ((Boolean) value).toString();
299 case Types.TINYINT:
300 return ((Byte) value).toString();
301 case Types.SMALLINT:
302 return ((Short) value).toString();
303 case Types.INTEGER:
304 return ((Integer) value).toString();
305 case Types.BIGINT:
306 return ((Long) value).toString();
307 case Types.REAL:
308 return ((Float) value).toString();
309 case Types.DOUBLE:
310 return ((Double) value).toString();
311 case Types.VARBINARY:
312 return new String((byte[]) value);
313 case Types.DATE:
314 return ((Date) value).toString();
315 case Types.TIMESTAMP:
316 return ((Timestamp) value).toString();
317 case Types.CLOB:
318 {
319 StringBuilder sBuilder = new StringBuilder();
320 Reader reader = ((Reader) value);
321 char []cbuf = new char[4096];
322 int len;
323 try {
324 len = reader.read(cbuf);
325 while (len > 0) {
326 sBuilder.append(cbuf, 0, len);
327 len = reader.read(cbuf);
328 }
329 } catch (IOException e) {
330 throw new GoldenGateDatabaseSqlException("Error while reading Clob as String", e);
331 }
332 return sBuilder.toString();
333 }
334 case Types.BLOB:
335 {
336 InputStream reader = ((InputStream) value);
337 int len;
338 ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
339 try {
340 len = reader.available();
341 while (len > 0) {
342 buffer.writeBytes(reader, len);
343 }
344 } catch (IOException e) {
345 throw new GoldenGateDatabaseSqlException("Error while reading Clob as String", e);
346 }
347 len = buffer.readableBytes();
348 byte []dst = new byte[len];
349 buffer.readBytes(dst);
350 return new String(dst);
351 }
352 default:
353 throw new GoldenGateDatabaseSqlException("Type unknown: " + type);
354 }
355 }
356
357 public void setValueFromString(String svalue) throws GoldenGateDatabaseSqlException {
358 switch (type) {
359 case Types.VARCHAR:
360 case Types.LONGVARCHAR:
361 value = svalue;
362 break;
363 case Types.BIT:
364 value = Boolean.parseBoolean(svalue);
365 break;
366 case Types.TINYINT:
367 value = Byte.parseByte(svalue);
368 break;
369 case Types.SMALLINT:
370 value = Short.parseShort(svalue);
371 break;
372 case Types.INTEGER:
373 value = Integer.parseInt(svalue);
374 break;
375 case Types.BIGINT:
376 value = Long.parseLong(svalue);
377 break;
378 case Types.REAL:
379 value = Float.parseFloat(svalue);
380 break;
381 case Types.DOUBLE:
382 value = Double.parseDouble(svalue);
383 break;
384 case Types.VARBINARY:
385 value = svalue.getBytes();
386 break;
387 case Types.DATE:
388 try {
389 value = DateFormat.getDateTimeInstance().parse(svalue);
390 } catch (ParseException e) {
391 throw new GoldenGateDatabaseSqlException("Error in Date: " + svalue, e);
392 }
393 break;
394 case Types.TIMESTAMP:
395 try {
396 value = DateFormat.getDateTimeInstance().parse(svalue);
397 } catch (ParseException e) {
398 throw new GoldenGateDatabaseSqlException("Error in Timestamp: " + svalue, e);
399 }
400 break;
401 case Types.CLOB:
402 try {
403 value = new InputStreamReader(new FileInputStream(svalue));
404 } catch (FileNotFoundException e) {
405 throw new GoldenGateDatabaseSqlException("Error in CLOB: " + svalue, e);
406 }
407 break;
408 case Types.BLOB:
409 try {
410 value = new FileInputStream(svalue);
411 } catch (FileNotFoundException e) {
412 throw new GoldenGateDatabaseSqlException("Error in BLOB: " + svalue, e);
413 }
414 break;
415 default:
416 throw new GoldenGateDatabaseSqlException("Type unknown: " + type);
417 }
418 }
419 }