# 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 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()`
  Activates this instance by delegating to the underlying statement.
  `void`
  `addBatch(String sql)`
  `void`
  `cancel()`
  `protected void`
  `checkOpen()`
  Checks whether this instance is closed and throws an exception if it is.
  `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()`
  Gets the internal connection.
  `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)`
  Delegates the exception to the internal connection if set, otherwise rethrows it.
  `boolean`
  `isClosed()`
  `protected boolean`
  `isClosedInternal()`
  Tests whether this instance is closed.
  `boolean`
  `isCloseOnCompletion()`
  `boolean`
  `isPoolable()`
  `boolean`
  `isWrapperFor(Class<?> iface)`
  `void`
  `passivate()`
  Passivates this instance by delegating to the underlying statement.
  `protected void`
  `setClosedInternal(boolean closed)`
  Sets the closed internal state.
  `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 AbandonedTrace

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

  ### Methods inherited from class Object

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

  ### Methods inherited from interface 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
    Activates this instance by delegating to the underlying statement.
    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
    Checks whether this instance is closed and throws an exception if it is.
    Throws:
      `SQLException` - Thrown if this instance is closed.

  - ### 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()
    Gets the internal connection.
    Returns:
      the internal connection.

  - ### 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
    Delegates the exception to the internal connection if set, otherwise rethrows it.
    Parameters:
      `e` - The exception to handle.
    Throws:
      `SQLException` - The given exception if not handled.

  - ### isClosed

    public boolean isClosed() throws SQLException
    Specified by:
      `isClosed` in interface `Statement`
    Throws:
      `SQLException`

  - ### isClosedInternal

    protected boolean isClosedInternal()
    Tests whether this instance is closed.
    Returns:
      whether this instance is closed.

  - ### 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
    Passivates this instance by delegating to the underlying statement.
    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)
    Sets the closed internal state.
    Parameters:
      `closed` - whether the instance is now 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`