DatabaseMeta databaseMeta = ThinModelConverter.convertToLegacy( sqlModel.getId(), sqlModel.getDatasource() );
// this connection needs closed
boolean closeConnection = true;
DatabaseMeta activeDatabaseMeta = getActiveDatabaseMeta( databaseMeta );
SQLConnection sqlConnection = getConnection( activeDatabaseMeta );
String sql = null;
try {
if ( ( sqlConnection == null ) || !sqlConnection.initialized() ) {
logger.error( Messages.getInstance().getErrorString( "SQLBaseComponent.ERROR_0007_NO_CONNECTION" ) ); //$NON-NLS-1$
// TODO: throw an exception up the stack.
return null;
}
// Make sure all parameters are of the correct type.
// Fix for PDB-1753
for ( Parameter param : queryObject.getParameters() ) {
String pName = param.getName();
if ( parameters.containsKey( pName ) && !parameters.get( pName ).getClass().isArray() ) {
parameters.put( pName, this.convertParameterValue( param, parameters.get( pName ) ) );
}
}
MappedQuery mappedQuery = null;
try {
SqlGenerator sqlGenerator = createSqlGenerator();
mappedQuery =
sqlGenerator.generateSql( queryObject, LocaleHelper.getLocale().toString(), getMetadataDomainRepository(),
activeDatabaseMeta, parameters, true );
} catch ( Exception e ) {
throw new RuntimeException( e.getLocalizedMessage(), e );
}
Integer timeout = getTimeout();
if ( timeout != null && timeout >= 0 ) {
sqlConnection.setQueryTimeout( timeout );
}
Integer maxRows = getMaxRows();
if ( maxRows != null && maxRows >= 0 ) {
sqlConnection.setMaxRows( maxRows );
}
Boolean readOnly = isReadOnly();
if ( readOnly != null && readOnly.booleanValue() ) {
sqlConnection.setReadOnly( true );
}
IPentahoResultSet localResultSet = null;
sql = mappedQuery.getQuery();
if ( logger.isDebugEnabled() ) {
logger.debug( "SQL: " + sql ); //$NON-NLS-1$
}
if ( getDoQueryLog() ) {
logger.info( "SQL: " + sql ); //$NON-NLS-1$
}
// populate prepared sql params
List<Object> sqlParams = null;
if ( mappedQuery.getParamList() != null ) {
sqlParams = new ArrayList<Object>();
for ( String param : mappedQuery.getParamList() ) {
Object sqlParam = parameters.get( param );
// lets see if the parameter is a multi valued param
if ( sqlParam instanceof Object[] ) {
Object[] multivaluedParamValues = (Object[]) sqlParam;
for ( Object p : multivaluedParamValues ) {
sqlParams.add( p );
}
} else {
sqlParams.add( sqlParam );
}
}
}
try {
if ( !isForwardOnly() ) {
if ( sqlParams != null ) {
localResultSet = sqlConnection.prepareAndExecuteQuery( sql, sqlParams );
} else {
localResultSet = sqlConnection.executeQuery( sql );
}
} else {
if ( sqlParams != null ) {
localResultSet =
sqlConnection.prepareAndExecuteQuery( sql, sqlParams, SQLConnection.RESULTSET_FORWARDONLY,
SQLConnection.CONCUR_READONLY );
} else {
localResultSet =
sqlConnection.executeQuery( sql, SQLConnection.RESULTSET_FORWARDONLY, SQLConnection.CONCUR_READONLY );
}
}
IPentahoMetaData metadata = mappedQuery.generateMetadata( localResultSet.getMetaData() );
( (SQLResultSet) localResultSet ).setMetaData( metadata );
closeConnection = false;
} catch ( Exception e ) {
logger.error( Messages.getInstance().getErrorString(
"SqlMetadataQueryExec.ERROR_0002_ERROR_EXECUTING_QUERY", e.getLocalizedMessage(), sql ) ); //$NON-NLS-1$
logger.debug( "error", e ); //$NON-NLS-1$
return null;
}
return localResultSet;
} finally {
if ( closeConnection && sqlConnection != null ) {
sqlConnection.close();
}
}
}