/* * 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.jdbc.store.drivers; import java.sql.SQLException; import org.apache.activemq.artemis.jdbc.store.drivers.derby.DerbySQLProvider; import org.apache.activemq.artemis.jdbc.store.drivers.mysql.MySQLSQLProvider; import org.apache.activemq.artemis.jdbc.store.drivers.oracle.Oracle12CSQLProvider; import org.apache.activemq.artemis.jdbc.store.drivers.postgres.PostgresSQLProvider; import org.apache.activemq.artemis.jdbc.store.sql.GenericSQLProvider; import org.apache.activemq.artemis.jdbc.store.sql.SQLProvider; import org.jboss.logging.Logger; public class JDBCUtils { private static final Logger logger = Logger.getLogger(JDBCUtils.class); public static SQLProvider.Factory getSQLProviderFactory(String url) { SQLProvider.Factory factory; if (url.contains("derby")) { logger.tracef("getSQLProvider Returning Derby SQL provider for url::%s", url); factory = new DerbySQLProvider.Factory(); } else if (url.contains("postgres")) { logger.tracef("getSQLProvider Returning postgres SQL provider for url::%s", url); factory = new PostgresSQLProvider.Factory(); } else if (url.contains("mysql")) { logger.tracef("getSQLProvider Returning mysql SQL provider for url::%s", url); factory = new MySQLSQLProvider.Factory(); } else if (url.contains("oracle")) { logger.tracef("getSQLProvider Returning Oracle12C SQL provider for url::%s", url); factory = new Oracle12CSQLProvider.Factory(); } else { logger.tracef("getSQLProvider Returning generic SQL provider for url::%s", url); factory = new GenericSQLProvider.Factory(); } return factory; } public static SQLProvider getSQLProvider(String driverClass, String tableName, SQLProvider.DatabaseStoreType storeType) { SQLProvider.Factory factory; if (driverClass.contains("derby")) { logger.tracef("getSQLProvider Returning Derby SQL provider for driver::%s, tableName::%s", driverClass, tableName); factory = new DerbySQLProvider.Factory(); } else if (driverClass.contains("postgres")) { logger.tracef("getSQLProvider Returning postgres SQL provider for driver::%s, tableName::%s", driverClass, tableName); factory = new PostgresSQLProvider.Factory(); } else if (driverClass.contains("mysql")) { logger.tracef("getSQLProvider Returning mysql SQL provider for driver::%s, tableName::%s", driverClass, tableName); factory = new MySQLSQLProvider.Factory(); } else if (driverClass.contains("oracle")) { logger.tracef("getSQLProvider Returning Oracle12C SQL provider for driver::%s, tableName::%s", driverClass, tableName); factory = new Oracle12CSQLProvider.Factory(); } else { logger.tracef("getSQLProvider Returning generic SQL provider for driver::%s, tableName::%s", driverClass, tableName); factory = new GenericSQLProvider.Factory(); } return factory.create(tableName, storeType); } /** * Append to {@code errorMessage} a detailed description of the provided {@link SQLException}.<br/> * The information appended are: * <ul> * <li>SQL STATEMENTS</li> * <li>SQL EXCEPTIONS details ({@link SQLException#getSQLState}, * {@link SQLException#getErrorCode} and {@link SQLException#getMessage}) of the linked list ({@link SQLException#getNextException}) of exceptions</li> * </ul> * * @param errorMessage the target where append the exceptions details * @param exception the SQL exception (or warning) * @param sqlStatements the SQL statements related to the {@code exception} * @return {@code errorMessage} */ public static StringBuilder appendSQLExceptionDetails(StringBuilder errorMessage, SQLException exception, CharSequence sqlStatements) { errorMessage.append("\nSQL STATEMENTS: \n").append(sqlStatements); return appendSQLExceptionDetails(errorMessage, exception); } /** * Append to {@code errorMessage} a detailed description of the provided {@link SQLException}.<br/> * The information appended are: * <ul> * <li>SQL EXCEPTIONS details ({@link SQLException#getSQLState}, * {@link SQLException#getErrorCode} and {@link SQLException#getMessage}) of the linked list ({@link SQLException#getNextException}) of exceptions</li> * </ul> * * @param errorMessage the target where append the exceptions details * @param exception the SQL exception (or warning) * @return {@code errorMessage} */ public static StringBuilder appendSQLExceptionDetails(StringBuilder errorMessage, SQLException exception) { errorMessage.append("\nSQL EXCEPTIONS: "); SQLException nextEx = exception; int level = 0; do { errorMessage.append('\n'); for (int i = 0; i < level; i++) { errorMessage.append(' '); } formatSqlException(errorMessage, nextEx); nextEx = exception.getNextException(); level++; } while (nextEx != null); return errorMessage; } private static StringBuilder formatSqlException(StringBuilder errorMessage, SQLException exception) { final String sqlState = exception.getSQLState(); final int errorCode = exception.getErrorCode(); final String message = exception.getMessage(); return errorMessage.append("SQLState: ").append(sqlState).append(" ErrorCode: ").append(errorCode).append(" Message: ").append(message); } }