summaryrefslogtreecommitdiff
path: root/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Statement.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Statement.java')
-rw-r--r--src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Statement.java434
1 files changed, 0 insertions, 434 deletions
diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Statement.java b/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Statement.java
deleted file mode 100644
index d96f0f97f9..0000000000
--- a/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Statement.java
+++ /dev/null
@@ -1,434 +0,0 @@
-package org.postgresql.jdbc2;
-
-
-import java.io.*;
-import java.math.*;
-import java.sql.*;
-import java.util.Vector;
-import org.postgresql.Driver;
-import org.postgresql.largeobject.*;
-import org.postgresql.util.PSQLException;
-import org.postgresql.util.PSQLState;
-
-/* $PostgreSQL: pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Statement.java,v 1.18 2003/11/29 19:52:10 pgsql Exp $
- * This class defines methods of the jdbc2 specification. This class extends
- * org.postgresql.jdbc1.AbstractJdbc1Statement which provides the jdbc1
- * methods. The real Statement class (for jdbc2) is org.postgresql.jdbc2.Jdbc2Statement
- */
-public abstract class AbstractJdbc2Statement extends org.postgresql.jdbc1.AbstractJdbc1Statement
-{
-
- protected Vector batch = null;
- protected int resultsettype; // the resultset type to return
- protected int concurrency; // is it updateable or not?
-
- public AbstractJdbc2Statement (AbstractJdbc2Connection c)
- {
- super(c);
- resultsettype = ResultSet.TYPE_SCROLL_INSENSITIVE;
- concurrency = ResultSet.CONCUR_READ_ONLY;
- }
-
- public AbstractJdbc2Statement(AbstractJdbc2Connection connection, String sql) throws SQLException
- {
- super(connection, sql);
- }
-
- /*
- * Execute a SQL statement that may return multiple results. We
- * don't have to worry about this since we do not support multiple
- * ResultSets. You can use getResultSet or getUpdateCount to
- * retrieve the result.
- *
- * @param sql any SQL statement
- * @return true if the next result is a ResulSet, false if it is
- * an update count or there are no more results
- * @exception SQLException if a database access error occurs
- */
- public boolean execute() throws SQLException
- {
- boolean l_return = super.execute();
- //Now do the jdbc2 specific stuff
- //required for ResultSet.getStatement() to work and updateable resultsets
- result.setStatement(this);
-
- return l_return;
- }
-
- // ** JDBC 2 Extensions **
-
- public void addBatch(String p_sql) throws SQLException
- {
- if (batch == null)
- batch = new Vector();
- Object[] l_statement = new Object[] {new String[] {p_sql}, new Object[0], new String[0]};
- batch.addElement(l_statement);
- }
-
- public void clearBatch() throws SQLException
- {
- batch = null;
- }
-
- public int[] executeBatch() throws SQLException
- {
- if (batch == null)
- batch = new Vector();
- int size = batch.size();
- int[] result = new int[size];
- int i = 0;
- try
- {
- //copy current state of statement
- String[] l_origSqlFragments = m_sqlFragments;
- Object[] l_origBinds = m_binds;
- String[] l_origBindTypes = m_bindTypes;
-
- for (i = 0;i < size;i++) {
- //set state from batch
- Object[] l_statement = (Object[])batch.elementAt(i);
- this.m_sqlFragments = (String[])l_statement[0];
- this.m_binds = (Object[])l_statement[1];
- this.m_bindTypes = (String[])l_statement[2];
- result[i] = this.executeUpdate();
- }
-
- //restore state of statement
- m_sqlFragments = l_origSqlFragments;
- m_binds = l_origBinds;
- m_bindTypes = l_origBindTypes;
-
- }
- catch (SQLException e)
- {
- int[] resultSucceeded = new int[i];
- System.arraycopy(result, 0, resultSucceeded, 0, i);
-
- PBatchUpdateException updex =
- new PBatchUpdateException("postgresql.stat.batch.error",
- new Integer(i), m_sqlFragments[0], resultSucceeded);
- updex.setNextException(e);
-
- throw updex;
- }
- finally
- {
- batch.removeAllElements();
- }
- return result;
- }
-
- public void cancel() throws SQLException
- {
- connection.cancelQuery();
- }
-
- public Connection getConnection() throws SQLException
- {
- return (Connection) connection;
- }
-
- public int getFetchDirection() throws SQLException
- {
- throw new PSQLException("postgresql.psqlnotimp", PSQLState.NOT_IMPLEMENTED);
- }
-
- public int getResultSetConcurrency() throws SQLException
- {
- return concurrency;
- }
-
- public int getResultSetType() throws SQLException
- {
- return resultsettype;
- }
-
- public void setFetchDirection(int direction) throws SQLException
- {
- // I don't think this should happen, since it's a hint it should just
- // fail quietly.
- // throw Driver.notImplemented();
- }
-
- public void setFetchSize(int rows) throws SQLException
- {
- if (rows<0) throw new PSQLException("postgresql.input.fetch.gt0");
- super.fetchSize = rows;
- }
-
- public void setResultSetConcurrency(int value) throws SQLException
- {
- concurrency = value;
- }
-
- public void setResultSetType(int value) throws SQLException
- {
- resultsettype = value;
- }
-
- public void addBatch() throws SQLException
- {
- if (batch == null)
- batch = new Vector();
-
- //we need to create copies, otherwise the values can be changed
- Object[] l_newSqlFragments = null;
- if (m_sqlFragments != null) {
- l_newSqlFragments = new String[m_sqlFragments.length];
- System.arraycopy(m_sqlFragments,0,l_newSqlFragments,0,m_sqlFragments.length);
- }
- Object[] l_newBinds = new Object[m_binds.length];
- System.arraycopy(m_binds,0,l_newBinds,0,m_binds.length);
- String[] l_newBindTypes = new String[m_bindTypes.length];
- System.arraycopy(m_bindTypes,0,l_newBindTypes,0,m_bindTypes.length);
- Object[] l_statement = new Object[] {l_newSqlFragments, l_newBinds, l_newBindTypes};
- batch.addElement(l_statement);
- }
-
- public ResultSetMetaData getMetaData() throws SQLException
- {
- ResultSet rs = getResultSet();
- if (rs != null)
- return rs.getMetaData();
-
- // Does anyone really know what this method does?
- return null;
- }
-
- public void setArray(int i, java.sql.Array x) throws SQLException
- {
- setString(i, x.toString());
- }
-
- public void setBlob(int i, Blob x) throws SQLException
- {
- InputStream l_inStream = x.getBinaryStream();
- LargeObjectManager lom = connection.getLargeObjectAPI();
- int oid = lom.create();
- LargeObject lob = lom.open(oid);
- OutputStream los = lob.getOutputStream();
- byte[] buf = new byte[4096];
- try
- {
- // could be buffered, but then the OutputStream returned by LargeObject
- // is buffered internally anyhow, so there would be no performance
- // boost gained, if anything it would be worse!
- int bytesRemaining = (int)x.length();
- int numRead = l_inStream.read(buf, 0, Math.min(buf.length, bytesRemaining));
- while (numRead != -1 && bytesRemaining > 0)
- {
- bytesRemaining -= numRead;
- if ( numRead == buf.length )
- los.write(buf); // saves a buffer creation and copy in LargeObject since it's full
- else
- los.write(buf,0,numRead);
- numRead = l_inStream.read(buf, 0, Math.min(buf.length, bytesRemaining));
- }
- }
- catch (IOException se)
- {
- throw new PSQLException("postgresql.unusual", PSQLState.UNEXPECTED_ERROR, se);
- }
- finally
- {
- try
- {
- los.close();
- l_inStream.close();
- }
- catch( Exception e ) {}
- }
- setInt(i, oid);
- }
-
- public void setCharacterStream(int i, java.io.Reader x, int length) throws SQLException
- {
- if (connection.haveMinimumCompatibleVersion("7.2"))
- {
- //Version 7.2 supports CharacterStream for for the PG text types
- //As the spec/javadoc for this method indicate this is to be used for
- //large text values (i.e. LONGVARCHAR) PG doesn't have a separate
- //long varchar datatype, but with toast all the text datatypes are capable of
- //handling very large values. Thus the implementation ends up calling
- //setString() since there is no current way to stream the value to the server
- char[] l_chars = new char[length];
- int l_charsRead;
- try
- {
- l_charsRead = x.read(l_chars, 0, length);
- }
- catch (IOException l_ioe)
- {
- throw new PSQLException("postgresql.unusual", PSQLState.UNEXPECTED_ERROR, l_ioe);
- }
- setString(i, new String(l_chars, 0, l_charsRead));
- }
- else
- {
- //Version 7.1 only supported streams for LargeObjects
- //but the jdbc spec indicates that streams should be
- //available for LONGVARCHAR instead
- LargeObjectManager lom = connection.getLargeObjectAPI();
- int oid = lom.create();
- LargeObject lob = lom.open(oid);
- OutputStream los = lob.getOutputStream();
- try
- {
- // could be buffered, but then the OutputStream returned by LargeObject
- // is buffered internally anyhow, so there would be no performance
- // boost gained, if anything it would be worse!
- int c = x.read();
- int p = 0;
- while (c > -1 && p < length)
- {
- los.write(c);
- c = x.read();
- p++;
- }
- los.close();
- }
- catch (IOException se)
- {
- throw new PSQLException("postgresql.unusual", PSQLState.UNEXPECTED_ERROR, se);
- }
- // lob is closed by the stream so don't call lob.close()
- setInt(i, oid);
- }
- }
-
- public void setClob(int i, Clob x) throws SQLException
- {
- InputStream l_inStream = x.getAsciiStream();
- int l_length = (int) x.length();
- LargeObjectManager lom = connection.getLargeObjectAPI();
- int oid = lom.create();
- LargeObject lob = lom.open(oid);
- OutputStream los = lob.getOutputStream();
- try
- {
- // could be buffered, but then the OutputStream returned by LargeObject
- // is buffered internally anyhow, so there would be no performance
- // boost gained, if anything it would be worse!
- int c = l_inStream.read();
- int p = 0;
- while (c > -1 && p < l_length)
- {
- los.write(c);
- c = l_inStream.read();
- p++;
- }
- los.close();
- }
- catch (IOException se)
- {
- throw new PSQLException("postgresql.unusual", PSQLState.UNEXPECTED_ERROR, se);
- }
- // lob is closed by the stream so don't call lob.close()
- setInt(i, oid);
- }
-
- public void setNull(int i, int t, String s) throws SQLException
- {
- setNull(i, t);
- }
-
- public void setRef(int i, Ref x) throws SQLException
- {
- throw Driver.notImplemented();
- }
-
- public void setDate(int i, java.sql.Date d, java.util.Calendar cal) throws SQLException
- {
- if (cal == null)
- setDate(i, d);
- else
- {
- cal.setTime(d);
- setDate(i, new java.sql.Date(cal.getTime().getTime()));
- }
- }
-
- public void setTime(int i, Time t, java.util.Calendar cal) throws SQLException
- {
- if (cal == null)
- setTime(i, t);
- else
- {
- cal.setTime(t);
- setTime(i, new java.sql.Time(cal.getTime().getTime()));
- }
- }
-
- public void setTimestamp(int i, Timestamp t, java.util.Calendar cal) throws SQLException
- {
- if (cal == null)
- setTimestamp(i, t);
- else
- {
- cal.setTime(t);
- setTimestamp(i, new java.sql.Timestamp(cal.getTime().getTime()));
- }
- }
-
- // ** JDBC 2 Extensions for CallableStatement**
-
- public java.sql.Array getArray(int i) throws SQLException
- {
- throw Driver.notImplemented();
- }
-
- public java.math.BigDecimal getBigDecimal(int parameterIndex) throws SQLException
- {
- checkIndex (parameterIndex, Types.NUMERIC, "BigDecimal");
- return ((BigDecimal)callResult);
- }
-
- public Blob getBlob(int i) throws SQLException
- {
- throw Driver.notImplemented();
- }
-
- public Clob getClob(int i) throws SQLException
- {
- throw Driver.notImplemented();
- }
-
- public Object getObject(int i, java.util.Map map) throws SQLException
- {
- throw Driver.notImplemented();
- }
-
- public Ref getRef(int i) throws SQLException
- {
- throw Driver.notImplemented();
- }
-
- public java.sql.Date getDate(int i, java.util.Calendar cal) throws SQLException
- {
- throw Driver.notImplemented();
- }
-
- public Time getTime(int i, java.util.Calendar cal) throws SQLException
- {
- throw Driver.notImplemented();
- }
-
- public Timestamp getTimestamp(int i, java.util.Calendar cal) throws SQLException
- {
- throw Driver.notImplemented();
- }
-
- // no custom types allowed yet..
- public void registerOutParameter(int parameterIndex, int sqlType, String typeName) throws SQLException
- {
- throw Driver.notImplemented();
- }
-
-
- //This is needed by AbstractJdbc2ResultSet to determine if the query is updateable or not
- protected String[] getSqlFragments()
- {
- return m_sqlFragments;
- }
-
-}