package proj.zoie.dataprovider.jdbc; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Comparator; import org.apache.log4j.Logger; import proj.zoie.api.DataConsumer; import proj.zoie.api.DataConsumer.DataEvent; import proj.zoie.impl.indexing.StreamDataProvider; public class JDBCStreamDataProvider<T> extends StreamDataProvider<T> { private static final Logger log = Logger.getLogger(JDBCStreamDataProvider.class); private static final long DEFAULT_PULL_TIME = 1000; private final JDBCConnectionFactory _connFactory; private final PreparedStatementBuilder<T> _stmtBuilder; private String _version; private Connection _conn; private PreparedStatement _stmt; private ResultSet _res; private long _pullTime; public JDBCStreamDataProvider(JDBCConnectionFactory connFactory, PreparedStatementBuilder<T> stmtBuilder, Comparator<String> versionComparator) { super(versionComparator); _connFactory = connFactory; _stmtBuilder = stmtBuilder; _version = null; _conn = null; _stmt = null; _res = null; _pullTime = DEFAULT_PULL_TIME; } public void setPullTime(long pullTime) { _pullTime = pullTime; } public long getPullTime() { return _pullTime; } @Override public DataEvent<T> next() { DataEvent<T> event = null; try { if (!_res.next()) { try { _res.close(); } finally { _stmt.close(); } try { Thread.sleep(_pullTime); } catch (InterruptedException e) { log.error(e.getMessage(), e); } _stmt = _stmtBuilder.buildStatment(_conn, _version); _res = _stmt.executeQuery(); } else { event = _stmtBuilder.buildDataEvent(_res); _version = event.getVersion(); } } catch (SQLException sqle) { log.error(sqle.getMessage(), sqle); } return event; } @Override public void setStartingOffset(String version) { _version = version; } @Override public void reset() { if (_res != null) { try { _res.close(); } catch (SQLException sqle) { log.error(sqle.getMessage(), sqle); _res = null; } finally { try { _stmt.close(); } catch (SQLException e) { log.error(e.getMessage(), e); } } } DataConsumer<T> dc = getDataConsumer(); if (dc == null) { // ? Hao: needs to fix later _version = null; log.warn("problem opening index, maynot exist, defaulting version to null"); // log.warn("problem opening index, maynot exist, defaulting version to 0"); } else { _version = dc.getVersion(); } if (_conn == null) { try { _conn = _connFactory.getConnection(); _stmt = _stmtBuilder.buildStatment(_conn, _version); _res = _stmt.executeQuery(); } catch (SQLException sqle) { log.fatal(sqle.getMessage(), sqle); _res = null; } } } @Override public void stop() { try { super.stop(); } finally { try { if (_res != null) { _res.close(); } } catch (SQLException sqle) { log.error(sqle.getMessage(), sqle); } finally { try { if (_stmt != null) { _stmt.close(); } } catch (SQLException sqle) { log.error(sqle.getMessage(), sqle); } } } } }