⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlnode.java

📁 导出ORACLE数据库对象DDL语句的程序
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
		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 + -