All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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