001: package prefuse.data.io.sql;
002:
003: import java.math.BigDecimal;
004: import java.sql.Array;
005: import java.sql.Blob;
006: import java.sql.Clob;
007: import java.sql.Date;
008: import java.sql.Ref;
009: import java.sql.ResultSet;
010: import java.sql.ResultSetMetaData;
011: import java.sql.SQLException;
012: import java.sql.Time;
013: import java.sql.Timestamp;
014: import java.sql.Types;
015:
016: import prefuse.data.Table;
017:
018: /**
019: * Default data value handler for mapping SQL data types to Java objects.
020: * Performs a straightforward mapping of common SQL data types to Java
021: * primitives or objects.
022: *
023: * @author <a href="http://jheer.org">jeffrey heer</a>
024: */
025: public class DefaultSQLDataHandler implements SQLDataHandler {
026:
027: private boolean m_ignoreUnknownTypes;
028:
029: // ------------------------------------------------------------------------
030:
031: /**
032: * Create a new DefaultSQLDataHandler.
033: */
034: public DefaultSQLDataHandler() {
035: this (true);
036: }
037:
038: /**
039: * Create a new DefaultSQLDataHandler.
040: * @param ignoreUnknownTypes instructs the data handler whether or not
041: * unknown or unrecognized SQL data types should simply be ignored
042: */
043: public DefaultSQLDataHandler(boolean ignoreUnknownTypes) {
044: m_ignoreUnknownTypes = ignoreUnknownTypes;
045: }
046:
047: // ------------------------------------------------------------------------
048:
049: /**
050: * Set if unknown or unrecognized SQL data types should simply be ignored.
051: * @param ignore the ignore unknown types setting to use
052: */
053: public void setIgnoreUnknownTypes(boolean ignore) {
054: m_ignoreUnknownTypes = ignore;
055: }
056:
057: /**
058: * Indicates if unknown or unrecognized SQL data types should simply be
059: * ignored.
060: * @return the ignore unknown types setting
061: */
062: public boolean isIgnoreUnknownTypes() {
063: return m_ignoreUnknownTypes;
064: }
065:
066: // ------------------------------------------------------------------------
067:
068: /**
069: * @see prefuse.data.io.sql.SQLDataHandler#process(prefuse.data.Table, int, java.sql.ResultSet, int)
070: */
071: public void process(Table t, int trow, ResultSet rset, int rcol)
072: throws SQLException {
073: ResultSetMetaData metadata = rset.getMetaData();
074: String field = metadata.getColumnName(rcol);
075: int type = metadata.getColumnType(rcol);
076:
077: switch (type) {
078: case Types.ARRAY:
079: t.set(trow, field, rset.getArray(rcol));
080: break;
081:
082: case Types.BIGINT:
083: t.setLong(trow, field, rset.getLong(rcol));
084: break;
085:
086: case Types.BINARY:
087: case Types.LONGVARBINARY:
088: case Types.VARBINARY:
089: t.set(trow, field, rset.getBytes(rcol));
090: break;
091:
092: case Types.BIT:
093: case Types.BOOLEAN:
094: t.setBoolean(trow, field, rset.getBoolean(rcol));
095: break;
096:
097: case Types.BLOB:
098: t.set(trow, field, rset.getBlob(rcol));
099: break;
100:
101: case Types.CHAR:
102: case Types.LONGVARCHAR:
103: case Types.VARCHAR:
104: t.setString(trow, field, rset.getString(rcol));
105: break;
106:
107: case Types.CLOB:
108: t.set(trow, field, rset.getClob(rcol));
109: break;
110:
111: case Types.DATE:
112: t.setDate(trow, field, rset.getDate(rcol));
113: break;
114:
115: case Types.DECIMAL:
116: case Types.DOUBLE:
117: case Types.FLOAT:
118: case Types.NUMERIC:
119: t.setDouble(trow, field, rset.getDouble(rcol));
120: break;
121:
122: case Types.INTEGER:
123: case Types.SMALLINT:
124: case Types.TINYINT:
125: t.setInt(trow, field, rset.getInt(rcol));
126: break;
127:
128: case Types.JAVA_OBJECT:
129: t.set(trow, field, rset.getObject(rcol));
130: break;
131:
132: case Types.REAL:
133: t.setFloat(trow, field, rset.getFloat(rcol));
134: break;
135:
136: case Types.REF:
137: t.set(trow, field, rset.getRef(rcol));
138: break;
139:
140: case Types.TIME:
141: t.setDate(trow, field, rset.getTime(rcol));
142: break;
143:
144: case Types.TIMESTAMP:
145: t.setDate(trow, field, rset.getTimestamp(rcol));
146: break;
147:
148: case Types.DATALINK:
149: case Types.DISTINCT:
150: case Types.NULL:
151: case Types.OTHER:
152: case Types.STRUCT:
153: default:
154: if (!m_ignoreUnknownTypes) {
155: t.set(trow, field, rset.getObject(rcol));
156: }
157: break;
158: }
159: }
160:
161: /**
162: * @see prefuse.data.io.sql.SQLDataHandler#getDataType(java.lang.String, int)
163: */
164: public Class getDataType(String columnName, int sqlType) {
165: switch (sqlType) {
166: case Types.ARRAY:
167: return Array.class;
168:
169: case Types.BIGINT:
170: return long.class;
171:
172: case Types.BINARY:
173: case Types.LONGVARBINARY:
174: case Types.VARBINARY:
175: return byte[].class;
176:
177: case Types.BIT:
178: case Types.BOOLEAN:
179: return boolean.class;
180:
181: case Types.BLOB:
182: return Blob.class;
183:
184: case Types.CHAR:
185: case Types.LONGVARCHAR:
186: case Types.VARCHAR:
187: return String.class;
188:
189: case Types.CLOB:
190: return Clob.class;
191:
192: case Types.DATE:
193: return Date.class;
194:
195: case Types.DECIMAL:
196: case Types.NUMERIC:
197: return BigDecimal.class;
198:
199: case Types.DOUBLE:
200: case Types.FLOAT:
201: return double.class;
202:
203: case Types.INTEGER:
204: case Types.SMALLINT:
205: case Types.TINYINT:
206: return int.class;
207:
208: case Types.JAVA_OBJECT:
209: return Object.class;
210:
211: case Types.REAL:
212: return float.class;
213:
214: case Types.REF:
215: return Ref.class;
216:
217: case Types.TIME:
218: return Time.class;
219:
220: case Types.TIMESTAMP:
221: return Timestamp.class;
222:
223: case Types.DATALINK:
224: case Types.DISTINCT:
225: case Types.NULL:
226: case Types.OTHER:
227: case Types.STRUCT:
228: default:
229: if (!m_ignoreUnknownTypes) {
230: return Object.class;
231: } else {
232: return null;
233: }
234: }
235: }
236:
237: } // end of class DefaultSQLDataValueHandler
|