/*
  Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.

  The MySQL Connector/J is licensed under the terms of the GPLv2
  <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>, like most MySQL Connectors.
  There are special exceptions to the terms and conditions of the GPLv2 as it is applied to
  this software, see the FLOSS License Exception
  <http://www.mysql.com/about/legal/licensing/foss-exception.html>.

  This program is free software; you can redistribute it and/or modify it under the terms
  of the GNU General Public License as published by the Free Software Foundation; version 2
  of the License.

  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 General Public License for more details.

  You should have received a copy of the GNU General Public License along with this
  program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth
  Floor, Boston, MA 02110-1301  USA

 */

package com.mysql.jdbc;

import java.io.InputStream;
import java.io.Reader;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.SQLException;
import java.sql.RowId;
import java.sql.SQLXML;
import java.sql.NClob;



public class JDBC4CallableStatement extends CallableStatement {

	public JDBC4CallableStatement(MySQLConnection conn,
			CallableStatementParamInfo paramInfo) throws SQLException {
		super(conn, paramInfo);
	}

	public JDBC4CallableStatement(MySQLConnection conn, String sql,
			String catalog, boolean isFunctionCall) throws SQLException {
		super(conn, sql, catalog, isFunctionCall);
	}

	
	public void setRowId(int parameterIndex, RowId x) throws SQLException {
		JDBC4PreparedStatementHelper.setRowId(this, parameterIndex, x);
	}

	public void setRowId(String parameterName, RowId x) throws SQLException {
		JDBC4PreparedStatementHelper.setRowId(this, getNamedParamIndex(
				parameterName, false), x);
	}

	public void setSQLXML(int parameterIndex, SQLXML xmlObject)
			throws SQLException {
		JDBC4PreparedStatementHelper.setSQLXML(this, parameterIndex, xmlObject);
	}

	public void setSQLXML(String parameterName, SQLXML xmlObject)
			throws SQLException {
		JDBC4PreparedStatementHelper.setSQLXML(this, getNamedParamIndex(
				parameterName, false), xmlObject);

	}

	public SQLXML getSQLXML(int parameterIndex) throws SQLException {
		ResultSetInternalMethods rs = getOutputParameters(parameterIndex);

		SQLXML retValue = ((com.mysql.jdbc.JDBC4ResultSet) rs)
				.getSQLXML(mapOutputParameterIndexToRsIndex(parameterIndex));

		this.outputParamWasNull = rs.wasNull();

		return retValue;

	}

	public SQLXML getSQLXML(String parameterName) throws SQLException {
		ResultSetInternalMethods rs = getOutputParameters(0); // definitely
																// not going to
																// be
		// from ?=

		SQLXML retValue = ((com.mysql.jdbc.JDBC4ResultSet) rs)
				.getSQLXML(fixParameterName(parameterName));

		this.outputParamWasNull = rs.wasNull();

		return retValue;
	}

	public RowId getRowId(int parameterIndex) throws SQLException {
		ResultSetInternalMethods rs = getOutputParameters(parameterIndex);

		RowId retValue = ((com.mysql.jdbc.JDBC4ResultSet) rs)
				.getRowId(mapOutputParameterIndexToRsIndex(parameterIndex));

		this.outputParamWasNull = rs.wasNull();

		return retValue;
	}

	public RowId getRowId(String parameterName) throws SQLException {
		ResultSetInternalMethods rs = getOutputParameters(0); // definitely
																// not going to
																// be
		// from ?=

		RowId retValue = ((com.mysql.jdbc.JDBC4ResultSet) rs)
				.getRowId(fixParameterName(parameterName));

		this.outputParamWasNull = rs.wasNull();

		return retValue;
	}

	/**
	 * JDBC 4.0 Set a NCLOB parameter.
	 * 
	 * @param i
	 *            the first parameter is 1, the second is 2, ...
	 * @param x
	 *            an object representing a NCLOB
	 * 
	 * @throws SQLException
	 *             if a database error occurs
	 */
	public void setNClob(int parameterIndex, NClob value) throws SQLException {
		JDBC4PreparedStatementHelper.setNClob(this, parameterIndex, value);
	}

	public void setNClob(String parameterName, NClob value) throws SQLException {
		JDBC4PreparedStatementHelper.setNClob(this, getNamedParamIndex(
				parameterName, false), value);

	}

	public void setNClob(String parameterName, Reader reader)
			throws SQLException {
		setNClob(getNamedParamIndex(parameterName, false), reader);

	}

	public void setNClob(String parameterName, Reader reader, long length)
			throws SQLException {
		setNClob(getNamedParamIndex(parameterName, false), reader, length);

	}

	public void setNString(String parameterName, String value)
			throws SQLException {
		setNString(getNamedParamIndex(parameterName, false), value);
	}

	/**
	 * @see java.sql.CallableStatement#getCharacterStream(int)
	 */
	public Reader getCharacterStream(int parameterIndex) throws SQLException {
		ResultSetInternalMethods rs = getOutputParameters(parameterIndex);

		Reader retValue = rs
				.getCharacterStream(mapOutputParameterIndexToRsIndex(parameterIndex));

		this.outputParamWasNull = rs.wasNull();

		return retValue;
	}

	/**
	 * @see java.sql.CallableStatement#getCharacterStream(java.lang.String)
	 */
	public Reader getCharacterStream(String parameterName) throws SQLException {
		ResultSetInternalMethods rs = getOutputParameters(0); // definitely
																// not going to
																// be
		// from ?=

		Reader retValue = rs
				.getCharacterStream(fixParameterName(parameterName));

		this.outputParamWasNull = rs.wasNull();

		return retValue;
	}

	/**
	 * @see java.sql.CallableStatement#getNCharacterStream(int)
	 */
	public Reader getNCharacterStream(int parameterIndex) throws SQLException {
		ResultSetInternalMethods rs = getOutputParameters(parameterIndex);

		Reader retValue = ((com.mysql.jdbc.JDBC4ResultSet) rs)
				.getNCharacterStream(mapOutputParameterIndexToRsIndex(parameterIndex));

		this.outputParamWasNull = rs.wasNull();

		return retValue;
	}

	/**
	 * @see java.sql.CallableStatement#getNCharacterStream(java.lang.String)
	 */
	public Reader getNCharacterStream(String parameterName) throws SQLException {
		ResultSetInternalMethods rs = getOutputParameters(0); // definitely
																// not going to
																// be
		// from ?=

		Reader retValue = ((com.mysql.jdbc.JDBC4ResultSet) rs)
				.getNCharacterStream(fixParameterName(parameterName));

		this.outputParamWasNull = rs.wasNull();

		return retValue;
	}

	/**
	 * @see java.sql.CallableStatement#getNClob(int)
	 */
	public NClob getNClob(int parameterIndex) throws SQLException {
		ResultSetInternalMethods rs = getOutputParameters(parameterIndex);

		NClob retValue = ((com.mysql.jdbc.JDBC4ResultSet) rs)
				.getNClob(mapOutputParameterIndexToRsIndex(parameterIndex));

		this.outputParamWasNull = rs.wasNull();

		return retValue;
	}

	/**
	 * @see java.sql.CallableStatement#getNClob(java.lang.String)
	 */
	public NClob getNClob(String parameterName) throws SQLException {
		ResultSetInternalMethods rs = getOutputParameters(0); // definitely
																// not going to
																// be
		// from ?=

		NClob retValue = ((com.mysql.jdbc.JDBC4ResultSet) rs)
				.getNClob(fixParameterName(parameterName));

		this.outputParamWasNull = rs.wasNull();

		return retValue;
	}

	/**
	 * @see java.sql.CallableStatement#getNString(int)
	 */
	public String getNString(int parameterIndex) throws SQLException {
		ResultSetInternalMethods rs = getOutputParameters(parameterIndex);

		String retValue = ((com.mysql.jdbc.JDBC4ResultSet) rs)
				.getNString(mapOutputParameterIndexToRsIndex(parameterIndex));

		this.outputParamWasNull = rs.wasNull();

		return retValue;
	}

	/**
	 * @see java.sql.CallableStatement#getNString(java.lang.String)
	 */
	public String getNString(String parameterName) throws SQLException {
		ResultSetInternalMethods rs = getOutputParameters(0); // definitely
																// not going to
																// be
		// from ?=

		String retValue = ((com.mysql.jdbc.JDBC4ResultSet) rs)
				.getNString(fixParameterName(parameterName));

		this.outputParamWasNull = rs.wasNull();

		return retValue;
	}
}
