ARTEMIS-1653 Allow database tables to be created externally (cherry picked from commit eab498456762c3df0f786b1f9ae4e372fdbbfa32)
Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/af15fc43 Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/af15fc43 Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/af15fc43 Branch: refs/heads/1.x Commit: af15fc43c663977be3cf2f82865936e3f5d02cda Parents: 9b534f8 Author: Niels Lippke <[email protected]> Authored: Sun Jan 28 17:53:35 2018 +0100 Committer: Clebert Suconic <[email protected]> Committed: Wed Apr 18 09:53:17 2018 -0400 ---------------------------------------------------------------------- .../jdbc/store/drivers/AbstractJDBCDriver.java | 30 +++++++----- .../server/impl/jdbc/JdbcLeaseLockTest.java | 33 ++++++++++++- .../core/server/impl/jdbc/TestJDBCDriver.java | 50 ++++++++++++++++++++ 3 files changed, 101 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/af15fc43/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/drivers/AbstractJDBCDriver.java ---------------------------------------------------------------------- diff --git a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/drivers/AbstractJDBCDriver.java b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/drivers/AbstractJDBCDriver.java index d34b31f..b0be3ae 100644 --- a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/drivers/AbstractJDBCDriver.java +++ b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/drivers/AbstractJDBCDriver.java @@ -110,7 +110,7 @@ public abstract class AbstractJDBCDriver { protected abstract void createSchema() throws SQLException; protected final void createTable(String... schemaSqls) throws SQLException { - createTableIfNotExists(connection, sqlProvider.getTableName(), schemaSqls); + createTableIfNotExists(sqlProvider.getTableName(), schemaSqls); } private void connect() throws SQLException { @@ -175,9 +175,7 @@ public abstract class AbstractJDBCDriver { } } - private static void createTableIfNotExists(Connection connection, - String tableName, - String... sqls) throws SQLException { + private void createTableIfNotExists(String tableName, String... sqls) throws SQLException { logger.tracef("Validating if table %s didn't exist before creating", tableName); try { connection.setAutoCommit(false); @@ -190,17 +188,27 @@ public abstract class AbstractJDBCDriver { if (sqlWarning != null) { logger.warn(JDBCUtils.appendSQLExceptionDetails(new StringBuilder(), sqlWarning)); } - try (Statement statement = connection.createStatement()) { - for (String sql : sqls) { - statement.executeUpdate(sql); - final SQLWarning statementSqlWarning = statement.getWarnings(); - if (statementSqlWarning != null) { - logger.warn(JDBCUtils.appendSQLExceptionDetails(new StringBuilder(), statementSqlWarning, sql)); - } + } else { + try (Statement statement = connection.createStatement(); + ResultSet cntRs = statement.executeQuery(sqlProvider.getCountJournalRecordsSQL())) { + if (rs.next() && rs.getInt(1) > 0) { + logger.tracef("Table %s did exist but is not empty. Skipping initialization.", tableName); + } else { + sqls = Arrays.copyOfRange(sqls, 1, sqls.length); + } + } + } + try (Statement statement = connection.createStatement()) { + for (String sql : sqls) { + statement.executeUpdate(sql); + final SQLWarning statementSqlWarning = statement.getWarnings(); + if (statementSqlWarning != null) { + logger.warn(JDBCUtils.appendSQLExceptionDetails(new StringBuilder(), statementSqlWarning, sql)); } } } } + connection.commit(); } catch (SQLException e) { final String sqlStatements = Stream.of(sqls).collect(Collectors.joining("\n")); http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/af15fc43/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcLeaseLockTest.java ---------------------------------------------------------------------- diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcLeaseLockTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcLeaseLockTest.java index 3c8de45..2ca08d4 100644 --- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcLeaseLockTest.java +++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcLeaseLockTest.java @@ -18,6 +18,8 @@ package org.apache.activemq.artemis.core.server.impl.jdbc; import java.sql.SQLException; +import java.util.Arrays; +import java.util.List; import java.util.UUID; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -33,13 +35,31 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +@RunWith(Parameterized.class) public class JdbcLeaseLockTest extends ActiveMQTestBase { private JdbcSharedStateManager jdbcSharedStateManager; private DatabaseStorageConfiguration dbConf; private SQLProvider sqlProvider; + @Parameterized.Parameters(name = "create_tables_prior_test") + public static List<Object[]> data() { + return Arrays.asList(new Object[][] { + {true, null}, + {false, null} + }); + } + + @Parameter(0) + public boolean withExistingTable; + @Parameter(1) + public Object result; + + private LeaseLock lock() { return lock(dbConf.getJdbcLockExpirationMillis()); } @@ -59,12 +79,23 @@ public class JdbcLeaseLockTest extends ActiveMQTestBase { } @Before - public void createLockTable() { + public void createLockTable() throws Exception { dbConf = createDefaultDatabaseStorageConfiguration(); sqlProvider = JDBCUtils.getSQLProvider( dbConf.getJdbcDriverClassName(), dbConf.getNodeManagerStoreTableName(), SQLProvider.DatabaseStoreType.NODE_MANAGER); + + if (withExistingTable) { + TestJDBCDriver testDriver = TestJDBCDriver + .usingConnectionUrl( + dbConf.getJdbcConnectionUrl(), + dbConf.getJdbcDriverClassName(), + sqlProvider); + testDriver.start(); + testDriver.stop(); + } + jdbcSharedStateManager = JdbcSharedStateManager .usingConnectionUrl( UUID.randomUUID().toString(), http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/af15fc43/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/jdbc/TestJDBCDriver.java ---------------------------------------------------------------------- diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/jdbc/TestJDBCDriver.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/jdbc/TestJDBCDriver.java new file mode 100644 index 0000000..52b497a --- /dev/null +++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/jdbc/TestJDBCDriver.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.activemq.artemis.core.server.impl.jdbc; + +import java.sql.SQLException; + +import org.apache.activemq.artemis.jdbc.store.drivers.AbstractJDBCDriver; +import org.apache.activemq.artemis.jdbc.store.sql.SQLProvider; + +public class TestJDBCDriver extends AbstractJDBCDriver { + + + public static TestJDBCDriver usingConnectionUrl( + String jdbcConnectionUrl, + String jdbcDriverClass, + SQLProvider provider) { + TestJDBCDriver driver = new TestJDBCDriver(); + driver.setSqlProvider(provider); + driver.setJdbcConnectionUrl(jdbcConnectionUrl); + driver.setJdbcDriverClass(jdbcDriverClass); + return driver; + } + + @Override + protected void prepareStatements() throws SQLException { + } + + @Override + protected void createSchema() throws SQLException { + try { + connection.createStatement().execute(sqlProvider.createNodeManagerStoreTableSQL()); + } catch (SQLException e) { + } + } + +}
