
org.eobjects.metamodel.jdbc.JdbcDataSet Maven / Gradle / Ivy
/**
* eobjects.org MetaModel
* Copyright (C) 2010 eobjects.org
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.eobjects.metamodel.jdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.eobjects.metamodel.MetaModelException;
import org.eobjects.metamodel.data.AbstractDataSet;
import org.eobjects.metamodel.data.DefaultRow;
import org.eobjects.metamodel.data.Row;
import org.eobjects.metamodel.query.Query;
import org.eobjects.metamodel.query.SelectItem;
import org.eobjects.metamodel.schema.Column;
import org.eobjects.metamodel.schema.ColumnType;
/**
* DataSet implementation that wraps a JDBC resultset.
*
* @author Kasper Sørensen
*/
final class JdbcDataSet extends AbstractDataSet {
private static final Logger logger = LoggerFactory
.getLogger(JdbcDataSet.class);
private final Statement _statement;
private final ResultSet _resultSet;
private final SelectItem[] _selectItems;
private final JdbcDataContext _jdbcDataContext;
private final Connection _connection;
private Row _row;
public JdbcDataSet(Query query, JdbcDataContext jdbcDataContext,
Connection connection, Statement statement, ResultSet resultSet) {
if (query == null || statement == null || resultSet == null) {
throw new IllegalArgumentException("Arguments cannot be null");
}
List items = query.getSelectClause().getItems();
_selectItems = items.toArray(new SelectItem[items.size()]);
_jdbcDataContext = jdbcDataContext;
_connection = connection;
_statement = statement;
_resultSet = resultSet;
}
public JdbcDataSet(SelectItem[] selectItems,
JdbcDataContext jdbcDataContext, Connection connection,
Statement statement, ResultSet resultSet) {
if (selectItems == null || statement == null || resultSet == null) {
throw new IllegalArgumentException("Arguments cannot be null");
}
_selectItems = selectItems;
_jdbcDataContext = jdbcDataContext;
_connection = connection;
_statement = statement;
_resultSet = resultSet;
}
/**
* {@inheritDoc}
*/
@Override
public Row getRow() {
return _row;
}
/**
* {@inheritDoc}
*/
@Override
public boolean next() throws MetaModelException {
try {
boolean result = _resultSet.next();
if (result) {
Object[] values = new Object[_selectItems.length];
for (int i = 0; i < values.length; i++) {
values[i] = getValue(_resultSet, i);
try {
// some drivers return boxed primitive types in stead of
// nulls (such as false in stead of null for a Boolean
// column)
if (_resultSet.wasNull()) {
values[i] = null;
}
} catch (Exception e) {
logger.debug(
"Could not invoke wasNull() method on resultset, error message: {}",
e.getMessage());
}
}
_row = new DefaultRow(_selectItems, values);
} else {
_row = null;
}
return result;
} catch (SQLException e) {
throw JdbcUtils.wrapException(e, "get next record in resultset");
}
}
private Object getValue(ResultSet resultSet, int i) throws SQLException {
final SelectItem selectItem = _selectItems[i];
final int columnIndex = i + 1;
if (selectItem.getFunction() == null) {
Column column = selectItem.getColumn();
if (column != null) {
ColumnType type = column.getType();
switch (type) {
case TIME:
return _resultSet.getTime(columnIndex);
case DATE:
return _resultSet.getDate(columnIndex);
case TIMESTAMP:
return _resultSet.getTimestamp(columnIndex);
case BLOB:
return _resultSet.getBlob(columnIndex);
case BINARY:
case VARBINARY:
case LONGVARBINARY:
return _resultSet.getBytes(columnIndex);
case CLOB:
case NCLOB:
return _resultSet.getClob(i);
case BIT:
case BOOLEAN:
return _resultSet.getBoolean(i);
}
}
}
return _resultSet.getObject(columnIndex);
}
/**
* {@inheritDoc}
*/
@Override
public void close() {
_jdbcDataContext.close(_connection, _resultSet, _statement);
}
/**
* {@inheritDoc}
*/
@Override
public SelectItem[] getSelectItems() {
return _selectItems;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy