View Javadoc

1   /**
2      This file is part of GoldenGate Project (named also GoldenGate or GG).
3   
4      Copyright 2009, Frederic Bregier, and individual contributors by the @author
5      tags. See the COPYRIGHT.txt in the distribution for a full listing of
6      individual contributors.
7   
8      All GoldenGate Project is free software: you can redistribute it and/or 
9      modify it under the terms of the GNU General Public License as published 
10     by the Free Software Foundation, either version 3 of the License, or
11     (at your option) any later version.
12  
13     GoldenGate is distributed in the hope that it will be useful,
14     but WITHOUT ANY WARRANTY; without even the implied warranty of
15     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16     GNU General Public License for more details.
17  
18     You should have received a copy of the GNU General Public License
19     along with GoldenGate .  If not, see <http://www.gnu.org/licenses/>.
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   * Database Value to help getting and setting value from and to database
42   * @author Frederic Bregier
43   *
44   */
45  public class DbValue {
46      /**
47       * Real value
48       */
49      public Object value;
50      /**
51       * Data Type
52       */
53      public int type;
54      /**
55       * Column name
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 }