mondrian.rolap
Class SqlStatement

java.lang.Object
  extended by mondrian.rolap.SqlStatement

public class SqlStatement
extends Object

SqlStatement contains a SQL statement and associated resources throughout its lifetime.

The goal of SqlStatement is to make tracing, error-handling and resource-management easier. None of the methods throws a SQLException; if an error occurs in one of the methods, the method wraps the exception in a RuntimeException describing the high-level operation, logs that the operation failed, and throws that RuntimeException.

If methods succeed, the method generates lifecycle logging such as the elapsed time and number of rows fetched.

There are a few obligations on the caller. The caller must:

The close() method is idempotent. You are welcome to call it more than once.

SqlStatement is not thread-safe.

Since:
2.3
Author:
jhyde

Nested Class Summary
static interface SqlStatement.Accessor
           
static class SqlStatement.MyDelegatingInvocationHandler
          Reflectively implements the ResultSet interface by routing method calls to the result set inside a SqlStatement.
static class SqlStatement.StatementLocus
           
static class SqlStatement.Type
          The approximate JDBC type of a column.
 
Field Summary
 int rowCount
           
 
Constructor Summary
SqlStatement(DataSource dataSource, String sql, List<SqlStatement.Type> types, int maxRows, int firstRowOrdinal, Locus locus, int resultSetType, int resultSetConcurrency)
          Creates a SqlStatement.
 
Method Summary
 void close()
          Closes all resources (statement, result set) held by this SqlStatement.
 void execute()
          Executes the current statement, and handles any SQLException.
 List<SqlStatement.Accessor> getAccessors()
           
 ResultSet getResultSet()
           
 ResultSet getWrappedResultSet()
          Returns the result set in a proxy which automatically closes this SqlStatement (and hence also the statement and result set) when the result set is closed.
static SqlStatement.Type guessType(SqlStatement.Type suggestedType, ResultSetMetaData metaData, int i)
          Chooses the most appropriate type for accessing the values of a column in a result set.
 List<SqlStatement.Type> guessTypes()
           
 RuntimeException handle(Throwable e)
          Handles an exception thrown from the ResultSet, implicitly calls close(), and returns an exception which includes the full stack, including a description of the high-level operation.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

rowCount

public int rowCount
Constructor Detail

SqlStatement

public SqlStatement(DataSource dataSource,
                    String sql,
                    List<SqlStatement.Type> types,
                    int maxRows,
                    int firstRowOrdinal,
                    Locus locus,
                    int resultSetType,
                    int resultSetConcurrency)
Creates a SqlStatement.

Parameters:
dataSource - Data source
sql - SQL
types - Suggested types of columns, or null; if present, must have one element for each SQL column; each not-null entry overrides deduced JDBC type of the column
maxRows - Maximum rows; <= 0 means no maximum
firstRowOrdinal - Ordinal of first row to skip to; <= 0 do not skip
locus - Execution context of this statement
resultSetType - Result set type
resultSetConcurrency - Result set concurrency
Method Detail

execute

public void execute()
Executes the current statement, and handles any SQLException.


close

public void close()
Closes all resources (statement, result set) held by this SqlStatement.

If any of them fails, wraps them in a RuntimeException describing the high-level operation which this statement was performing. No further error-handling is required to produce a descriptive stack trace, unless you want to absorb the error.


getResultSet

public ResultSet getResultSet()

handle

public RuntimeException handle(Throwable e)
Handles an exception thrown from the ResultSet, implicitly calls close(), and returns an exception which includes the full stack, including a description of the high-level operation.

Parameters:
e - Exception
Returns:
Runtime exception

guessType

public static SqlStatement.Type guessType(SqlStatement.Type suggestedType,
                                          ResultSetMetaData metaData,
                                          int i)
                                   throws SQLException
Chooses the most appropriate type for accessing the values of a column in a result set.

NOTE: It is possible that this method is driver-dependent. If this is the case, move it to Dialect.

Parameters:
suggestedType - Type suggested by Level.internalType attribute
metaData - Result set metadata
i - Column ordinal (0-based)
Returns:
Best client type
Throws:
SQLException - on error

guessTypes

public List<SqlStatement.Type> guessTypes()
                                   throws SQLException
Throws:
SQLException

getAccessors

public List<SqlStatement.Accessor> getAccessors()
                                         throws SQLException
Throws:
SQLException

getWrappedResultSet

public ResultSet getWrappedResultSet()
Returns the result set in a proxy which automatically closes this SqlStatement (and hence also the statement and result set) when the result set is closed.

This helps to prevent connection leaks. The caller still has to remember to call ResultSet.close(), of course.

Returns:
Wrapped result set

Get Mondrian at SourceForge.net. Fast, secure and free Open Source software downloads