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;

/**
 * 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] = _resultSet.getObject(i + 1);

					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) {
			logger.error(e.getMessage(), e);
		}
		return false;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void close() {
		_jdbcDataContext.close(_connection, _resultSet, _statement);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public SelectItem[] getSelectItems() {
		return _selectItems;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy