net.sourceforge.jtds.jdbc
Class JtdsStatement

java.lang.Object
  |
  +--net.sourceforge.jtds.jdbc.JtdsStatement
All Implemented Interfaces:
java.sql.Statement
Direct Known Subclasses:
JtdsPreparedStatement

public class JtdsStatement
extends java.lang.Object
implements java.sql.Statement

jTDS implementation of the java.sql.Statement interface.

NB. As allowed by the JDBC standard and like most other drivers, this implementation only allows one open result set at a time.

Implementation notes:

I experimented with allowing multiple open result sets as supported by the origianal jTDS but rejected this approach for the following reasons:

  1. It is more difficult to ensure that there are no memory leaks and that cursors are closed if multiple open sets are allowed.
  2. The use of one result set allows cursor and non cursor result sets to be derived from exeuteQuery() or execute() and getResultSet() in the same way that other drivers do.
In the event of an IO failure the setClosed() method forces this statement and associated result set to close preventing the propogation of errors. This class includes a finalize method which increases the chances of the statement being closed tidly in a pooled environment where the user has forgotten to explicitly close the statement before it goes out of scope.

Version:
$Id: JtdsStatement.java,v 1.36 2005/04/11 13:23:48 alin_sinpalean Exp $
Author:
Mike Hutchinson
See Also:
Statement, Connection.createStatement(), ResultSet

Field Summary
protected  java.util.ArrayList batchValues
          Batched SQL Statement array.
(package private) static int BOOLEAN
           
(package private) static int CLOSE_ALL_RESULTS
           
(package private) static int CLOSE_CURRENT_RESULT
           
protected  boolean closed
          True if this statement is closed.
protected  ConnectionJDBC2 connection
          The connection owning this statement object.
protected  JtdsResultSet currentResult
          The current ResultSet.
protected  java.lang.String cursorName
          The cursor name to be used for positioned updates.
(package private) static int DATALINK
           
protected  boolean escapeProcessing
          True if SQL statements should be preprocessed.
(package private) static java.lang.Integer EXECUTE_FAILED
           
protected  int fetchDirection
          The fetch direction for result sets.
protected  int fetchSize
          The fetch size (default 100, only used by cursor ResultSets).
protected  JtdsResultSet genKeyResultSet
          Dummy result set for getGeneratedKeys.
(package private) static int KEEP_CURRENT_RESULT
           
protected  int maxFieldSize
          The maximum field size (not used at present).
protected  int maxRows
          The maximum number of rows to return (not used at present).
protected  SQLDiagnostic messages
          SQL Diagnostic exceptions and warnings.
(package private) static int NO_GENERATED_KEYS
           
protected  java.util.ArrayList openResultSets
          List of open result sets.
protected  int queryTimeout
          The read query timeout in seconds
protected  java.util.LinkedList resultQueue
          List of queued results (update counts, possibly followed by a ResultSet).
protected  int resultSetConcurrency
          The concurrency of result sets created by this statement.
protected  int resultSetType
          The type of result sets created by this statement.
(package private) static int RETURN_GENERATED_KEYS
           
(package private) static java.lang.Integer SUCCESS_NO_INFO
           
protected  TdsCore tds
          The TDS object used for server access.
private  int updateCount
          The current update count.
 
Constructor Summary
(package private) JtdsStatement(ConnectionJDBC2 connection, int resultSetType, int resultSetConcurrency)
          Construct a new Statement object.
 
Method Summary
 void addBatch(java.lang.String sql)
           
(package private)  void addWarning(java.sql.SQLWarning w)
          Add an SQLWarning object to the statment warnings list.
protected  void cacheResults()
          Cache as many results as possible (up to the first ResultSet).
 void cancel()
           
protected  void checkOpen()
          Check that this statement is still open.
 void clearBatch()
           
 void clearWarnings()
           
 void close()
           
(package private)  void closeAllResultSets()
          Close all result sets.
(package private)  void closeCurrentResultSet()
          Close current result set (if any).
 boolean execute(java.lang.String sql)
           
 boolean execute(java.lang.String sql, int autoGeneratedKeys)
           
 boolean execute(java.lang.String sql, int[] columnIndexes)
           
 boolean execute(java.lang.String sql, java.lang.String[] columnNames)
           
 int[] executeBatch()
          Execute batch of SQL Statements.
protected  void executeBatchOther(java.lang.Object value, boolean last)
          This method should be over-ridden by any sub-classes that place values other than Strings into the batchValues list to handle execution properly.
 java.sql.ResultSet executeQuery(java.lang.String sql)
           
protected  boolean executeSQL(java.lang.String sql, java.lang.String spName, java.lang.String sqlWord, ParamInfo[] params, boolean returnKeys, boolean update)
          Execute any type of SQL.
protected  java.sql.ResultSet executeSQLQuery(java.lang.String sql, java.lang.String spName, ParamInfo[] params)
          Execute SQL to obtain a result set.
 int executeUpdate(java.lang.String sql)
           
 int executeUpdate(java.lang.String sql, int autoGeneratedKeys)
           
 int executeUpdate(java.lang.String sql, int[] columnIndexes)
           
 int executeUpdate(java.lang.String sql, java.lang.String[] columnNames)
           
protected  void finalize()
          Called when this object goes out of scope to close any resultSet object and this statement.
 java.sql.Connection getConnection()
           
 int getFetchDirection()
           
 int getFetchSize()
           
 java.sql.ResultSet getGeneratedKeys()
           
 int getMaxFieldSize()
           
 int getMaxRows()
           
(package private)  SQLDiagnostic getMessages()
          Get the statement's warnings list.
 boolean getMoreResults()
           
 boolean getMoreResults(int current)
           
 int getQueryTimeout()
           
 java.sql.ResultSet getResultSet()
           
 int getResultSetConcurrency()
           
 int getResultSetHoldability()
           
 int getResultSetType()
           
(package private)  TdsCore getTds()
          Get the Statement's TDS object.
 int getUpdateCount()
           
protected  int getUpdateCount(int defaultValue)
          Returns the first update count in resultQueue or the specified default value if the queue is empty.
 java.sql.SQLWarning getWarnings()
           
protected  void initialize()
          Initialize the Statement, by cleaning up all queued and unprocessed results.
(package private)  void notImplemented(java.lang.String method)
          Report that user tried to call a method which has not been implemented.
private  boolean processResults(boolean returnKeys, boolean update)
          Queue up update counts into resultQueue until the end of the response is reached or a ResultSet is encountered.
 void setCursorName(java.lang.String name)
           
 void setEscapeProcessing(boolean enable)
           
 void setFetchDirection(int direction)
           
 void setFetchSize(int rows)
           
 void setMaxFieldSize(int max)
           
 void setMaxRows(int max)
           
 void setQueryTimeout(int seconds)
           
 
Methods inherited from class java.lang.Object
, clone, equals, getClass, hashCode, notify, notifyAll, registerNatives, toString, wait, wait, wait
 

Field Detail

RETURN_GENERATED_KEYS

static final int RETURN_GENERATED_KEYS

NO_GENERATED_KEYS

static final int NO_GENERATED_KEYS

CLOSE_CURRENT_RESULT

static final int CLOSE_CURRENT_RESULT

KEEP_CURRENT_RESULT

static final int KEEP_CURRENT_RESULT

CLOSE_ALL_RESULTS

static final int CLOSE_ALL_RESULTS

BOOLEAN

static final int BOOLEAN

DATALINK

static final int DATALINK

SUCCESS_NO_INFO

static final java.lang.Integer SUCCESS_NO_INFO

EXECUTE_FAILED

static final java.lang.Integer EXECUTE_FAILED

connection

protected ConnectionJDBC2 connection
The connection owning this statement object.

tds

protected TdsCore tds
The TDS object used for server access.

queryTimeout

protected int queryTimeout
The read query timeout in seconds

currentResult

protected JtdsResultSet currentResult
The current ResultSet.

updateCount

private int updateCount
The current update count.

fetchDirection

protected int fetchDirection
The fetch direction for result sets.

resultSetType

protected int resultSetType
The type of result sets created by this statement.

resultSetConcurrency

protected int resultSetConcurrency
The concurrency of result sets created by this statement.

fetchSize

protected int fetchSize
The fetch size (default 100, only used by cursor ResultSets).

cursorName

protected java.lang.String cursorName
The cursor name to be used for positioned updates.

closed

protected boolean closed
True if this statement is closed.

maxFieldSize

protected int maxFieldSize
The maximum field size (not used at present).

maxRows

protected int maxRows
The maximum number of rows to return (not used at present).

escapeProcessing

protected boolean escapeProcessing
True if SQL statements should be preprocessed.

messages

protected SQLDiagnostic messages
SQL Diagnostic exceptions and warnings.

batchValues

protected java.util.ArrayList batchValues
Batched SQL Statement array.

genKeyResultSet

protected JtdsResultSet genKeyResultSet
Dummy result set for getGeneratedKeys.

resultQueue

protected java.util.LinkedList resultQueue
List of queued results (update counts, possibly followed by a ResultSet).

openResultSets

protected java.util.ArrayList openResultSets
List of open result sets.
Constructor Detail

JtdsStatement

JtdsStatement(ConnectionJDBC2 connection,
              int resultSetType,
              int resultSetConcurrency)
        throws java.sql.SQLException
Construct a new Statement object.
Parameters:
connection - The parent connection.
resultSetType - The result set type for example TYPE_FORWARD_ONLY.
resultSetConcurrency - The concurrency for example CONCUR_READ_ONLY.
Method Detail

finalize

protected void finalize()
Called when this object goes out of scope to close any resultSet object and this statement.
Overrides:
finalize in class java.lang.Object

getTds

TdsCore getTds()
Get the Statement's TDS object.
Returns:
The TDS support as a TdsCore Object.

getMessages

SQLDiagnostic getMessages()
Get the statement's warnings list.
Returns:
The warnings list as a SQLDiagnostic.

checkOpen

protected void checkOpen()
                  throws java.sql.SQLException
Check that this statement is still open.
Throws:
java.sql.SQLException - if statement closed.

notImplemented

void notImplemented(java.lang.String method)
              throws java.sql.SQLException
Report that user tried to call a method which has not been implemented.
Parameters:
method - The method name to report in the error message.
Throws:
java.sql.SQLException -  

closeCurrentResultSet

void closeCurrentResultSet()
                     throws java.sql.SQLException
Close current result set (if any).

closeAllResultSets

void closeAllResultSets()
                  throws java.sql.SQLException
Close all result sets.

addWarning

void addWarning(java.sql.SQLWarning w)
Add an SQLWarning object to the statment warnings list.
Parameters:
w - The SQLWarning to add.

executeBatchOther

protected void executeBatchOther(java.lang.Object value,
                                 boolean last)
                          throws java.sql.SQLException
This method should be over-ridden by any sub-classes that place values other than Strings into the batchValues list to handle execution properly.
Parameters:
value - SQL String or list of parameters to execute
last - true if this is the last query/parameter list in the batch

executeSQLQuery

protected java.sql.ResultSet executeSQLQuery(java.lang.String sql,
                                             java.lang.String spName,
                                             ParamInfo[] params)
                                      throws java.sql.SQLException
Execute SQL to obtain a result set.
Parameters:
sql - The SQL statement to execute.
spName - Optional stored procedure name.
params - Optional parameters.
Returns:
The result set as a ResultSet.
Throws:
java.sql.SQLException -  

executeSQL

protected boolean executeSQL(java.lang.String sql,
                             java.lang.String spName,
                             java.lang.String sqlWord,
                             ParamInfo[] params,
                             boolean returnKeys,
                             boolean update)
                      throws java.sql.SQLException
Execute any type of SQL.
Parameters:
sql - The SQL statement to execute.
spName - Optional stored procedure name.
params - Optional parameters.
Returns:
boolean true if a result set is returned by the statement.
Throws:
java.sql.SQLException - if an error condition occurs

processResults

private boolean processResults(boolean returnKeys,
                               boolean update)
                        throws java.sql.SQLException
Queue up update counts into resultQueue until the end of the response is reached or a ResultSet is encountered. Calling processResults while a ResultSet is open will not close it, but will consume all remaining rows.
Parameters:
returnKeys - true if a generated keys ResultSet is expected
update - true if the method is called from within executeUpdate
Returns:
true if there are any results, false otherwise
Throws:
java.sql.SQLException - if an error condition occurs

cacheResults

protected void cacheResults()
                     throws java.sql.SQLException
Cache as many results as possible (up to the first ResultSet). Called by ResultSets when the end is reached.

initialize

protected void initialize()
                   throws java.sql.SQLException
Initialize the Statement, by cleaning up all queued and unprocessed results. Called by all execute methods.
Throws:
java.sql.SQLException - if an error occurs

getUpdateCount

protected int getUpdateCount(int defaultValue)
Returns the first update count in resultQueue or the specified default value if the queue is empty.
Parameters:
defaultValue - the value to return if there are no queued update counts (0 if called from executeUpdate, -1 if called from getMoreResults)
Returns:
the first queued update count or the default value if the queue is empty

getFetchDirection

public int getFetchDirection()
                      throws java.sql.SQLException
Specified by:
getFetchDirection in interface java.sql.Statement

getFetchSize

public int getFetchSize()
                 throws java.sql.SQLException
Specified by:
getFetchSize in interface java.sql.Statement

getMaxFieldSize

public int getMaxFieldSize()
                    throws java.sql.SQLException
Specified by:
getMaxFieldSize in interface java.sql.Statement

getMaxRows

public int getMaxRows()
               throws java.sql.SQLException
Specified by:
getMaxRows in interface java.sql.Statement

getQueryTimeout

public int getQueryTimeout()
                    throws java.sql.SQLException
Specified by:
getQueryTimeout in interface java.sql.Statement

getResultSetConcurrency

public int getResultSetConcurrency()
                            throws java.sql.SQLException
Specified by:
getResultSetConcurrency in interface java.sql.Statement

getResultSetHoldability

public int getResultSetHoldability()
                            throws java.sql.SQLException

getResultSetType

public int getResultSetType()
                     throws java.sql.SQLException
Specified by:
getResultSetType in interface java.sql.Statement

getUpdateCount

public int getUpdateCount()
                   throws java.sql.SQLException
Specified by:
getUpdateCount in interface java.sql.Statement

cancel

public void cancel()
            throws java.sql.SQLException
Specified by:
cancel in interface java.sql.Statement

clearBatch

public void clearBatch()
                throws java.sql.SQLException
Specified by:
clearBatch in interface java.sql.Statement

clearWarnings

public void clearWarnings()
                   throws java.sql.SQLException
Specified by:
clearWarnings in interface java.sql.Statement

close

public void close()
           throws java.sql.SQLException
Specified by:
close in interface java.sql.Statement

getMoreResults

public boolean getMoreResults()
                       throws java.sql.SQLException
Specified by:
getMoreResults in interface java.sql.Statement

executeBatch

public int[] executeBatch()
                   throws java.sql.SQLException,
                          java.sql.BatchUpdateException
Execute batch of SQL Statements.

The JDBC3 standard says that for a server which does not continue processing a batch once the first error has occurred (e.g. SQL Server), the returned array will never contain EXECUTE_FAILED in any of the elements. If a failure has occurred the array length will be less than the count of statements in the batch. For those servers that do continue to execute a batch containing an error (e.g. Sybase), elements may contain EXECUTE_FAILED. Note: even here the array length may also be shorter than the statement count if a serious error has prevented the rest of the batch from being executed. In addition, when executing batched stored procedures, Sybase will also stop after the first error.

Specified by:
executeBatch in interface java.sql.Statement
Returns:
update counts as an int[]

setFetchDirection

public void setFetchDirection(int direction)
                       throws java.sql.SQLException
Specified by:
setFetchDirection in interface java.sql.Statement

setFetchSize

public void setFetchSize(int rows)
                  throws java.sql.SQLException
Specified by:
setFetchSize in interface java.sql.Statement

setMaxFieldSize

public void setMaxFieldSize(int max)
                     throws java.sql.SQLException
Specified by:
setMaxFieldSize in interface java.sql.Statement

setMaxRows

public void setMaxRows(int max)
                throws java.sql.SQLException
Specified by:
setMaxRows in interface java.sql.Statement

setQueryTimeout

public void setQueryTimeout(int seconds)
                     throws java.sql.SQLException
Specified by:
setQueryTimeout in interface java.sql.Statement

getMoreResults

public boolean getMoreResults(int current)
                       throws java.sql.SQLException

setEscapeProcessing

public void setEscapeProcessing(boolean enable)
                         throws java.sql.SQLException
Specified by:
setEscapeProcessing in interface java.sql.Statement

executeUpdate

public int executeUpdate(java.lang.String sql)
                  throws java.sql.SQLException
Specified by:
executeUpdate in interface java.sql.Statement

addBatch

public void addBatch(java.lang.String sql)
              throws java.sql.SQLException
Specified by:
addBatch in interface java.sql.Statement

setCursorName

public void setCursorName(java.lang.String name)
                   throws java.sql.SQLException
Specified by:
setCursorName in interface java.sql.Statement

execute

public boolean execute(java.lang.String sql)
                throws java.sql.SQLException
Specified by:
execute in interface java.sql.Statement

executeUpdate

public int executeUpdate(java.lang.String sql,
                         int autoGeneratedKeys)
                  throws java.sql.SQLException

execute

public boolean execute(java.lang.String sql,
                       int autoGeneratedKeys)
                throws java.sql.SQLException

executeUpdate

public int executeUpdate(java.lang.String sql,
                         int[] columnIndexes)
                  throws java.sql.SQLException

execute

public boolean execute(java.lang.String sql,
                       int[] columnIndexes)
                throws java.sql.SQLException

getConnection

public java.sql.Connection getConnection()
                                  throws java.sql.SQLException
Specified by:
getConnection in interface java.sql.Statement

getGeneratedKeys

public java.sql.ResultSet getGeneratedKeys()
                                    throws java.sql.SQLException

getResultSet

public java.sql.ResultSet getResultSet()
                                throws java.sql.SQLException
Specified by:
getResultSet in interface java.sql.Statement

getWarnings

public java.sql.SQLWarning getWarnings()
                                throws java.sql.SQLException
Specified by:
getWarnings in interface java.sql.Statement

executeUpdate

public int executeUpdate(java.lang.String sql,
                         java.lang.String[] columnNames)
                  throws java.sql.SQLException

execute

public boolean execute(java.lang.String sql,
                       java.lang.String[] columnNames)
                throws java.sql.SQLException

executeQuery

public java.sql.ResultSet executeQuery(java.lang.String sql)
                                throws java.sql.SQLException
Specified by:
executeQuery in interface java.sql.Statement


Generated on April 15 2005