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.InputStream;
24 import java.io.Reader;
25 import java.sql.Date;
26 import java.sql.PreparedStatement;
27 import java.sql.ResultSet;
28 import java.sql.SQLException;
29 import java.sql.Timestamp;
30 import java.sql.Types;
31
32 import goldengate.common.database.DbPreparedStatement;
33 import goldengate.common.database.DbSession;
34 import goldengate.common.database.exception.GoldenGateDatabaseException;
35 import goldengate.common.database.exception.GoldenGateDatabaseNoConnectionException;
36 import goldengate.common.database.exception.GoldenGateDatabaseNoDataException;
37 import goldengate.common.database.exception.GoldenGateDatabaseSqlException;
38
39
40
41
42
43
44
45
46
47
48
49 public abstract class AbstractDbData {
50
51
52
53
54
55 public static enum UpdatedInfo {
56
57
58
59 UNKNOWN,
60
61
62
63 NOTUPDATED,
64
65
66
67 INTERRUPTED,
68
69
70
71 TOSUBMIT,
72
73
74
75 INERROR,
76
77
78
79 RUNNING,
80
81
82
83 DONE;
84 }
85
86
87
88
89
90
91
92
93 protected DbValue[] primaryKey;
94 protected DbValue[] otherFields;
95 protected DbValue[] allFields;
96
97 protected boolean isSaved = false;
98
99
100
101 protected final DbSession dbSession;
102
103
104
105
106 public AbstractDbData(DbSession dbSession) {
107 this.dbSession = dbSession;
108 initObject();
109 }
110
111
112
113
114
115 protected abstract void initObject();
116
117
118
119
120 protected abstract String getWherePrimaryKey();
121
122
123
124 protected abstract void setPrimaryKey();
125 protected abstract String getSelectAllFields();
126 protected abstract String getTable();
127 protected abstract String getInsertAllValues();
128 protected abstract String getUpdateAllFields();
129
130
131
132
133
134
135 public boolean exist() throws GoldenGateDatabaseException {
136 if (dbSession == null) {
137 return false;
138 }
139 DbPreparedStatement preparedStatement = new DbPreparedStatement(
140 dbSession);
141 try {
142 preparedStatement.createPrepareStatement("SELECT " +
143 primaryKey[0].column + " FROM " + getTable() + " WHERE " +
144 getWherePrimaryKey());
145 setPrimaryKey();
146 setValues(preparedStatement, primaryKey);
147 preparedStatement.executeQuery();
148 return preparedStatement.getNext();
149 } finally {
150 preparedStatement.realClose();
151 }
152 }
153
154
155
156
157 public void select() throws GoldenGateDatabaseException {
158 if (dbSession == null) {
159 throw new GoldenGateDatabaseNoDataException("No row found");
160 }
161 DbPreparedStatement preparedStatement = new DbPreparedStatement(
162 dbSession);
163 try {
164 preparedStatement.createPrepareStatement("SELECT " + getSelectAllFields() +
165 " FROM " + getTable() + " WHERE " +
166 getWherePrimaryKey());
167 setPrimaryKey();
168 setValues(preparedStatement, primaryKey);
169 preparedStatement.executeQuery();
170 if (preparedStatement.getNext()) {
171 getValues(preparedStatement, allFields);
172 setFromArray();
173 isSaved = true;
174 } else {
175 throw new GoldenGateDatabaseNoDataException("No row found");
176 }
177 } finally {
178 preparedStatement.realClose();
179 }
180 }
181
182
183
184
185 public void insert() throws GoldenGateDatabaseException {
186 if (isSaved) {
187 return;
188 }
189 if (dbSession == null) {
190 isSaved = true;
191 return;
192 }
193 setToArray();
194 DbPreparedStatement preparedStatement = new DbPreparedStatement(
195 dbSession);
196 try {
197 preparedStatement.createPrepareStatement("INSERT INTO " + getTable() +
198 " (" + getSelectAllFields() + ") VALUES " + getInsertAllValues());
199 setValues(preparedStatement, allFields);
200 int count = preparedStatement.executeUpdate();
201 if (count <= 0) {
202 throw new GoldenGateDatabaseNoDataException("No row found");
203 }
204 isSaved = true;
205 } finally {
206 preparedStatement.realClose();
207 }
208 }
209
210
211
212
213 public void update() throws GoldenGateDatabaseException {
214 if (isSaved) {
215 return;
216 }
217 if (dbSession == null) {
218 isSaved = true;
219 return;
220 }
221 setToArray();
222 DbPreparedStatement preparedStatement = new DbPreparedStatement(
223 dbSession);
224 try {
225 preparedStatement.createPrepareStatement("UPDATE " + getTable() +
226 " SET " + getUpdateAllFields() + " WHERE " +
227 getWherePrimaryKey());
228 setValues(preparedStatement, allFields);
229 int count = preparedStatement.executeUpdate();
230 if (count <= 0) {
231 throw new GoldenGateDatabaseNoDataException("No row found");
232 }
233 isSaved = true;
234 } finally {
235 preparedStatement.realClose();
236 }
237 }
238
239
240
241
242 public void delete() throws GoldenGateDatabaseException {
243 if (dbSession == null) {
244 return;
245 }
246 DbPreparedStatement preparedStatement = new DbPreparedStatement(
247 dbSession);
248 try {
249 preparedStatement.createPrepareStatement("DELETE FROM " + getTable() +
250 " WHERE " + getWherePrimaryKey());
251 setPrimaryKey();
252 setValues(preparedStatement, primaryKey);
253 int count = preparedStatement.executeUpdate();
254 if (count <= 0) {
255 throw new GoldenGateDatabaseNoDataException("No row found");
256 }
257 isSaved = false;
258 } finally {
259 preparedStatement.realClose();
260 }
261 }
262
263
264
265
266 public abstract void changeUpdatedInfo(UpdatedInfo info);
267
268
269
270 protected abstract void setToArray();
271
272
273
274
275 protected abstract void setFromArray() throws GoldenGateDatabaseSqlException;
276
277
278
279
280
281
282
283 static public void setTrueValue(PreparedStatement ps, DbValue value, int rank)
284 throws GoldenGateDatabaseSqlException {
285 try {
286 switch (value.type) {
287 case Types.VARCHAR:
288 if (value.value == null) {
289 ps.setNull(rank, Types.VARCHAR);
290 break;
291 }
292 ps.setString(rank, (String) value.value);
293 break;
294 case Types.LONGVARCHAR:
295 if (value.value == null) {
296 ps.setNull(rank, Types.LONGVARCHAR);
297 break;
298 }
299 ps.setString(rank, (String) value.value);
300 break;
301 case Types.BIT:
302 if (value.value == null) {
303 ps.setNull(rank, Types.BIT);
304 break;
305 }
306 ps.setBoolean(rank, (Boolean) value.value);
307 break;
308 case Types.TINYINT:
309 if (value.value == null) {
310 ps.setNull(rank, Types.TINYINT);
311 break;
312 }
313 ps.setByte(rank, (Byte) value.value);
314 break;
315 case Types.SMALLINT:
316 if (value.value == null) {
317 ps.setNull(rank, Types.SMALLINT);
318 break;
319 }
320 ps.setShort(rank, (Short) value.value);
321 break;
322 case Types.INTEGER:
323 if (value.value == null) {
324 ps.setNull(rank, Types.INTEGER);
325 break;
326 }
327 ps.setInt(rank, (Integer) value.value);
328 break;
329 case Types.BIGINT:
330 if (value.value == null) {
331 ps.setNull(rank, Types.BIGINT);
332 break;
333 }
334 ps.setLong(rank, (Long) value.value);
335 break;
336 case Types.REAL:
337 if (value.value == null) {
338 ps.setNull(rank, Types.REAL);
339 break;
340 }
341 ps.setFloat(rank, (Float) value.value);
342 break;
343 case Types.DOUBLE:
344 if (value.value == null) {
345 ps.setNull(rank, Types.DOUBLE);
346 break;
347 }
348 ps.setDouble(rank, (Double) value.value);
349 break;
350 case Types.VARBINARY:
351 if (value.value == null) {
352 ps.setNull(rank, Types.VARBINARY);
353 break;
354 }
355 ps.setBytes(rank, (byte[]) value.value);
356 break;
357 case Types.DATE:
358 if (value.value == null) {
359 ps.setNull(rank, Types.DATE);
360 break;
361 }
362 ps.setDate(rank, (Date) value.value);
363 break;
364 case Types.TIMESTAMP:
365 if (value.value == null) {
366 ps.setNull(rank, Types.TIMESTAMP);
367 break;
368 }
369 ps.setTimestamp(rank, (Timestamp) value.value);
370 break;
371 case Types.CLOB:
372 if (value.value == null) {
373 ps.setNull(rank, Types.CLOB);
374 break;
375 }
376 ps.setClob(rank, (Reader) value.value);
377 break;
378 case Types.BLOB:
379 if (value.value == null) {
380 ps.setNull(rank, Types.BLOB);
381 break;
382 }
383 ps.setBlob(rank, (InputStream) value.value);
384 break;
385 default:
386 throw new GoldenGateDatabaseSqlException("Type not supported: " +
387 value.type + " at " + rank);
388 }
389 } catch (ClassCastException e) {
390 throw new GoldenGateDatabaseSqlException("Setting values casting error: " +
391 value.type + " at " + rank, e);
392 } catch (SQLException e) {
393 DbSession.error(e);
394 throw new GoldenGateDatabaseSqlException("Setting values in error: " +
395 value.type + " at " + rank, e);
396 }
397 }
398
399
400
401
402
403
404
405 protected void setValue(DbPreparedStatement preparedStatement, DbValue value)
406 throws GoldenGateDatabaseNoConnectionException, GoldenGateDatabaseSqlException {
407 PreparedStatement ps = preparedStatement.getPreparedStatement();
408 setTrueValue(ps, value, 1);
409 }
410
411
412
413
414
415
416
417 protected void setValues(DbPreparedStatement preparedStatement,
418 DbValue[] values) throws GoldenGateDatabaseNoConnectionException,
419 GoldenGateDatabaseSqlException {
420 PreparedStatement ps = preparedStatement.getPreparedStatement();
421 for (int i = 0; i < values.length; i ++) {
422 DbValue value = values[i];
423 setTrueValue(ps, value, i + 1);
424 }
425 }
426
427
428
429
430
431
432 static public void getTrueValue(ResultSet rs, DbValue value)
433 throws GoldenGateDatabaseSqlException {
434 try {
435 switch (value.type) {
436 case Types.VARCHAR:
437 value.value = rs.getString(value.column);
438 break;
439 case Types.LONGVARCHAR:
440 value.value = rs.getString(value.column);
441 break;
442 case Types.BIT:
443 value.value = rs.getBoolean(value.column);
444 break;
445 case Types.TINYINT:
446 value.value = rs.getByte(value.column);
447 break;
448 case Types.SMALLINT:
449 value.value = rs.getShort(value.column);
450 break;
451 case Types.INTEGER:
452 value.value = rs.getInt(value.column);
453 break;
454 case Types.BIGINT:
455 value.value = rs.getLong(value.column);
456 break;
457 case Types.REAL:
458 value.value = rs.getFloat(value.column);
459 break;
460 case Types.DOUBLE:
461 value.value = rs.getDouble(value.column);
462 break;
463 case Types.VARBINARY:
464 value.value = rs.getBytes(value.column);
465 break;
466 case Types.DATE:
467 value.value = rs.getDate(value.column);
468 break;
469 case Types.TIMESTAMP:
470 value.value = rs.getTimestamp(value.column);
471 break;
472 case Types.CLOB:
473 value.value = rs.getClob(value.column).getCharacterStream();
474 break;
475 case Types.BLOB:
476 value.value = rs.getBlob(value.column).getBinaryStream();
477 break;
478 default:
479 throw new GoldenGateDatabaseSqlException("Type not supported: " +
480 value.type + " for " + value.column);
481 }
482 } catch (SQLException e) {
483 DbSession.error(e);
484 throw new GoldenGateDatabaseSqlException("Getting values in error: " +
485 value.type + " for " + value.column, e);
486 }
487 }
488
489
490
491
492
493
494
495 protected void getValue(DbPreparedStatement preparedStatement, DbValue value)
496 throws GoldenGateDatabaseNoConnectionException, GoldenGateDatabaseSqlException {
497 ResultSet rs = preparedStatement.getResultSet();
498 getTrueValue(rs, value);
499 }
500
501
502
503
504
505
506
507 protected void getValues(DbPreparedStatement preparedStatement,
508 DbValue[] values) throws GoldenGateDatabaseNoConnectionException,
509 GoldenGateDatabaseSqlException {
510 ResultSet rs = preparedStatement.getResultSet();
511 for (DbValue value: values) {
512 getTrueValue(rs, value);
513 }
514 }
515
516
517
518
519
520
521 public boolean get(DbPreparedStatement preparedStatement) {
522 try {
523 getValues(preparedStatement, allFields);
524 setFromArray();
525 } catch (GoldenGateDatabaseNoConnectionException e1) {
526 return false;
527 } catch (GoldenGateDatabaseSqlException e1) {
528 return false;
529 }
530 isSaved = true;
531 return true;
532 }
533 }