/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source 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; either version 2 of the License, or
* (at your option) any later version.
*
* Resin Open Source 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, or any warranty
* of NON-INFRINGEMENT. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
*
* Free Software Foundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Scott Ferguson
*/
package com.caucho.db.jdbc;
import java.io.InputStream;
import java.io.Reader;
import java.sql.Array;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.NClob;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.Ref;
import java.sql.ResultSet;
import java.sql.RowId;
import java.sql.SQLException;
import java.sql.SQLXML;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Calendar;
import com.caucho.db.sql.Query;
import com.caucho.db.sql.QueryContext;
import com.caucho.db.xa.DbTransaction;
/**
* The JDBC statement implementation.
*/
public class PreparedStatementImpl extends StatementImpl
implements PreparedStatement {
private Query _query;
private boolean _wasResultSet;
private ResultSet _resultSet;
private boolean _isReturnGeneratedKeys;
private int _count;
PreparedStatementImpl(ConnectionImpl conn, Query query)
{
super(conn);
_query = query;
}
protected Query getQuery()
{
return _query;
}
protected void setResultSet(ResultSet rs)
{
_resultSet = rs;
_count = 0;
_wasResultSet = true;
}
void setReturnGeneratedKeys(boolean isReturnGeneratedKeys)
{
_isReturnGeneratedKeys = isReturnGeneratedKeys;
}
public java.sql.ResultSetMetaData getMetaData()
{
return null;
}
public void clearParameters()
throws SQLException
{
getQueryContext().clearParameters();
// throw new UnsupportedOperationException();
}
public void setNull(int parameter, int sqlType)
throws SQLException
{
getQueryContext().setString(parameter, null);
}
public void setNull(int parameter, int sqlType, String typeName)
throws SQLException
{
getQueryContext().setString(parameter, null);
}
public void setBoolean(int parameter, boolean x)
throws SQLException
{
getQueryContext().setBoolean(parameter, x);
}
public void setByte(int parameter, byte x)
throws SQLException
{
getQueryContext().setLong(parameter, x);
}
public void setShort(int parameter, short x)
throws SQLException
{
getQueryContext().setLong(parameter, x);
}
public void setInt(int parameter, int x)
throws SQLException
{
getQueryContext().setLong(parameter, x);
}
public void setLong(int parameter, long x)
throws SQLException
{
getQueryContext().setLong(parameter, x);
}
public void setFloat(int parameter, float x)
throws SQLException
{
getQueryContext().setDouble(parameter, x);
}
public void setDouble(int parameter, double x)
throws SQLException
{
getQueryContext().setDouble(parameter, x);
}
public void setBigDecimal(int parameter, java.math.BigDecimal x)
throws SQLException
{
throw new UnsupportedOperationException();
}
public void setString(int parameter, String x)
throws SQLException
{
getQueryContext().setString(parameter, x);
}
public void setBytes(int parameter, byte []x)
throws SQLException
{
if (x != null) {
getQueryContext().setBytes(parameter, x);
}
else
setNull(parameter, 0);
}
public void setDate(int parameter, java.sql.Date x, Calendar calendar)
throws SQLException
{
setDate(parameter, x);
}
public void setDate(int parameter, java.sql.Date x)
throws SQLException
{
if (x != null)
setTime(parameter, x.getTime());
else
setNull(parameter, 0);
}
public void setTime(int parameter, Time x, Calendar calendar)
throws SQLException
{
setTime(parameter, x);
}
public void setTime(int parameter, Time x)
throws SQLException
{
if (x != null)
setTime(parameter, x.getTime());
else
setNull(parameter, 0);
}
public void setTimestamp(int parameter, Timestamp x, Calendar calendar)
throws SQLException
{
setTimestamp(parameter, x);
}
public void setTimestamp(int parameter, Timestamp x)
throws SQLException
{
if (x != null)
setTime(parameter, x.getTime());
else
setNull(parameter, 0);
}
private void setTime(int parameter, long now)
throws SQLException
{
getQueryContext().setDate(parameter, now);
}
public void setAsciiStream(int parameter, InputStream is, int len)
throws SQLException
{
throw new UnsupportedOperationException();
}
public void setUnicodeStream(int parameter, InputStream is, int len)
throws SQLException
{
throw new UnsupportedOperationException();
}
public void setBinaryStream(int parameter, InputStream is, int len)
throws SQLException
{
getQueryContext().setBinaryStream(parameter, is, len);
}
public void setCharacterStream(int parameter, Reader is, int len)
throws SQLException
{
throw new UnsupportedOperationException();
}
public void setObject(int parameter, Object x, int target, int scale)
throws SQLException
{
throw new UnsupportedOperationException();
}
public void setObject(int parameter, Object x, int target)
throws SQLException
{
throw new UnsupportedOperationException();
}
public void setObject(int parameter, Object x)
throws SQLException
{
if (x instanceof String)
setString(parameter, (String) x);
else if (x instanceof Number) {
Number number = (Number) x;
if (x instanceof Double)
setDouble(parameter, number.doubleValue());
else if (x instanceof java.lang.Float)
setDouble(parameter, number.doubleValue());
else
setLong(parameter, number.longValue());
}
else if (x instanceof java.sql.Time)
setTime(parameter, (java.sql.Time) x);
else if (x instanceof java.sql.Timestamp)
setTimestamp(parameter, (java.sql.Timestamp) x);
else if (x instanceof java.sql.Date)
setDate(parameter, (java.sql.Date) x);
else {
throw new UnsupportedOperationException();
}
}
public void setRef(int parameter, Ref x)
throws SQLException
{
throw new UnsupportedOperationException();
}
public void setBlob(int parameter, Blob x)
throws SQLException
{
throw new UnsupportedOperationException();
}
public void setClob(int parameter, Clob x)
throws SQLException
{
throw new UnsupportedOperationException();
}
public void setArray(int parameter, Array x)
throws SQLException
{
throw new UnsupportedOperationException();
}
public void addBatch()
throws SQLException
{
}
public java.sql.ResultSet executeQuery()
throws SQLException
{
execute();
if (_wasResultSet)
return _resultSet;
else
throw new SQLException("missing result set");
}
public int executeUpdate()
throws SQLException
{
execute();
return getUpdateCount();
}
public boolean execute()
throws SQLException
{
_count++;
DbTransaction xa = null;
try {
if (_count != 1)
throw new IllegalStateException("Multithreading execute");
xa = _conn.getTransaction();
QueryContext queryContext = getQueryContext();
if (_query.isSelect()) {
_query.execute(queryContext, xa);
_wasResultSet = true;
_resultSet = new ResultSetImpl(this, queryContext.getResult());
return true;
}
else {
queryContext.setReturnGeneratedKeys(_isReturnGeneratedKeys);
_query.execute(queryContext, xa);
_wasResultSet = false;
return false;
}
} finally {
_count--;
if (xa != null && xa.isAutoCommit())
xa.rollback();
}
}
// JDK 1.4
public void setURL(int foo, java.net.URL url)
{
throw new UnsupportedOperationException();
}
public ParameterMetaData getParameterMetaData()
{
throw new UnsupportedOperationException();
}
public boolean isClosed() throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void setPoolable(boolean poolable) throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
public boolean isPoolable() throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
public <T> T unwrap(Class<T> iface) throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
public boolean isWrapperFor(Class<?> iface) throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void setRowId(int parameterIndex, RowId x) throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void setNString(int parameterIndex, String value) throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void setNClob(int parameterIndex, NClob value) throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void setClob(int parameterIndex, Reader reader, long length) throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void setBlob(int parameterIndex, InputStream inputStream, long length) throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void setNClob(int parameterIndex, Reader reader, long length) throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void setSQLXML(int parameterIndex, SQLXML xmlObject) throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void setAsciiStream(int parameterIndex, InputStream x, long length) throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void setBinaryStream(int parameterIndex, InputStream x, long length) throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void setAsciiStream(int parameterIndex, InputStream x) throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void setBinaryStream(int parameterIndex, InputStream is)
throws SQLException
{
setBinaryStream(parameterIndex, is, -1);
}
public void setCharacterStream(int parameterIndex, Reader reader)
throws SQLException
{
throw new UnsupportedOperationException("Not supported yet.");
}
public void setNCharacterStream(int parameterIndex, Reader value) throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void setClob(int parameterIndex, Reader reader) throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void setBlob(int parameterIndex, InputStream inputStream) throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
public void setNClob(int parameterIndex, Reader reader) throws SQLException {
throw new UnsupportedOperationException("Not supported yet.");
}
}