01: package net.xoetrope.optional.data.sql;
02:
03: import java.sql.SQLException;
04: import java.sql.ResultSetMetaData;
05:
06: /**
07: * A class that extends the DatabaseTable class by caching the data from the
08: * query result set.
09: * <p>Copyright (c) Xoetrope Ltd. 2001-2003</p>
10: * $Revision: 1.2 $
11: */
12: public class CachedDatabaseTable extends DatabaseTable {
13: protected Object[] rowData;
14:
15: /**
16: * Setup a table with the full sql statement
17: * @param sqlStr the full SQL statement
18: * @param connName the connection name
19: * @param writable
20: */
21: public CachedDatabaseTable(String sqlStr, String connName,
22: boolean writable) {
23: super (sqlStr, connName, writable);
24: }
25:
26: /**
27: * Create a new database table wrapper
28: * @param tableName the table name
29: * @param fields the fields to retrieve
30: * @param where the where clause to use in the query
31: * @param conn the connection name
32: * @param allowWrites true if the result set is to be updatable
33: */
34: public CachedDatabaseTable(String tableName, String fields,
35: String where, String connName, boolean writable) {
36: super (tableName, fields, where, connName, writable);
37: }
38:
39: /**
40: * Internally store the latest result set data
41: */
42: protected void cacheData() {
43: try {
44: rowData = new Object[numRows];
45:
46: ResultSetMetaData rsmd = RS.getMetaData();
47: int columnType[] = new int[numFields];
48: for (int k = 0; k < numFields; k++)
49: columnType[k] = rsmd.getColumnType(k + 1);
50: for (int j = 0; j < numRows; j++) {
51: String temp[] = new String[numFields];
52: rowData[j] = temp;
53: for (int k = 0; k < numFields; k++) {
54: if (columnType[k] == java.sql.Types.FLOAT)
55: temp[k] = new String(Float.toString(RS
56: .getFloat(k + 1)));
57: else
58: temp[k] = RS.getString(k + 1);
59: }
60: RS.next();
61: }
62: } catch (SQLException ex) {
63: ex.printStackTrace();
64: }
65: }
66:
67: /**
68: * Get a field value from the current row
69: * @param fieldIdx the field (zero based) to retrieve
70: * @return
71: */
72: public String getValue(int fieldIdx) {
73: return ((String[]) rowData[currentRow])[fieldIdx];
74: }
75:
76: /**
77: * Get a field value
78: * @param rowIdx the row (zero based) to retrieve
79: * @param fieldIdx the field (zero based) to retrieve
80: * @return
81: */
82: public String getValue(int rowIdx, int fieldIdx) {
83: return ((String[]) rowData[rowIdx])[fieldIdx];
84: }
85:
86: /**
87: * Set the cache value for a field. This method does not write the data back
88: * to the database.
89: * @param rowIdx the row (zero based) to retrieve
90: * @param fieldIdx the field (zero based) to retrieve
91: * @return
92: */
93: public void setValue(int fieldIdx, String value) {
94: ((String[]) rowData[currentRow])[fieldIdx] = value;
95: dirty = true;
96: super.setValue(currentRow, fieldIdx, value);
97: }
98: }
|