Package org.apache.tomcat.dbcp.dbcp2

# Class DelegatingStatement

java.lang.Object
org.apache.tomcat.dbcp.dbcp2.AbandonedTrace
org.apache.tomcat.dbcp.dbcp2.DelegatingStatement

All Implemented Interfaces:
  `AutoCloseable`, `Statement`, `Wrapper`, `TrackedUse`

Direct Known Subclasses:
  `DelegatingPreparedStatement`

public class DelegatingStatement extends AbandonedTrace implements Statement
A base delegating implementation of `Statement`.

All of the methods from the `Statement` interface simply check to see that the `Statement` is active, and call the corresponding method on the "delegate" provided in my constructor.

Extends AbandonedTrace to implement Statement tracking and logging of code which created the Statement. Tracking the Statement ensures that the Connection which created it can close any open Statement's on Connection close.

Since:
  2.0

## Field Summary

### Fields inherited from interface java.sql.Statement

`CLOSE_ALL_RESULTS, CLOSE_CURRENT_RESULT, EXECUTE_FAILED, KEEP_CURRENT_RESULT, NO_GENERATED_KEYS, RETURN_GENERATED_KEYS, SUCCESS_NO_INFO`

## Constructor Summary

Constructors
Constructor
Description
`DelegatingStatement(DelegatingConnection<?> connection, Statement statement)`
Create a wrapper for the Statement which traces this Statement to the Connection which created it and the code which created it.

## Method Summary

Modifier and Type
Method
Description
`void`
`activate()`
`void`
`addBatch(String sql)`
`void`
`cancel()`
`protected void`
`checkOpen()`
`void`
`clearBatch()`
`void`
`clearWarnings()`
`void`
`close()`
Close this DelegatingStatement, and close any ResultSets that were not explicitly closed.
`void`
`closeOnCompletion()`
`boolean`
`execute(String sql)`
`boolean`
`execute(String sql, int autoGeneratedKeys)`
`boolean`
`execute(String sql, int[] columnIndexes)`
`boolean`
`execute(String sql, String[] columnNames)`
`int[]`
`executeBatch()`
`long[]`
`executeLargeBatch()`
`long`
`executeLargeUpdate(String sql)`
`long`
`executeLargeUpdate(String sql, int autoGeneratedKeys)`
`long`
`executeLargeUpdate(String sql, int[] columnIndexes)`
`long`
`executeLargeUpdate(String sql, String[] columnNames)`
`ResultSet`
`executeQuery(String sql)`
`int`
`executeUpdate(String sql)`
`int`
`executeUpdate(String sql, int autoGeneratedKeys)`
`int`
`executeUpdate(String sql, int[] columnIndexes)`
`int`
`executeUpdate(String sql, String[] columnNames)`
`protected void`
`finalize()`
`Connection`
`getConnection()`
`protected DelegatingConnection<?>`
`getConnectionInternal()`
`Statement`
`getDelegate()`
Returns my underlying `Statement`.
`int`
`getFetchDirection()`
`int`
`getFetchSize()`
`ResultSet`
`getGeneratedKeys()`
`Statement`
`getInnermostDelegate()`
If my underlying `Statement` is not a `DelegatingStatement`, returns it, otherwise recursively invokes this method on my delegate.
`long`
`getLargeMaxRows()`
`long`
`getLargeUpdateCount()`
`int`
`getMaxFieldSize()`
`int`
`getMaxRows()`
`boolean`
`getMoreResults()`
`boolean`
`getMoreResults(int current)`
`int`
`getQueryTimeout()`
`ResultSet`
`getResultSet()`
`int`
`getResultSetConcurrency()`
`int`
`getResultSetHoldability()`
`int`
`getResultSetType()`
`int`
`getUpdateCount()`
`SQLWarning`
`getWarnings()`
`protected void`
`handleException(SQLException e)`
`boolean`
`isClosed()`
`protected boolean`
`isClosedInternal()`
`boolean`
`isCloseOnCompletion()`
`boolean`
`isPoolable()`
`boolean`
`isWrapperFor(Class<?> iface)`
`void`
`passivate()`
`protected void`
`setClosedInternal(boolean closed)`
`void`
`setCursorName(String name)`
`void`
`setDelegate(Statement statement)`
Sets my delegate.
`void`
`setEscapeProcessing(boolean enable)`
`void`
`setFetchDirection(int direction)`
`void`
`setFetchSize(int rows)`
`void`
`setLargeMaxRows(long max)`
`void`
`setMaxFieldSize(int max)`
`void`
`setMaxRows(int max)`
`void`
`setPoolable(boolean poolable)`
`void`
`setQueryTimeout(int seconds)`
`String`
`toString()`
Returns a String representation of this object.
`<T> T`
`unwrap(Class<T> iface)`

### Methods inherited from class org.apache.tomcat.dbcp.dbcp2.AbandonedTrace

`addTrace, clearTrace, close, getLastUsed, getLastUsedInstant, getTrace, removeThisTrace, removeTrace, setLastUsed, setLastUsed, setLastUsed`

### Methods inherited from class java.lang.Object

`clone, equals, getClass, hashCode, notify, notifyAll, wait, wait, wait`

### Methods inherited from interface java.sql.Statement

`enquoteIdentifier, enquoteLiteral, enquoteNCharLiteral, isSimpleIdentifier`

## Constructor Details

### DelegatingStatement

public DelegatingStatement(DelegatingConnection<?> connection, Statement statement)
Create a wrapper for the Statement which traces this Statement to the Connection which created it and the code which created it.

Parameters:
  `connection` - the `DelegatingConnection` that created this statement.
  `statement` - the `Statement` to delegate all calls to.

## Method Details

### activate

public void activate() throws SQLException

Throws:
  `SQLException` - thrown by the delegating statement.
Since:
  2.4.0 made public, was protected in 2.3.0.

### addBatch

public void addBatch(String sql) throws SQLException

Specified by:
  `addBatch` in interface `Statement`
Throws:
  `SQLException`

### cancel

public void cancel() throws SQLException

Specified by:
  `cancel` in interface `Statement`
Throws:
  `SQLException`

### checkOpen

protected void checkOpen() throws SQLException

Throws:
  `SQLException`

### clearBatch

public void clearBatch() throws SQLException

Specified by:
  `clearBatch` in interface `Statement`
Throws:
  `SQLException`

### clearWarnings

public void clearWarnings() throws SQLException

Specified by:
  `clearWarnings` in interface `Statement`
Throws:
  `SQLException`

### close

public void close() throws SQLException
Close this DelegatingStatement, and close any ResultSets that were not explicitly closed.

Specified by:
  `close` in interface `AutoCloseable`
Specified by:
  `close` in interface `Statement`
Overrides:
  `close` in class `AbandonedTrace`
Throws:
  `SQLException` - Ignored here, for subclasses.

### closeOnCompletion

public void closeOnCompletion() throws SQLException

Specified by:
  `closeOnCompletion` in interface `Statement`
Throws:
  `SQLException`

### execute

public boolean execute(String sql) throws SQLException

Specified by:
  `execute` in interface `Statement`
Throws:
  `SQLException`

### execute

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

Specified by:
  `execute` in interface `Statement`
Throws:
  `SQLException`

### execute

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

Specified by:
  `execute` in interface `Statement`
Throws:
  `SQLException`

### execute

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

Specified by:
  `execute` in interface `Statement`
Throws:
  `SQLException`

### executeBatch

public int[] executeBatch() throws SQLException

Specified by:
  `executeBatch` in interface `Statement`
Throws:
  `SQLException`

### executeLargeBatch

public long[] executeLargeBatch() throws SQLException

Specified by:
  `executeLargeBatch` in interface `Statement`
Throws:
  `SQLException`
Since:
  2.5.0

### executeLargeUpdate

public long executeLargeUpdate(String sql) throws SQLException

Specified by:
  `executeLargeUpdate` in interface `Statement`
Throws:
  `SQLException`
Since:
  2.5.0

### executeLargeUpdate

public long executeLargeUpdate(String sql, int autoGeneratedKeys) throws SQLException

Specified by:
  `executeLargeUpdate` in interface `Statement`
Throws:
  `SQLException`
Since:
  2.5.0

### executeLargeUpdate

public long executeLargeUpdate(String sql, int[] columnIndexes) throws SQLException

Specified by:
  `executeLargeUpdate` in interface `Statement`
Throws:
  `SQLException`
Since:
  2.5.0

### executeLargeUpdate

public long executeLargeUpdate(String sql, String[] columnNames) throws SQLException

Specified by:
  `executeLargeUpdate` in interface `Statement`
Throws:
  `SQLException`
Since:
  2.5.0

### executeQuery

public ResultSet executeQuery(String sql) throws SQLException

Specified by:
  `executeQuery` in interface `Statement`
Throws:
  `SQLException`

### executeUpdate

public int executeUpdate(String sql) throws SQLException

Specified by:
  `executeUpdate` in interface `Statement`
Throws:
  `SQLException`

### executeUpdate

public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException

Specified by:
  `executeUpdate` in interface `Statement`
Throws:
  `SQLException`

### executeUpdate

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

Specified by:
  `executeUpdate` in interface `Statement`
Throws:
  `SQLException`

### executeUpdate

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

Specified by:
  `executeUpdate` in interface `Statement`
Throws:
  `SQLException`

### finalize

protected void finalize() throws Throwable

Overrides:
  `finalize` in class `Object`
Throws:
  `Throwable`

### getConnection

public Connection getConnection() throws SQLException

Specified by:
  `getConnection` in interface `Statement`
Throws:
  `SQLException`

### getConnectionInternal

protected DelegatingConnection<?> getConnectionInternal()

### getDelegate

public Statement getDelegate()
Returns my underlying `Statement`.

Returns:
  my underlying `Statement`.
See Also:
  - `getInnermostDelegate()`

### getFetchDirection

public int getFetchDirection() throws SQLException

Specified by:
  `getFetchDirection` in interface `Statement`
Throws:
  `SQLException`

### getFetchSize

public int getFetchSize() throws SQLException

Specified by:
  `getFetchSize` in interface `Statement`
Throws:
  `SQLException`

### getGeneratedKeys

public ResultSet getGeneratedKeys() throws SQLException

Specified by:
  `getGeneratedKeys` in interface `Statement`
Throws:
  `SQLException`

### getInnermostDelegate

public Statement getInnermostDelegate()
If my underlying `Statement` is not a `DelegatingStatement`, returns it, otherwise recursively invokes this method on my delegate.

Hence this method will return the first delegate that is not a `DelegatingStatement` or `null` when no non-`DelegatingStatement` delegate can be found by traversing this chain.

This method is useful when you may have nested `DelegatingStatement`s, and you want to make sure to obtain a "genuine" `Statement`.

Returns:
  The innermost delegate, may return null.
See Also:
  - `getDelegate()`

### getLargeMaxRows

public long getLargeMaxRows() throws SQLException

Specified by:
  `getLargeMaxRows` in interface `Statement`
Throws:
  `SQLException`
Since:
  2.5.0

### getLargeUpdateCount

public long getLargeUpdateCount() throws SQLException

Specified by:
  `getLargeUpdateCount` in interface `Statement`
Throws:
  `SQLException`
Since:
  2.5.0

### getMaxFieldSize

public int getMaxFieldSize() throws SQLException

Specified by:
  `getMaxFieldSize` in interface `Statement`
Throws:
  `SQLException`

### getMaxRows

public int getMaxRows() throws SQLException

Specified by:
  `getMaxRows` in interface `Statement`
Throws:
  `SQLException`

### getMoreResults

public boolean getMoreResults() throws SQLException

Specified by:
  `getMoreResults` in interface `Statement`
Throws:
  `SQLException`

### getMoreResults

public boolean getMoreResults(int current) throws SQLException

Specified by:
  `getMoreResults` in interface `Statement`
Throws:
  `SQLException`

### getQueryTimeout

public int getQueryTimeout() throws SQLException

Specified by:
  `getQueryTimeout` in interface `Statement`
Throws:
  `SQLException`

### getResultSet

public ResultSet getResultSet() throws SQLException

Specified by:
  `getResultSet` in interface `Statement`
Throws:
  `SQLException`

### getResultSetConcurrency

public int getResultSetConcurrency() throws SQLException

Specified by:
  `getResultSetConcurrency` in interface `Statement`
Throws:
  `SQLException`

### getResultSetHoldability

public int getResultSetHoldability() throws SQLException

Specified by:
  `getResultSetHoldability` in interface `Statement`
Throws:
  `SQLException`

### getResultSetType

public int getResultSetType() throws SQLException

Specified by:
  `getResultSetType` in interface `Statement`
Throws:
  `SQLException`

### getUpdateCount

public int getUpdateCount() throws SQLException

Specified by:
  `getUpdateCount` in interface `Statement`
Throws:
  `SQLException`

### getWarnings

public SQLWarning getWarnings() throws SQLException

Specified by:
  `getWarnings` in interface `Statement`
Throws:
  `SQLException`

### handleException

protected void handleException(SQLException e) throws SQLException

Throws:
  `SQLException`

### isClosed

public boolean isClosed() throws SQLException

Specified by:
  `isClosed` in interface `Statement`
Throws:
  `SQLException`

### isClosedInternal

protected boolean isClosedInternal()

### isCloseOnCompletion

public boolean isCloseOnCompletion() throws SQLException

Specified by:
  `isCloseOnCompletion` in interface `Statement`
Throws:
  `SQLException`

### isPoolable

public boolean isPoolable() throws SQLException

Specified by:
  `isPoolable` in interface `Statement`
Throws:
  `SQLException`

### isWrapperFor

public boolean isWrapperFor(Class<?> iface) throws SQLException

Specified by:
  `isWrapperFor` in interface `Wrapper`
Throws:
  `SQLException`

### passivate

public void passivate() throws SQLException

Throws:
  `SQLException` - thrown by the delegating statement.
Since:
  2.4.0 made public, was protected in 2.3.0.

### setClosedInternal

protected void setClosedInternal(boolean closed)

### setCursorName

public void setCursorName(String name) throws SQLException

Specified by:
  `setCursorName` in interface `Statement`
Throws:
  `SQLException`

### setDelegate

public void setDelegate(Statement statement)
Sets my delegate.

Parameters:
  `statement` - my delegate.

### setEscapeProcessing

public void setEscapeProcessing(boolean enable) throws SQLException

Specified by:
  `setEscapeProcessing` in interface `Statement`
Throws:
  `SQLException`

### setFetchDirection

public void setFetchDirection(int direction) throws SQLException

Specified by:
  `setFetchDirection` in interface `Statement`
Throws:
  `SQLException`

### setFetchSize

public void setFetchSize(int rows) throws SQLException

Specified by:
  `setFetchSize` in interface `Statement`
Throws:
  `SQLException`

### setLargeMaxRows

public void setLargeMaxRows(long max) throws SQLException

Specified by:
  `setLargeMaxRows` in interface `Statement`
Throws:
  `SQLException`
Since:
  2.5.0

### setMaxFieldSize

public void setMaxFieldSize(int max) throws SQLException

Specified by:
  `setMaxFieldSize` in interface `Statement`
Throws:
  `SQLException`

### setMaxRows

public void setMaxRows(int max) throws SQLException

Specified by:
  `setMaxRows` in interface `Statement`
Throws:
  `SQLException`

### setPoolable

public void setPoolable(boolean poolable) throws SQLException

Specified by:
  `setPoolable` in interface `Statement`
Throws:
  `SQLException`

### setQueryTimeout

public void setQueryTimeout(int seconds) throws SQLException

Specified by:
  `setQueryTimeout` in interface `Statement`
Throws:
  `SQLException`

### toString

public String toString()
Returns a String representation of this object.

Overrides:
  `toString` in class `Object`
Returns:
  String

### unwrap

public <T> T unwrap(Class<T> iface) throws SQLException

Specified by:
  `unwrap` in interface `Wrapper`
Throws:
  `SQLException`