package neoe.tool;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class FindSqlCreateOrder {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
new FindSqlCreateOrder().run();
}
private void run() throws Exception {
File[] fs = new File("C:/DBscript/")
.listFiles();
for (File f : fs) {
String fn = f.getName();
if (fn.endsWith(".SQL")) {
parseCreateSql(f);
}
}
findOrder();
}
private void findOrder() {
while (true) {
List<String> out = new ArrayList<String>();
for (String tab : tables) {
if (noRef(tab)) {
out.add(tab);
delRef(tab);
}
}
if (out.size() == 0) {
break;
}
order.addAll(out);
tables.removeAll(out);
}
if (tables.size() != 0) {
System.out.println("remain " + tables);
}
for (String s : order) {
System.out.println(s);
}
Collections.reverse(order);
System.out.println("---rev-----");
for (String s : order) {
System.out.println("drop table "+s+";");
}
}
private void delRef(String tab) {
for (int i=refs1.size()-1;i>=0;i--){
if (refs1.get(i).equals(tab)){
refs1.remove(i);
refs2.remove(i);
}
}
}
private boolean noRef(String tab) {
return !refs2.contains(tab);
}
private void parseCreateSql(File f) throws Exception {
String table = f.getName().substring(0, f.getName().length() - 4)
.toUpperCase();
addTable(table);
BufferedReader in = new BufferedReader(new FileReader(f));
String line;
while ((line = in.readLine()) != null) {
if (line.indexOf("FOREIGN KEY") >= 0) {
int p1 = line.indexOf("REFERENCES");
int p2 = line.indexOf(" ", p1 + "REFERENCES".length() + 1);
String ref = line.substring(p1 + "REFERENCES".length() + 1, p2);
addRef(table, ref);
}
}
in.close();
}
private void addRef(String table, String ref) {
System.out.println(table + "<" + ref);
if (!table.equals(ref)){
refs1.add(ref);
refs2.add(table);
}
}
private void addTable(String table) {
System.out.println("#" + table);
tables.add(table);
}
List<String> order = new ArrayList<String>();
private List<String> tables = new ArrayList<String>();
private List<String> refs1 = new ArrayList<String>();
private List<String> refs2 = new ArrayList<String>();
}
2008年7月3日星期四
用有向图拓扑排序整理foreign key table create顺序
订阅:
博文评论 (Atom)
没有评论:
发表评论