Hi

Ah yeah that seems resonable. You are welcome to log a JIRA and attach
a patch or do a github PR

On Fri, Apr 1, 2016 at 2:01 PM, Thomas Bender
<[email protected]> wrote:
> Hi Claus,
>
> Sorry about missing that out:
> Camel 2.17.0
> Spring 4.2.5.RELEASE
>
> Thomas
>
>
>
> ________________________________________
> Von: Claus Ibsen [[email protected]]
> Gesendet: Freitag, 1. April 2016 13:45
> An: [email protected]
> Betreff: Re: [CAMEL] Sql-component (producer) removes body when 
> &outputHeader=myHeader is used an result is empty
>
> What version of Camel do you use?
>
> On Fri, Apr 1, 2016 at 1:12 PM, Thomas Bender
> <[email protected]> wrote:
>> Hi,
>>
>> I have an issue with the camel sql-component.
>>
>> I use the options outputHeader=myHeader and outputType=SelectOne. When the 
>> query returns no result, the body of the Exchange is set to null instead of 
>> preserved what I would expect when using outputHeader.
>>
>> In my opinion the problem is in lines 175-185 of SqlProducer.java that does 
>> not set the body in case the data is null (missing else block). As I am new 
>> to Camel, I don't know if this was intended for a special case.
>>
>> // Code section
>>
>> if (data != null) { // <--- Missing the else
>> // 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);
>> }
>>
>>
>> --------
>> following could be added (untested)
>>
>> else { // if data == null
>> 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);
>> }
>>
>>
>>
>> --------------------------
>> Following testcase:
>>
>> import org.apache.camel.EndpointInject;
>> import org.apache.camel.Produce;
>> import org.apache.camel.ProducerTemplate;
>> import org.apache.camel.builder.RouteBuilder;
>> import org.apache.camel.component.mock.MockEndpoint;
>> import org.apache.camel.spring.javaconfig.SingleRouteCamelConfiguration;
>> import org.apache.camel.test.spring.CamelSpringDelegatingTestContextLoader;
>> import org.apache.camel.test.spring.CamelSpringJUnit4ClassRunner;
>> import org.junit.Test;
>> import org.junit.runner.RunWith;
>> import org.springframework.context.annotation.Bean;
>> import org.springframework.context.annotation.Configuration;
>> import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
>> import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
>> import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
>> import org.springframework.test.annotation.DirtiesContext;
>> import org.springframework.test.context.ContextConfiguration;
>>
>> @RunWith(CamelSpringJUnit4ClassRunner.class)
>> @ContextConfiguration(classes = { CamelSqlComponentTest.TestConfig.class }, 
>> loader = CamelSpringDelegatingTestContextLoader.class)
>> public class CamelSqlComponentTest {
>>
>>         @EndpointInject(uri = "mock:result")
>>         protected MockEndpoint resultEndpoint;
>>
>>         @Produce(uri = "direct:start")
>>         protected ProducerTemplate template;
>>
>>         @Test
>>         @DirtiesContext
>>         public void testSqlEndpoint() throws Exception {
>>
>>                 String expectedBody = "body";
>>                 resultEndpoint.expectedBodiesReceived(expectedBody);
>>                 template.sendBody(expectedBody);
>>                 resultEndpoint.assertIsSatisfied();
>>
>>         }
>>
>>         @Configuration
>>         public static class TestConfig extends SingleRouteCamelConfiguration 
>> {
>>
>>                 @Bean(destroyMethod = "shutdown", name = "dataSource")
>>                 public EmbeddedDatabase dataSource() {
>>                         return new 
>> EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2)
>>                                         
>> .addScript("db-camel-schema.sql").addScript("db-camel-data.sql").build();
>>                 }
>>
>>                 @Bean
>>                 @Override
>>                 public RouteBuilder route() {
>>                         return new RouteBuilder() {
>>                                 @Override
>>                                 public void configure() throws Exception {
>>                                         from("direct:start")
>>                                                         .to("sql:select id 
>> from mytable where 1 = 
>> 2?dataSource=dataSource&outputHeader=myHeader&outputType=SelectOne")
>>                                                         
>> .log("${body}").to("mock:result");
>>                                 }
>>                         };
>>                 }
>>         }
>> }
>>
>> --------------------------
>> db-camel-data.sql
>>
>> insert into MYTABLE (ID, SUBJECT) VALUES (1, 'subject');
>>
>> --------------------------
>> db-camel-schema.sql
>>
>> CREATE TABLE MYTABLE (
>>         ID  INT PRIMARY KEY,
>>         SUBJECT         VARCHAR(255)
>> );
>>
>> Have a nice weekend.
>> Thomas
>>
>
>
>
> --
> Claus Ibsen
> -----------------
> http://davsclaus.com @davsclaus
> Camel in Action 2: https://www.manning.com/ibsen2



-- 
Claus Ibsen
-----------------
http://davsclaus.com @davsclaus
Camel in Action 2: https://www.manning.com/ibsen2

Reply via email to