/*
* Copyright 2010 Research Studios Austria Forschungsgesellschaft mBH
*
* This file is part of easyrec.
*
* easyrec is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* easyrec is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with easyrec. If not, see <http://www.gnu.org/licenses/>.
*/
package org.easyrec.utils.spring.store.dao.impl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.easyrec.utils.spring.store.dao.DBRootDAO;
import org.easyrec.utils.spring.store.dao.annotation.DAO;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.support.DatabaseMetaDataCallback;
import org.springframework.jdbc.support.JdbcUtils;
import org.springframework.jdbc.support.MetaDataAccessException;
import javax.sql.DataSource;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
/**
* This class provides a Mysql implementation of the {@link org.easyrec.utils.spring.store.dao.DBRootDAO} interface. It
* provides
* methods to create and delete databases;
* <p/>
* <p><b>Company: </b>
* SAT, Research Studios Austria</p>
* <p/>
* <p><b>Copyright: </b>
* (c) 2007</p>
* <p/>
* <p><b>last modified:</b><br/>
* $Author: pmarschik $<br/>
* $Date: 2011-02-11 18:35:47 +0100 (Fr, 11 Feb 2011) $<br/>
* $Revision: 17681 $</p>
*
* @author Roman Cerny
*/
@DAO
public class DBRootDAOMysqlImpl extends JdbcDaoSupport implements DBRootDAO {
///////////////////////////////////////////////////////////////////////////
// constants
public final static boolean DEFAULT_OVERWRITE_EXISTING_DATABASE = false;
public final static boolean DEFAULT_CHECK_EXISTING_DATABASE = true;
public final static boolean DEFAULT_OMIT_ERROR_IF_EXISTING = false;
///////////////////////////////////////////////////////////////////////////
// members
// logging
private final Log logger = LogFactory.getLog(this.getClass());
///////////////////////////////////////////////////////////////////////////
// constructor
public DBRootDAOMysqlImpl(DataSource dataSource) {
setDataSource(dataSource);
}
///////////////////////////////////////////////////////////////////////////
// interface 'RootDAO' implementation
public void createDatabase(String databaseName) {
createDatabase(databaseName, DEFAULT_OVERWRITE_EXISTING_DATABASE);
}
public void createDatabase(String databaseName, boolean overwriteIfExists) {
createDatabase(databaseName, overwriteIfExists, DEFAULT_CHECK_EXISTING_DATABASE);
}
public void createDatabase(String databaseName, boolean overwriteIfExists, boolean checkExisting) {
createDatabase(databaseName, overwriteIfExists, checkExisting, DEFAULT_OMIT_ERROR_IF_EXISTING);
}
public void createDatabase(String databaseName, boolean overwriteIfExists, boolean checkExisting,
boolean omitErrorIfExisting) {
if (databaseName == null || "".equals(databaseName)) {
throw new IllegalArgumentException("passed param 'databaseName' must not be null or empty");
}
if (checkExisting) {
if (existsDatabase(databaseName)) {
if (overwriteIfExists) {
deleteDatabase(databaseName);
} else {
if (omitErrorIfExisting) {
logger.warn("the database '" + databaseName +
"' already exists, could not re-create database (since overwrite=" + overwriteIfExists +
" was passed), using OLD existing database");
return;
} else {
throw new IllegalArgumentException("the database '" + databaseName +
"' already exists, could not re-create database (since overwrite=" + overwriteIfExists +
" was passed)");
}
}
}
}
StringBuilder ddl = new StringBuilder("CREATE DATABASE ");
ddl.append(databaseName);
getJdbcTemplate().execute(ddl.toString());
if (logger.isDebugEnabled()) {
logger.debug("database '" + databaseName + "' has been created successfully");
logger.debug("used following statement: " + ddl);
}
}
public void deleteDatabase(String databaseName) {
deleteDatabase(databaseName, DEFAULT_CHECK_EXISTING_DATABASE);
}
public void deleteDatabase(String databaseName, boolean checkExisting) {
if (checkExisting) {
if (!existsDatabase(databaseName)) {
throw new IllegalArgumentException(
"the database '" + databaseName + "' does not exist, it can not be deleted");
}
}
StringBuilder ddl = new StringBuilder("DROP DATABASE ");
ddl.append(databaseName);
getJdbcTemplate().execute(ddl.toString());
if (logger.isDebugEnabled()) {
logger.debug("database '" + databaseName + "' has been deleted successfully");
logger.debug("used following statement: " + ddl);
}
}
@SuppressWarnings({"unchecked"})
public boolean existsDatabase(String databaseName) {
// get the list of all databases from the db server
List<String> dbNames;
DatabaseMetaDataCallback callback = new DatabaseMetaDataCallback() {
public Object processMetaData(DatabaseMetaData dbmd) throws SQLException, MetaDataAccessException {
List<String> ret = new LinkedList<String>();
ResultSet rs = dbmd.getCatalogs();
while (rs.next()) {
ret.add(rs.getString(1));
}
return ret;
}
};
try {
dbNames = (List<String>) JdbcUtils.extractDatabaseMetaData(getDataSource(), callback);
} catch (Exception e) {
throw new RuntimeException("unable to read database metadata", e);
}
return dbNames.contains(databaseName);
}
}