Search in sources :

Example 1 with SqlOutputType

use of org.apache.camel.component.sql.SqlOutputType in project camel by apache.

the class ElsqlProducer method process.

@Override
public void process(final Exchange exchange) throws Exception {
    final Object data = exchange.getIn().getBody();
    final SqlParameterSource param = new ElsqlSqlMapSource(exchange, data);
    final String sql = elSql.getSql(elSqlName, new SpringSqlParams(param));
    LOG.debug("ElsqlProducer @{} using sql: {}", elSqlName, sql);
    // special for processing stream list (batch not supported)
    final SqlOutputType outputType = getEndpoint().getOutputType();
    if (outputType == SqlOutputType.StreamList) {
        processStreamList(exchange, sql, param);
        return;
    }
    log.trace("jdbcTemplate.execute: {}", sql);
    jdbcTemplate.execute(sql, param, new PreparedStatementCallback<Object>() {

        @Override
        public Object doInPreparedStatement(final PreparedStatement ps) throws SQLException, DataAccessException {
            ResultSet rs = null;
            try {
                boolean isResultSet = false;
                final int expected = ps.getParameterMetaData().getParameterCount();
                if (expected > 0 && batch) {
                    final String sqlForDefaultPreparedStamentStrategy = sql.replaceAll(":", ":\\?");
                    final String preparedQuery = sqlPrepareStatementStrategy.prepareQuery(sqlForDefaultPreparedStamentStrategy, getEndpoint().isAllowNamedParameters(), exchange);
                    final Iterator<?> iterator = exchange.getIn().getBody(Iterator.class);
                    while (iterator != null && iterator.hasNext()) {
                        final Object value = iterator.next();
                        final Iterator<?> i = sqlPrepareStatementStrategy.createPopulateIterator(sqlForDefaultPreparedStamentStrategy, preparedQuery, expected, exchange, value);
                        sqlPrepareStatementStrategy.populateStatement(ps, i, expected);
                        ps.addBatch();
                    }
                }
                // execute the prepared statement and populate the outgoing message
                if (batch) {
                    final int[] updateCounts = ps.executeBatch();
                    int total = 0;
                    for (final int count : updateCounts) {
                        total += count;
                    }
                    exchange.getIn().setHeader(SqlConstants.SQL_UPDATE_COUNT, total);
                } else {
                    isResultSet = ps.execute();
                    if (isResultSet) {
                        rs = ps.getResultSet();
                        // preserve headers first, so we can override the SQL_ROW_COUNT header
                        exchange.getOut().getHeaders().putAll(exchange.getIn().getHeaders());
                        final SqlOutputType outputType = getEndpoint().getOutputType();
                        log.trace("Got result list from query: {}, outputType={}", rs, outputType);
                        if (outputType == SqlOutputType.SelectList) {
                            final List<?> data = getEndpoint().queryForList(rs, true);
                            // for noop=true we still want to enrich with the row count header
                            if (getEndpoint().isNoop()) {
                                exchange.getOut().setBody(exchange.getIn().getBody());
                            } else if (getEndpoint().getOutputHeader() != null) {
                                exchange.getOut().setBody(exchange.getIn().getBody());
                                exchange.getOut().setHeader(getEndpoint().getOutputHeader(), data);
                            } else {
                                exchange.getOut().setBody(data);
                            }
                            exchange.getOut().setHeader(SqlConstants.SQL_ROW_COUNT, data.size());
                        } else if (outputType == SqlOutputType.SelectOne) {
                            final Object data = getEndpoint().queryForObject(rs);
                            if (data != null) {
                                // for noop=true we still want to enrich with the row count header
                                if (getEndpoint().isNoop()) {
                                    exchange.getOut().setBody(exchange.getIn().getBody());
                                } else if (getEndpoint().getOutputHeader() != null) {
                                    exchange.getOut().setBody(exchange.getIn().getBody());
                                    exchange.getOut().setHeader(getEndpoint().getOutputHeader(), data);
                                } else {
                                    exchange.getOut().setBody(data);
                                }
                                exchange.getOut().setHeader(SqlConstants.SQL_ROW_COUNT, 1);
                            } else {
                                if (getEndpoint().isNoop()) {
                                    exchange.getOut().setBody(exchange.getIn().getBody());
                                } else if (getEndpoint().getOutputHeader() != null) {
                                    exchange.getOut().setBody(exchange.getIn().getBody());
                                }
                                exchange.getOut().setHeader(SqlConstants.SQL_ROW_COUNT, 0);
                            }
                        } else {
                            throw new IllegalArgumentException("Invalid outputType=" + outputType);
                        }
                    } else {
                        // if we are here, there isResultSet is false. This can happen only if we are doing an update operation or there is no result.
                        // we can simply add the updateCount in this case.
                        exchange.getOut().setHeader(SqlConstants.SQL_UPDATE_COUNT, ps.getUpdateCount());
                    }
                }
            } finally {
                closeResultSet(rs);
            }
            return null;
        }
    });
}
Also used : SQLException(java.sql.SQLException) PreparedStatement(java.sql.PreparedStatement) SqlOutputType(org.apache.camel.component.sql.SqlOutputType) SqlParameterSource(org.springframework.jdbc.core.namedparam.SqlParameterSource) ResultSet(java.sql.ResultSet) JdbcUtils.closeResultSet(org.springframework.jdbc.support.JdbcUtils.closeResultSet) Iterator(java.util.Iterator) ResultSetIterator(org.apache.camel.component.sql.ResultSetIterator) List(java.util.List) DataAccessException(org.springframework.dao.DataAccessException) SpringSqlParams(com.opengamma.elsql.SpringSqlParams)

Aggregations

SpringSqlParams (com.opengamma.elsql.SpringSqlParams)1 PreparedStatement (java.sql.PreparedStatement)1 ResultSet (java.sql.ResultSet)1 SQLException (java.sql.SQLException)1 Iterator (java.util.Iterator)1 List (java.util.List)1 ResultSetIterator (org.apache.camel.component.sql.ResultSetIterator)1 SqlOutputType (org.apache.camel.component.sql.SqlOutputType)1 DataAccessException (org.springframework.dao.DataAccessException)1 SqlParameterSource (org.springframework.jdbc.core.namedparam.SqlParameterSource)1 JdbcUtils.closeResultSet (org.springframework.jdbc.support.JdbcUtils.closeResultSet)1