/* * JEF - Copyright 2009-2010 Jiyi (mr.jiyi@gmail.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jef.database.jdbc.result; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import java.util.Map; import javax.persistence.PersistenceException; import jef.database.Condition; import jef.database.DbUtils; import jef.database.dialect.DatabaseDialect; import jef.database.jdbc.JDBCTarget; import jef.database.meta.Reference; import jef.database.wrapper.populator.ColumnMeta; public final class ResultSetHolder extends AbstractResultSet implements IResultSet { private Statement st; ResultSet rs; private JDBCTarget db; public JDBCTarget getDb() { return db; } /** * 构造 * * @param tx * @param st * @param rs */ public ResultSetHolder(JDBCTarget tx, Statement st, ResultSet rs) { this.db = tx; this.st = st; this.rs = rs; } /** * * @param closeResultSet * 是否关闭ResultSet */ public void close(boolean closeResultSet) { if (closeResultSet && rs != null) { DbUtils.close(rs); rs = null; } if (st != null) { DbUtils.close(st); st = null; } if (db != null) { db.releaseConnection(); // 而目前设计约束凡是用户持有游标的场景,必须嵌套到一个内部的事务中去。因此实际上不会出现非当前线程的方法来释放连接的可能。 // 如果是为了持有结果集专门设计的连接,那么直接就关闭掉 if (db.isResultSetHolderTransaction()) { db.closeTx(); } db = null; } } @Override public DatabaseDialect getProfile() { return db.getProfile(); } @Override public ColumnMeta getColumns() { throw new UnsupportedOperationException(); } @Override public boolean next() { try { ensureOpen(); return rs.next(); } catch (SQLException e) { throw new PersistenceException(e); } } private void ensureOpen() throws SQLException { if (rs == null) { throw new SQLException("The resultset was closed!"); } } @Override public void afterLast() throws SQLException { ensureOpen(); rs.afterLast(); } @Override public void beforeFirst() throws SQLException { ensureOpen(); rs.beforeFirst(); } @Override public void close() throws SQLException { close(true); } @Override public boolean first() throws SQLException { ensureOpen(); return rs.first(); } @Override public ResultSetMetaData getMetaData() throws SQLException { ensureOpen(); return rs.getMetaData(); } @Override public boolean isClosed() throws SQLException { return rs.isClosed(); } @Override public boolean previous() throws SQLException { ensureOpen(); return rs.previous(); } @Override protected ResultSet get() throws SQLException { // ensureOpen(); return rs; } @Override public Map<Reference, List<Condition>> getFilters() { throw new UnsupportedOperationException(); } @Override public boolean isBeforeFirst() throws SQLException { ensureOpen(); return rs.isBeforeFirst(); } @Override public boolean isAfterLast() throws SQLException { ensureOpen(); return rs.isAfterLast(); } @Override public boolean isFirst() throws SQLException { ensureOpen(); return rs.isFirst(); } @Override public boolean isLast() throws SQLException { ensureOpen(); return rs.isLast(); } @Override public boolean last() throws SQLException { ensureOpen(); return rs.last(); } }