Class SqlStatement
- java.lang.Object
-
- 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:
- call the
handle(Throwable)
method if one of the contained objects (say theResultSet
) gives an error; - call the
close()
method if all operations complete successfully. - increment the
rowCount
field each time a row is fetched.
The
close()
method is idempotent. You are welcome to call it more than once.SqlStatement is not thread-safe.
- Since:
- 2.3
- Author:
- jhyde
- call the
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interface
SqlStatement.Accessor
static class
SqlStatement.MyDelegatingInvocationHandler
Reflectively implements theResultSet
interface by routing method calls to the result set inside aSqlStatement
.static class
SqlStatement.StatementLocus
static class
SqlStatement.Type
The approximate JDBC type of a column.
-
Field Summary
Fields Modifier and Type Field Description int
rowCount
-
Constructor Summary
Constructors Constructor Description SqlStatement(DataSource dataSource, String sql, List<SqlStatement.Type> types, int maxRows, int firstRowOrdinal, Locus locus, int resultSetType, int resultSetConcurrency, Util.Functor1<Void,Statement> callback)
Creates a SqlStatement.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
close()
Closes all resources (statement, result set) held by this SqlStatement.protected Dialect
createDialect()
For testsvoid
execute()
Executes the current statement, and handles any SQLException.List<SqlStatement.Accessor>
getAccessors()
protected Dialect
getDialect(RolapSchema schema)
Retrieves dialect from schema or attempts to create it in case it is nullResultSet
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.List<SqlStatement.Type>
guessTypes()
RuntimeException
handle(Throwable e)
Handles an exception thrown from the ResultSet, implicitly callsclose()
, and returns an exception which includes the full stack, including a description of the high-level operation.
-
-
-
Constructor Detail
-
SqlStatement
public SqlStatement(DataSource dataSource, String sql, List<SqlStatement.Type> types, int maxRows, int firstRowOrdinal, Locus locus, int resultSetType, int resultSetConcurrency, Util.Functor1<Void,Statement> callback)
Creates a SqlStatement.- Parameters:
dataSource
- Data sourcesql
- SQLtypes
- 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 columnmaxRows
- Maximum rows; <= 0 means no maximumfirstRowOrdinal
- Ordinal of first row to skip to; <= 0 do not skiplocus
- Execution context of this statementresultSetType
- Result set typeresultSetConcurrency
- 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.This method is idempotent.
-
getResultSet
public ResultSet getResultSet()
-
handle
public RuntimeException handle(Throwable e)
Handles an exception thrown from the ResultSet, implicitly callsclose()
, and returns an exception which includes the full stack, including a description of the high-level operation.- Parameters:
e
- Exception- Returns:
- Runtime exception
-
guessTypes
public List<SqlStatement.Type> guessTypes() throws SQLException
- Throws:
SQLException
-
getDialect
protected Dialect getDialect(RolapSchema schema)
Retrieves dialect from schema or attempts to create it in case it is null- Parameters:
schema
- rolap schema- Returns:
- database dialect
-
createDialect
protected Dialect createDialect()
For tests
-
getAccessors
public List<SqlStatement.Accessor> getAccessors()
-
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
-
-