📄 xmlnode.java
字号:
XMLNode node=this;
while(node!=null&&node.getType()!=XMLNode.XML_TABLE){
node=node.getParent();
}
if(node!=null) return (XMLTable)node;
return null;
}
public XMLTabColumn getTabColumn(){
XMLNode node=this;
while(node!=null&&node.getType()!=XMLNode.XML_TABCOLUMN){
node=node.getParent();
}
if(node!=null) return (XMLTabColumn)node;
return null;
}
public XMLRole getRole(){
XMLNode node=this;
while(node!=null&&node.getType()!=XMLNode.XML_ROLE){
node=node.getParent();
}
if(node!=null) return (XMLRole)node;
return null;
}
public XMLUser getUser(){
XMLNode node=this;
while(node!=null&&node.getType()!=XMLNode.XML_USER){
node=node.getParent();
}
if(node!=null) return (XMLUser)node;
return null;
}
public void clear(){
//Logger.log(Logger.INFO,"clear "+this.getName()+" container");
this.container.clear();
}
public int compareTo(Object o) {
if(!(o instanceof XMLNode)) return -1;
if(this.getType()!=((XMLNode)o).getType())
return -1;
if(!this.getName().equals(((XMLNode)o).getName()))
return -1;
return 0;
}
public String toString(){
return name;
}
/**
* Returns the selected.
* @return boolean
*/
public boolean isSelected() {
return selected;
}
/**
* Sets the selected.
* @param selected The selected to set
*/
public void setSelected(boolean selected) {
this.selected = selected;
}
/**
* Returns the 返回定义导出语句.
* @return String
*/
public abstract String getSqlDDL();
/**
* 生成修改语句的方法
* */
public String getComparedSQL() throws Exception{
String comparedSQL = "";
XMLSchema srcSchema = null;
XMLSchema dstSchema = null;
srcSchema = CompareFrame.getInstance().getSelectedSrcXMLSchema();
dstSchema = CompareFrame.getInstance().getSelectedDstXMLSchema();
if(srcSchema == null ){
Logger.log(Logger.DEBUG,type2String(this.getType())+":"+this.name+":"+"获取源数据库Schema失败!");
return "";
}
if( dstSchema == null){
Logger.log(Logger.DEBUG,type2String(this.getType())+":"+this.name+":"+"获取目标数据库Schema失败!");
return "";
}
XMLNode srcNode = null;
XMLNode dstNode = null;
// 根据源对象的类型,相应的比较SQL不同
Logger.log(Logger.INFO,"Object type:"+this.type2String(this.getType()));
Logger.log(Logger.INFO,"CompareStatus:"+this.getCompareStatus());
if(this.getCompareStatus()==ComparedNode.SRC_DST_SAME) return "";
switch(this.getType()){
// 表的约束需要通过 alter table来修改表的约束
case(XMLNode.XML_CONSTRAINT):
String tabName = this.getTable().name.toUpperCase();
String tabOwner = this.getSchema().name.toUpperCase();
switch(this.getCompareStatus()){
case(ComparedNode.SRC_EXIST_DST_NULL):
srcNode=srcSchema.getIndirectChildren(this);
comparedSQL = "ALTER TABLE "+tabOwner+"."+tabName+ "\n"+"DROP CONSTRAINT "+srcNode.getName()+" CASCADE"+";\n";
break;
case(ComparedNode.SRC_NULL_DST_EXIST):
dstNode=dstSchema.getIndirectChildren(this);
comparedSQL = dstNode.getSqlDDL()+";\n";
break;
case(ComparedNode.SRC_DST_DIFF):
srcNode=srcSchema.getIndirectChildren(this);
dstNode=dstSchema.getIndirectChildren(this);
comparedSQL = "ALTER TABLE \""+tabOwner+"."+tabName+"\n"+"DROP CONSTRAINT "+srcNode.getName()+" CASCADE"+";\n";
comparedSQL += dstNode.getSqlDDL()+";\n";
break;
}
break;
// 存储过程、包、函数等source类型对象,可以通过create or replace命令来替换已存在的同名对象,不需要drop
case XMLNode.XML_PROCEDURE:
case XMLNode.XML_PACKAGE:
case XMLNode.XML_PACKAGEBODY:
case XMLNode.XML_FUNCTION:
String souOwner = this.getSchema().name.toUpperCase();
switch(this.getCompareStatus()){
case(ComparedNode.SRC_EXIST_DST_NULL):
// drop
srcNode=srcSchema.getIndirectChildren(this);
Logger.log(Logger.INFO,""+srcNode);
Logger.log(Logger.INFO,""+srcNode.getName());
Logger.log(Logger.INFO,""+getDDLType(srcNode.getType()));
comparedSQL = "DROP "+getDDLType(srcNode.getType())+" "+souOwner+"."+srcNode.getName()+";\n";
break;
case(ComparedNode.SRC_NULL_DST_EXIST):
// create
dstNode=dstSchema.getIndirectChildren(this);
comparedSQL = dstNode.getSqlDDL();
// 补齐格式
int SQL_length=comparedSQL.length();
char[] compared=comparedSQL.toCharArray();
if(compared[SQL_length-1]==';')comparedSQL+="\n/\n";
else{
if(compared[SQL_length-1]=='/')
comparedSQL+="\n";
else{
if(compared[SQL_length-2]==';')
comparedSQL+="/\n";
}
}
break;
case(ComparedNode.SRC_DST_DIFF):
// Drop and Create
// srcNode=srcSchema.getIndirectChildren(this);
dstNode=dstSchema.getIndirectChildren(this);
comparedSQL = dstNode.getSqlDDL();
// 补齐格式
SQL_length=comparedSQL.length();
compared=comparedSQL.toCharArray();
if(compared[SQL_length-1]==';')comparedSQL+="\n/\n";
else{
if(compared[SQL_length-1]=='/')
comparedSQL+="\n";
else{
if(compared[SQL_length-2]==';')
comparedSQL+="/\n";
}
}
}
break;
// 表、序列等
case XMLNode.XML_TABLE:
case XMLNode.XML_SEQUENCE:
String alterowner = this.getSchema().name.toUpperCase();
Logger.log(Logger.INFO,"XML_TABLE/XML_SEQUENCE:"+this.getName());
Logger.log(Logger.INFO,"getCompareStatus:"+this.getCompareStatus());
switch(this.getCompareStatus()){
case(ComparedNode.SRC_EXIST_DST_NULL):
// drop
srcNode=srcSchema.getIndirectChildren(this);
comparedSQL = "DROP "+getDDLType(srcNode.getType())+" "+alterowner+"."+srcNode.getName()+";\n";
break;
case(ComparedNode.SRC_NULL_DST_EXIST):
// create
dstNode=dstSchema.getIndirectChildren(this);
comparedSQL = dstNode.getSqlDDL()+";\n";
break;
case(ComparedNode.SRC_DST_DIFF):
comparedSQL = this.getAlterSQL()+";\n";
break;
}
break;
// 其它对象,例如表、索引、视图等
case XMLNode.XML_ARRAYTYPE:
case XMLNode.XML_OBJECTTYPE:
case XMLNode.XML_TABLETYPE:
case XMLNode.XML_SYNONYM:
case XMLNode.XML_VIEW:
case XMLNode.XML_TRIGGER:
case XMLNode.XML_INDEX:
String owner = this.getSchema().name.toUpperCase();
switch(this.getCompareStatus()){
case(ComparedNode.SRC_EXIST_DST_NULL):
// drop
srcNode=srcSchema.getIndirectChildren(this);
comparedSQL = "DROP "+getDDLType(srcNode.getType())+" "+owner+"."+srcNode.getName()+";\n";
break;
case(ComparedNode.SRC_NULL_DST_EXIST):
// create
dstNode=dstSchema.getIndirectChildren(this);
comparedSQL = dstNode.getSqlDDL()+";\n";
break;
case(ComparedNode.SRC_DST_DIFF):
// Drop and Create
srcNode=srcSchema.getIndirectChildren(this);
dstNode=dstSchema.getIndirectChildren(this);
//comparedSQL = "DROP "+getDDLType(srcNode.getType())+" \""+owner+"\".\""+srcNode.getName()+"\"\n";
comparedSQL = "DROP "+getDDLType(srcNode.getType())+" "+owner+"."+srcNode.getName()+";\n";
comparedSQL += dstNode.getSqlDDL()+";\n";
break;
}
break;
case XML_TABCOMMENT:
String tabName1 = this.getTable().name.toUpperCase();
String tabOwner1 = this.getSchema().name.toUpperCase();
switch(this.getCompareStatus()){
case(ComparedNode.SRC_EXIST_DST_NULL):
// drop
srcNode=srcSchema.getIndirectChildren(this);
comparedSQL = "COMMENT ON TABLE "+tabOwner1+"."+tabName1+" '';\n";
break;
case(ComparedNode.SRC_NULL_DST_EXIST):
// create
dstNode=dstSchema.getIndirectChildren(this);
comparedSQL = dstNode.getSqlDDL()+";\n";
break;
case(ComparedNode.SRC_DST_DIFF):
// Drop and Create
//srcNode=srcSchema.getIndirectChildren(this);
//dstNode=dstSchema.getIndirectChildren(this);
comparedSQL = this.getAlterSQL()+";\n";
break;
}
break;
case XML_TABCOLCOMMENT:
String tabName2 = this.getTable().name.toUpperCase();
String tabOwner2 = this.getSchema().name.toUpperCase();
switch(this.getCompareStatus()){
case(ComparedNode.SRC_EXIST_DST_NULL):
// drop
srcNode=srcSchema.getIndirectChildren(this);
comparedSQL = "COMMENT ON COLUMN "+tabOwner2+"."+tabName2+"."+srcNode.getTabColumn().getName()+" '';\n";
break;
case(ComparedNode.SRC_NULL_DST_EXIST):
// create
dstNode=dstSchema.getIndirectChildren(this);
comparedSQL = dstNode.getSqlDDL()+";\n";
break;
case(ComparedNode.SRC_DST_DIFF):
// Drop and Create
//srcNode=srcSchema.getIndirectChildren(this);
//dstNode=dstSchema.getIndirectChildren(this);
comparedSQL = this.getAlterSQL()+";\n";
break;
}
break;
}
if(comparedSQL==null) comparedSQL="";
return comparedSQL;
}
public String getAlterSQL() throws Exception{
return null;
}
/**将DDL语句写入文件*/
public void writeComparedSQLToFil(String fileName)throws Exception {
File scriptFile=new File(fileName);
writeComparedSQLToFil(scriptFile);
}
/**将DDL语句写入文件*/
public void writeComparedSQLToFil(File scriptFile) throws Exception{
//对于source中的对象用单独的文件夹来存放
switch(this.getType()){
case XMLNode.XML_PROCEDURE:
case XMLNode.XML_PACKAGE:
case XMLNode.XML_PACKAGEBODY:
case XMLNode.XML_FUNCTION:
File sourceDir=new File(scriptFile.getParent()+"/source/"+type2String(this.getType()));
sourceDir.mkdirs();
File sourceFile=new File(sourceDir.getPath(),this.getName()+".sql");
String comparedSql=this.getComparedSQL();
BufferedWriter datIn=new BufferedWriter(new FileWriter(sourceFile,true));
datIn.newLine();
datIn.write(comparedSql);
// char[] compared=comparedSql.toCharArray();
// int length=comparedSql.length();
datIn.newLine();
datIn.newLine();
datIn.close();
break;
// if((this.getDirectChildren(XMLNode.XML_TABLES,XMLTables.NAME)).isSelected()){
// (this.getDirectChildren(XMLNode.XML_TABLES,XMLTables.NAME)).writeDDLToFil(tablesFile);
//以下类别不需要写入scriptFile中
case XMLNode.XML_PROCEDURES:
case XMLNode.XML_PACKAGES:
case XMLNode.XML_PACKAGEBODIES:
case XMLNode.XML_FUNCTIONS:
case XMLNode.XML_SOURCES:
break;
//剩下的比较结果都写入到一个文件中
default:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -