1 package prefuse.data.io.sql; 2 3 import java.sql.Connection ; 4 import java.sql.ResultSet ; 5 import java.sql.ResultSetMetaData ; 6 import java.sql.SQLException ; 7 import java.sql.Statement ; 8 import java.util.logging.Logger ; 9 10 import prefuse.data.Schema; 11 import prefuse.data.Table; 12 import prefuse.data.io.DataIOException; 13 import prefuse.data.util.Index; 14 15 23 public class DatabaseDataSource { 24 25 private static final Logger s_logger 27 = Logger.getLogger(DatabaseDataSource.class.getName()); 28 29 protected Connection m_conn; 30 protected Statement m_stmt; 31 protected SQLDataHandler m_handler; 32 33 35 42 DatabaseDataSource(Connection conn, SQLDataHandler handler) { 43 m_conn = conn; 44 m_handler = handler; 45 } 46 47 50 57 public synchronized Table getData(String query) throws DataIOException { 58 return getData(null, query, null); 59 } 60 61 70 public synchronized Table getData(String query, String keyField) 71 throws DataIOException 72 { 73 return getData(null, query, keyField); 74 } 75 76 85 public synchronized Table getData(Table t, String query) 86 throws DataIOException 87 { 88 return getData(t, query, null); 89 } 90 91 101 public synchronized Table getData(Table t, String query, String keyField) 102 throws DataIOException 103 { 104 return getData(t, query, keyField, null); 105 } 106 107 120 public synchronized Table getData(Table t, String query, 121 String keyField, Object lock) 122 throws DataIOException 123 { 124 ResultSet rs; 125 try { 126 rs = executeQuery(query); 127 } catch ( SQLException e ) { 128 throw new DataIOException(e); 129 } 130 return process(t, rs, keyField, lock); 131 } 132 133 136 143 public void loadData(Table t, String query) { 144 loadData(t, query, null, null, null); 145 } 146 147 156 public void loadData(Table t, String query, String keyField) { 157 loadData(t, query, keyField, null, null); 158 } 159 160 170 public void loadData(Table t, String query, Object lock) { 171 loadData(t, query, null, lock, null); 172 } 173 174 186 public void loadData(Table t, String query, String keyField, Object lock) { 187 loadData(t, query, keyField, lock, null); 188 } 189 190 206 public void loadData(Table t, String query, String keyField, 207 Object lock, DataSourceWorker.Listener listener) { 208 DataSourceWorker.Entry e = new DataSourceWorker.Entry( 209 this, t, query, keyField, lock, listener); 210 DataSourceWorker.submit(e); 211 } 212 213 215 221 private ResultSet executeQuery(String query) throws SQLException { 222 if ( m_stmt == null ) 223 m_stmt = m_conn.createStatement(); 224 225 long timein = System.currentTimeMillis(); 227 228 s_logger.info("Issuing query: "+query); 229 ResultSet rset = m_stmt.executeQuery(query); 230 231 long time = System.currentTimeMillis()-timein; 233 s_logger.info("External query processing completed: " 234 + (time/1000) + "." + (time%1000) + " seconds."); 235 236 return rset; 237 } 238 239 241 249 protected Table process(Table t, ResultSet rset, String key, Object lock) 250 throws DataIOException 251 { 252 int count = 0; 254 long timein = System.currentTimeMillis(); 255 256 try { 257 ResultSetMetaData metadata = rset.getMetaData(); 258 int ncols = metadata.getColumnCount(); 259 260 if ( t == null ) { 262 t = getSchema(metadata, m_handler).instantiate(); 263 if ( key != null ) { 264 try { 265 t.index(key); 266 s_logger.info("Indexed field: "+key); 267 } catch ( Exception e ) { 268 s_logger.warning("Error indexing field: "+key); 269 } 270 } 271 } 272 273 lock = (lock==null ? t : lock); 275 276 while ( rset.next() ) 278 { 279 synchronized ( lock ) { 280 int row = getExistingRow(t, rset, key); 282 if ( row < 0 ) { 283 row = t.addRow(); 284 } 285 286 for ( int i=1; i<=ncols; ++i ) { 288 m_handler.process(t, row, rset, i); 289 } 290 } 291 292 ++count; 294 } 295 } catch ( SQLException e ) { 296 throw new DataIOException(e); 297 } 298 299 long time = System.currentTimeMillis()-timein; 301 s_logger.info("Internal query processing completed: "+count+" rows, " 302 + (time/1000) + "." + (time%1000) + " seconds."); 303 304 return t; 305 } 306 307 317 protected int getExistingRow(Table t, ResultSet rset, String keyField) 318 throws SQLException 319 { 320 if ( keyField == null ) 322 return -1; 323 324 Class type = t.getColumnType(keyField); 326 if ( type == null ) 327 return -1; 328 329 Index index = t.index(keyField); 331 if ( type == int.class ) { 332 return index.get(rset.getInt(keyField)); 333 } else if ( type == long.class ) { 334 return index.get(rset.getLong(keyField)); 335 } else if ( type == float.class ) { 336 return index.get(rset.getFloat(keyField)); 337 } else if ( type == double.class ) { 338 return index.get(rset.getDouble(keyField)); 339 } else if ( !type.isPrimitive() ) { 340 return index.get(rset.getObject(keyField)); 341 } else { 342 return -1; 343 } 344 } 345 346 354 public Schema getSchema(ResultSetMetaData metadata, SQLDataHandler handler) 355 throws SQLException 356 { 357 int ncols = metadata.getColumnCount(); 358 Schema schema = new Schema(ncols); 359 360 for ( int i=1; i<=ncols; ++i ) { 362 String name = metadata.getColumnName(i); 363 int sqlType = metadata.getColumnType(i); 364 Class type = handler.getDataType(name, sqlType); 365 if ( type != null ) 366 schema.addColumn(name, type); 367 } 368 369 return schema; 370 } 371 372 } | Popular Tags |