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

    All Methods Instance Methods Concrete Methods
    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 Detail

    - #### 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:
        `statement` - the `Statement` to delegate all calls to.
        `connection` - the `DelegatingConnection` that created this statement.

  - ### Method Detail

    - #### 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.
      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`