/** * Licensed to Apereo under one or more contributor license agreements. See the NOTICE file * distributed with this work for additional information regarding copyright ownership. Apereo * 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 the * following location: * * <p>http://www.apache.org/licenses/LICENSE-2.0 * * <p>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.apereo.portal.utils; import com.google.common.base.Function; import com.google.common.base.Functions; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.ConnectionCallback; import org.springframework.jdbc.core.JdbcOperations; /** * Utilities for JDBC operations * */ public final class JdbcUtils { private static final Logger LOGGER = LoggerFactory.getLogger(JdbcUtils.class); private JdbcUtils() {} /** * Check if the named table exists, if it does drop it, calling the preDropCallback first * * @param jdbcOperations {@link JdbcOperations} used to check if the table exists and execute * the drop * @param table The name of the table to drop, case insensitive * @param preDropCallback The callback to execute immediately before the table is dropped * @return The result returned from the callback */ public static final <T> T dropTableIfExists( JdbcOperations jdbcOperations, final String table, final Function<JdbcOperations, T> preDropCallback) { LOGGER.info("Dropping table: " + table); final boolean tableExists = doesTableExist(jdbcOperations, table); if (tableExists) { final T ret = preDropCallback.apply(jdbcOperations); jdbcOperations.execute("DROP TABLE " + table); return ret; } return null; } /** Check if the specified table exists */ public static boolean doesTableExist(JdbcOperations jdbcOperations, final String table) { final boolean tableExists = jdbcOperations.execute( new ConnectionCallback<Boolean>() { @Override public Boolean doInConnection(Connection con) throws SQLException, DataAccessException { final DatabaseMetaData metaData = con.getMetaData(); final ResultSet tables = metaData.getTables( null, null, null, new String[] {"TABLE"}); while (tables.next()) { final String dbTableName = tables.getString("TABLE_NAME"); if (table.equalsIgnoreCase(dbTableName)) { return true; } } return false; } }); return tableExists; } /** @see #dropTableIfExists(JdbcOperations, String, Function) */ public static final void dropTableIfExists(JdbcOperations jdbcOperations, final String table) { dropTableIfExists(jdbcOperations, table, Functions.<JdbcOperations>identity()); } }