package org.dayatang.db.oracle;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dayatang.db.*;
import java.io.File;
import java.io.IOException;
import java.sql.ResultSet;
import java.util.List;
public class OracleDBManager extends AbstractDBManager {
private Log logger = LogFactory.getLog(OracleDBManager.class);
private DBConnection jConn;
public OracleDBManager() throws Exception {
super();
jConn = JDBCConnection.getJDBCConnection();
}
@Override
public void cleanDatabase() {
ResultSet rs = null;
try {
// 删除约束关系
dropConstraint();
// 获取所有表
List<DataObject> allTableNames = DBManagerUtils
.getAllTableNames(jConn);
// 删除表
DBManagerUtils.dropTables(jConn, allTableNames);
logger.info("清理数据库,已删除所有表和视图 !");
} catch (Exception e) {
logger.error("cleanDatabase() ", e);
} finally {
DBManagerUtils.colseRs(rs);
}
}
/**
* 删除关联
*
* @throws Exception
*/
private void dropConstraint() throws Exception {
jConn.execute("select 'alter table '||table_name||' drop constraint '||constraint_name||';' from user_constraints where constraint_type='R'");
}
@Override
public void executeSQL(String sqlFile) {
StringBuffer command = new StringBuffer();
command.append("cmd /c sqlplus ");
command.append(username + "/" + password);
command.append("@" + databaseName);
command.append(" @" + sqlFile);
try {
logger.info("执行SQL文件:" + sqlFile);
Process process = Runtime.getRuntime().exec(command.toString());
process.waitFor();
} catch (IOException e) {
logger.error("执行SQL文件出错:" + sqlFile, e);
} catch (InterruptedException e) {
logger.error("执行SQL文件出错:" + sqlFile, e);
}
}
@Override
public void exportAll(String filePath) {
String file = exportFileName(filePath);
StringBuffer command = getBaseOracleExpSQL();
command.append(" file=" + file);
command.append(" owner=" + username);
try {
logger.info("执行命令:" + command.toString());
Runtime.getRuntime().exec(command.toString());
logger.info("已导出数据库中所有表(包括视图)到:" + file);
} catch (IOException e) {
logger.error("", e);
}
}
@Override
public void exportExcludes(String filePath,
List<String> excludedTablePrefixs) {
try {
List<String> excludeds = DBManagerUtils.loadIncludedTableName(
jConn, excludedTablePrefixs);
String tables = DBManagerUtils.getString(excludeds);
if (StringUtils.isBlank(tables)) {
logger.info("没有任何表或者视图需要导出.");
return;
}
String file = exportFileName(filePath);
StringBuffer command = getBaseOracleExpSQL();
command.append(" tables=(" + tables + ")");
command.append(" file=" + file);
logger.info("执行命令:" + command.toString());
Runtime.getRuntime().exec(command.toString());
logger.info("已导出数据库中不是以[ "
+ DBManagerUtils.getString(excludedTablePrefixs)
+ " ]前缀开头的表(包括视图)到:" + file);
} catch (IOException e) {
logger.error("", e);
} catch (Exception e1) {
logger.error("", e1);
}
}
@Override
public void exportIncludes(String filePath,
List<String> includedTablePrefixs) {
try {
List<String> excludeds = DBManagerUtils.loadExcludedTableName(
jConn, includedTablePrefixs);
String tables = DBManagerUtils.getString(excludeds);
if (StringUtils.isBlank(tables)) {
logger.info("没有任何表或者视图需要导出.");
return;
}
String file = exportFileName(filePath);
StringBuffer command = getBaseOracleExpSQL();
command.append(" tables=(" + tables + ")");
command.append(" file=" + file);
logger.info("执行命令:" + command.toString());
Runtime.getRuntime().exec(command.toString());
logger.info("已导出数据库中以[ "
+ DBManagerUtils.getString(includedTablePrefixs)
+ " ]前缀开头的表(包括视图)到:" + file);
} catch (IOException e) {
logger.error("", e);
} catch (Exception e1) {
logger.error("", e1);
}
}
/**
* 生成的sql文件名
*
* @param filePath
* @return
*/
private String exportFileName(String filePath) {
if (filePath.endsWith(".dmp")) {
return filePath;
}
String result = filePath;
if (!result.endsWith(File.separator)) {
result += File.separator;
}
return result + DBManagerUtils.generateUniqueName() + ".dmp";
}
/**
* Oracle 基础导出命令
*
* @param file
* @return
*/
private StringBuffer getBaseOracleExpSQL() {
StringBuffer command = new StringBuffer();
command.append("cmd /c exp ");
command.append(username + "/" + password);
command.append("@" + databaseName);
command.append(" rows=y");
return command;
}
}