diff --git a/app/connector/sql/src/main/java/io/syndesis/connector/sql/customizer/SqlStartConnectorCustomizer.java b/app/connector/sql/src/main/java/io/syndesis/connector/sql/customizer/SqlStartConnectorCustomizer.java index dd4887381ea..f1c63c30130 100644 --- a/app/connector/sql/src/main/java/io/syndesis/connector/sql/customizer/SqlStartConnectorCustomizer.java +++ b/app/connector/sql/src/main/java/io/syndesis/connector/sql/customizer/SqlStartConnectorCustomizer.java @@ -23,6 +23,7 @@ import javax.sql.DataSource; +import io.syndesis.connector.sql.common.DbMetaDataHelper; import io.syndesis.connector.sql.common.JSONBeanUtil; import io.syndesis.connector.sql.common.SqlStatementMetaData; import io.syndesis.connector.sql.common.SqlStatementParser; @@ -75,11 +76,15 @@ private void doAfterProducer(Exchange exchange) { } private void init(Map options) { - if (isInit) { + if (!isInit) { final String sql = ConnectorOptions.extractOption(options, "query"); final DataSource dataSource = ConnectorOptions.extractOptionAsType(options, "dataSource", DataSource.class); try (Connection connection = dataSource.getConnection()) { - SqlStatementMetaData statementInfo = new SqlStatementParser(connection, null, sql).parse(); + DbMetaDataHelper dbHelper = new DbMetaDataHelper(connection); + final String defaultSchema = dbHelper.getDefaultSchema(ConnectorOptions.extractOption(options, "user", "")); + final String schemaPattern = ConnectorOptions.extractOption(options, "schema", defaultSchema); + + SqlStatementMetaData statementInfo = new SqlStatementParser(connection, schemaPattern, sql).parse(); if (statementInfo.getAutoIncrementColumnName() != null) { isRetrieveGeneratedKeys = true; autoIncrementColumnName = statementInfo.getAutoIncrementColumnName(); diff --git a/app/connector/sql/src/test/java/io/syndesis/connector/sql/SqlStartConnectorTest.java b/app/connector/sql/src/test/java/io/syndesis/connector/sql/SqlStartConnectorTest.java index 47a18ef5a15..2ef71976ec5 100644 --- a/app/connector/sql/src/test/java/io/syndesis/connector/sql/SqlStartConnectorTest.java +++ b/app/connector/sql/src/test/java/io/syndesis/connector/sql/SqlStartConnectorTest.java @@ -15,20 +15,17 @@ */ package io.syndesis.connector.sql; +import java.sql.SQLException; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.Properties; -import java.util.stream.Collectors; import io.syndesis.common.model.integration.Step; +import io.syndesis.connector.sql.common.DbEnum; import io.syndesis.connector.sql.common.JSONBeanUtil; import io.syndesis.connector.sql.util.SqlConnectorTestSupport; -import org.apache.camel.Exchange; -import org.apache.camel.ProducerTemplate; -import org.apache.camel.component.mock.MockEndpoint; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -40,10 +37,12 @@ public class SqlStartConnectorTest extends SqlConnectorTestSupport { private final String sqlQuery; private final List> expectedResults; + private final Map parameters; - public SqlStartConnectorTest(String sqlQuery, List> expectedResults) { + public SqlStartConnectorTest(String sqlQuery, List> expectedResults, Map parameters) { this.sqlQuery = sqlQuery; this.expectedResults = expectedResults; + this.parameters = parameters; } @Override @@ -53,9 +52,38 @@ protected List cleanupStatements() { @Override protected List setupStatements() { - return Arrays.asList("CREATE TABLE NAME (id INTEGER PRIMARY KEY, firstName VARCHAR(255), lastName VARCHAR(255))", - "INSERT INTO NAME VALUES (1, 'Joe', 'Jackson')", - "INSERT INTO NAME VALUES (2, 'Roger', 'Waters')"); + String dbProductName = null; + try { + dbProductName = db.connection.getMetaData().getDatabaseProductName(); + } catch (SQLException e) { + e.printStackTrace(); + Assert.fail(e.getMessage()); + } + if (DbEnum.POSTGRESQL.equals(DbEnum.fromName(dbProductName))) { + return Arrays.asList("CREATE TABLE NAME (" + + "ID SERIAL PRIMARY KEY, " + + "firstName VARCHAR(255), lastName VARCHAR(255))", + "INSERT INTO NAME (firstname, lastname) VALUES ('Joe', 'Jackson')", + "INSERT INTO NAME (firstname, lastname) VALUES ('Roger', 'Waters')"); + } else if (DbEnum.MYSQL.equals(DbEnum.fromName(dbProductName))) { + return Arrays.asList("CREATE TABLE NAME (" + + "ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, " + + "firstName VARCHAR(255), lastName VARCHAR(255))", + "INSERT INTO NAME (firstname, lastname) VALUES ('Joe', 'Jackson')", + "INSERT INTO NAME (firstname, lastname) VALUES ('Roger', 'Waters')"); + } else if (DbEnum.APACHE_DERBY.equals(DbEnum.fromName(dbProductName))) { + return Arrays.asList("CREATE TABLE NAME (ID INTEGER NOT NULL " + + "GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), " + + "firstName VARCHAR(255), lastName VARCHAR(255))", + "INSERT INTO NAME (firstname, lastname) VALUES ('Joe', 'Jackson')", + "INSERT INTO NAME (firstname, lastname) VALUES ('Roger', 'Waters')"); + } else { + return Arrays.asList("CREATE TABLE NAME (" + + "ID NUMBER GENERATED ALWAYS AS IDENTITY, " + + "firstName VARCHAR(255), lastName VARCHAR(255))", + "INSERT INTO NAME (firstname, lastname) VALUES ('Joe', 'Jackson')", + "INSERT INTO NAME (firstname, lastname) VALUES ('Roger', 'Waters')"); + } } @Override @@ -85,11 +113,16 @@ public static Collection data() { return Arrays.asList(new Object[][] { { "SELECT * FROM NAME ORDER BY id", Arrays.asList(Collections.singletonMap("ID", new String[] { "1", "2" }), Collections.singletonMap("FIRSTNAME", new String[] { "Joe", "Roger" }), - Collections.singletonMap("LASTNAME", new String[] { "Jackson", "Waters" }))}, + Collections.singletonMap("LASTNAME", new String[] { "Jackson", "Waters" })), + Collections.emptyMap()}, { "SELECT * FROM NAME WHERE id = 2", Arrays.asList(Collections.singletonMap("ID", new String[] { "2" }), Collections.singletonMap("FIRSTNAME", new String[] { "Roger" }), - Collections.singletonMap("LASTNAME", new String[] { "Waters" }))}, - { "SELECT * FROM NAME WHERE id = 99", Collections.emptyList()} + Collections.singletonMap("LASTNAME", new String[] { "Waters" })), + Collections.emptyMap()}, + { "SELECT * FROM NAME WHERE id = 99", Collections.emptyList(), Collections.emptyMap()}, + { "INSERT INTO NAME (firstname, lastname) VALUES ('Kurt', 'Cobain')", + Collections.singletonList(Collections.singletonMap("ID", new String[]{"3"})), + Collections.emptyMap()} }); } @@ -99,26 +132,22 @@ public static Collection data() { @Test public void sqlStartConnectorTest() throws Exception { - MockEndpoint mock = context.getEndpoint("mock:result", MockEndpoint.class); - mock.expectedMessageCount(1); - - ProducerTemplate template = context.createProducerTemplate(); - template.sendBody("direct:start", null); - mock.assertIsSatisfied(); - - Exchange exchange = mock.getExchanges().get(0); - List body = exchange.getIn().getBody(List.class); - List jsonBeans = body.stream() - .map(Object::toString) - .map(JSONBeanUtil::parsePropertiesFromJSONBean) - .collect(Collectors.toList()); + String body; + if (parameters.isEmpty()) { + body = null; + } else { + body = JSONBeanUtil.toJSONBean(parameters); + } + @SuppressWarnings("unchecked") + List jsonBeans = template.requestBody("direct:start", body, List.class); + Assert.assertEquals(expectedResults.isEmpty(), jsonBeans.isEmpty()); for (Map result : expectedResults) { for (Map.Entry resultEntry : result.entrySet()) { - validateProperty(jsonBeans, resultEntry.getKey(), resultEntry.getValue()); + validateJson(jsonBeans, resultEntry.getKey(), resultEntry.getValue()); } } }