version 1.59, 2004/06/22 10:33:53
|
version 1.60, 2004/07/09 10:26:39
|
Line 19 import java.io.File;
|
Line 19 import java.io.File;
|
import java.io.FileInputStream; |
import java.io.FileInputStream; |
import java.io.FileNotFoundException; |
import java.io.FileNotFoundException; |
import java.io.FileOutputStream; |
import java.io.FileOutputStream; |
|
import java.io.InputStream; |
import java.io.InputStreamReader; |
import java.io.InputStreamReader; |
import java.io.OutputStreamWriter; |
import java.io.OutputStreamWriter; |
import java.io.PrintStream; |
import java.io.PrintStream; |
import java.io.UnsupportedEncodingException; |
import java.io.UnsupportedEncodingException; |
|
import java.net.URL; |
|
import java.net.URLConnection; |
import java.sql.PreparedStatement; |
import java.sql.PreparedStatement; |
import java.sql.SQLException; |
import java.sql.SQLException; |
import java.sql.Statement; |
import java.sql.Statement; |
Line 65 class Convert
|
Line 68 class Convert
|
System.out.println("Usage: java Convert <xml config file>"); |
System.out.println("Usage: java Convert <xml config file>"); |
System.exit(-1); |
System.exit(-1); |
} |
} |
if (!(new File(args[0]).exists())) |
|
System.exit(0); |
|
try |
try |
{ |
{ |
file = new FileOutputStream("./log.txt"); |
file = new FileOutputStream("./log.txt"); |
Line 75 class Convert
|
Line 76 class Convert
|
e1.printStackTrace(); |
e1.printStackTrace(); |
} |
} |
PrintStream stream = new PrintStream(file); |
PrintStream stream = new PrintStream(file); |
System.setOut(stream); |
// System.setOut(stream); |
System.setErr(stream); |
//System.setErr(stream); |
|
|
readXMLFile(args[0]); |
readXMLFile(args[0]); |
|
if (!(new File(args[0]).exists())) |
|
System.exit(0); |
|
|
System.out.println("Finished!"); |
System.out.println("Finished!"); |
//convert("jdbc:fmpro:http://141.14.237.74:8050","jdbc:postgresql://erebos/test",null,null); |
//convert("jdbc:fmpro:http://141.14.237.74:8050","jdbc:postgresql://erebos/test",null,null); |
} |
} |
Line 1563 class Convert
|
Line 1568 class Convert
|
{ |
{ |
try |
try |
{ |
{ |
|
InputStream stream = null; |
|
|
|
if(xmlFile.indexOf("file://")>=0||xmlFile.indexOf("http://")>=0) |
|
{ |
|
URL url=new URL(xmlFile); |
|
stream = url.openStream(); |
|
} |
|
else |
// read XML Metadata from a file |
// read XML Metadata from a file |
FileInputStream fi = new FileInputStream(xmlFile); |
stream = new FileInputStream(xmlFile); |
InputStreamReader isr = new InputStreamReader(fi, "UTF-8"); |
InputStreamReader isr = new InputStreamReader(stream, "UTF-8"); |
BufferedReader buffr = new BufferedReader(isr); |
BufferedReader buffr = new BufferedReader(isr); |
StringBuffer sb = new StringBuffer(); |
StringBuffer sb = new StringBuffer(); |
int c = 0; |
int c = 0; |
Line 1903 class Convert
|
Line 1916 class Convert
|
} |
} |
} // to method |
} // to method |
|
|
|
|
|
/** |
|
* synchronize method based on delete method code |
|
* |
|
* @param source |
|
* @param destination |
|
* @param names |
|
* @param layouts |
|
* @param selects |
|
* @param creates |
|
* @param ids |
|
* @param mode |
|
* @throws Exception |
|
*/ |
|
// TODO implement append,update and delete in one method |
|
// TODO using id based algorithm |
|
public static void synchronize(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode) throws Exception |
|
{ |
|
FM2SQL.ProgressDialog dialog = null; |
|
if (FM2SQL.fmInstance != null) |
|
{ |
|
dialog = new FM2SQL.ProgressDialog(FM2SQL.fmInstance, bean); |
|
dialog.setTitle("Conversion running ..."); |
|
dialog.title.setText("Getting table data ..."); |
|
dialog.setLocation(FM2SQL.fmInstance.getLocationOnScreen().x + (FM2SQL.fmInstance.getWidth() - 400) / 2, FM2SQL.fmInstance.getLocationOnScreen().y + (FM2SQL.fmInstance.getHeight() - 250) / 2); |
|
dialog.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); |
|
FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); |
|
dialog.thread = Thread.currentThread(); |
|
} |
|
// setting user and passwd |
|
bean.setUserAndPasswd(user, passwd); |
|
// setting user and passwd |
|
beanDest.setUserAndPasswd(userDest, passwdDest); |
|
if (dialog != null) |
|
dialog.setSize(400, 250); |
|
StringBuffer command = null; |
|
String query = null; |
|
try |
|
{ |
|
//bean.setConnection("jdbc:fmpro:http://141.14.237.74:8050"); |
|
//bean.setConnection("jdbc:postgresql://erebos/test","postgres","rogo"); |
|
bean.setConnection(source); |
|
if (names == null) |
|
names = bean.getTableNames(); |
|
// Collections.sort(names); |
|
int tbIndex = 1; |
|
|
|
// System.out.println("Start at "+names.indexOf("archimedes_facsimiles")); |
|
for (tbIndex = 0; tbIndex < names.size(); ++tbIndex) |
|
{ |
|
Vector[] result = null; |
|
java.util.TreeSet myIds = new TreeSet(); |
|
java.util.TreeSet myIdsDest = new TreeSet(); |
|
int deltaID = 1; |
|
String idField = ""; |
|
String destTableName = ""; |
|
|
|
try |
|
{ |
|
query = "select * from " + bean.getQC() + names.get(tbIndex).toString() + bean.getQC(); |
|
String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString(); |
|
query = (selects != null) ? selects.get(tbIndex).toString() : query; |
|
//if vectors[1].get(i) != null) |
|
if (layout != "") |
|
{ |
|
layout = " layout " + bean.getQC() + layout + bean.getQC(); |
|
String name = names.get(tbIndex).toString(); |
|
StringBuffer queryLayout = new StringBuffer(query); |
|
queryLayout.insert(queryLayout.indexOf(name) + name.length() + 1, " " + layout); |
|
query = queryLayout.toString(); |
|
System.out.println("added layout " + query); |
|
|
|
} |
|
dialog.title.setText("Getting table data ..."); |
|
dialog.table.setText(names.get(tbIndex).toString()); |
|
dialog.status.setText("Table " + (tbIndex + 1) + " of " + names.size()); |
|
dialog.show(); |
|
bean.getConnection(); |
|
bean.makeQuery(query, 50); |
|
idField = ids.get(tbIndex).toString(); |
|
|
|
} catch (Exception e) |
|
{ |
|
continue; |
|
} |
|
// determine destTableName from createStatement or from source table name |
|
if (!creates.get(tbIndex).equals("")) |
|
{ |
|
String create = creates.get(tbIndex).toString().toLowerCase(); |
|
int fromIndex = create.indexOf("table") + 5; |
|
int toIndex = create.indexOf("("); |
|
destTableName = create.substring(fromIndex, toIndex).replaceAll(beanDest.getQC(), "").trim(); |
|
System.out.println("destTable " + destTableName); |
|
|
|
} else |
|
destTableName = convertText(names.get(tbIndex).toString()); |
|
|
|
// for id kram |
|
Vector vec = null; |
|
Vector vecDest = null; |
|
// tempo |
|
beanDest.setConnection(destination); |
|
int rowCount = (idField != "") ? myIds.size() : bean.getRowCount(query); |
|
String tempID = bean.getQC() + idField + bean.getQC(); |
|
String tempIDdest = beanDest.getQC() + convertText(idField) + beanDest.getQC(); |
|
|
|
int endIndex = -1; |
|
String tempQuery = query; |
|
String destQuery = query.replaceAll(names.get(tbIndex).toString(), destTableName); |
|
String tempQueryDest = destQuery; |
|
// remove extra query parts destQuery.substring(0,destQuery.lastIndexOf(destTableName)+destTableName.length()+1); |
|
System.out.println("new Query " + tempQueryDest); |
|
if (!idField.equals("")) |
|
{ |
|
long startTime = System.currentTimeMillis(); |
|
int counter = -1; |
|
while (true) |
|
{ |
|
++counter; |
|
if (counter == 0 && dialog != null) |
|
dialog.title.setText("Check if data is available"); |
|
else if (dialog != null) |
|
dialog.title.setText("Check if more data is available"); |
|
myIds = bean.getIDVector(ids.get(tbIndex).toString(), (String) names.get(tbIndex), tempQuery, numHits); |
|
myIdsDest = beanDest.getIDVector(convertText(idField), destTableName, tempQueryDest, numHits); |
|
if (myIds.isEmpty()) |
|
break; |
|
vec = new Vector(myIds); |
|
vecDest = new Vector(myIdsDest); |
|
rowCount = vec.size(); |
|
// Deletion will work this way |
|
Vector deleted = new Vector(vec); |
|
Vector linesToDelete = new Vector(vecDest); |
|
// remove all lines that should not be deleted |
|
linesToDelete.removeAll(deleted); |
|
// System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIdsDest.size()); |
|
/// @TODO complete delete task remove query show lines to be deleted let user choose if he wants that |
|
System.out.println("number of lines to be deleted " + linesToDelete.size()); |
|
deltaID = (int) Math.round((double) myIds.size() / (double) numIntervalls); |
|
beanDest.setConnection(destination); |
|
|
|
Statement stm = beanDest.getConnection().createStatement(); |
|
|
|
Vector tables = beanDest.getTableNames(); |
|
// Collections.sort(tables); |
|
System.out.println(names.get(tbIndex) + " " + tables.indexOf(convertText((String) names.get(tbIndex)))); // "//beanDest.getTypeNames()); |
|
tables = beanDest.getTableNames(); |
|
// System.out.println(beanDest.getTableNames(beanDest.getCatalogs().get(2).toString())); |
|
stm = beanDest.getConnection().createStatement(); |
|
|
|
if (dialog != null) |
|
dialog.title.setText(" Deleting table data ..."); |
|
|
|
int j = -1; |
|
|
|
Vector row = null; |
|
command = new StringBuffer(); |
|
|
|
command.append("DELETE FROM"); |
|
command.append(beanDest.getQC()); |
|
command.append(destTableName); |
|
//command.append(convertText((String) names.get(tbIndex))); |
|
command.append(beanDest.getQC()); |
|
int size = bean.getColumnNames().size(); |
|
command.append("WHERE " + convertText(ids.get(tbIndex).toString()) + " = ?"); |
|
PreparedStatement pstm = beanDest.getConnection().prepareStatement(command.toString()); |
|
System.out.println(command + " " + tbIndex); |
|
//int rowCount = bean.getRowCount(query); |
|
// int idIndex = bean.getColumnNames().indexOf(ids.get(tbIndex)); |
|
while (true) |
|
{ |
|
|
|
++j; |
|
if (j == linesToDelete.size()) |
|
break; |
|
//print rows |
|
pstm.setString(1, linesToDelete.get(j).toString()); |
|
System.out.println(pstm.toString()); |
|
pstm.execute(); |
|
if (dialog != null) |
|
dialog.progress.setValue((int) (((double) (j + 1) / (double) rowCount) * 100.0)); |
|
command = null; |
|
} |
|
// prepare new query for next chunk |
|
if (query.indexOf("where") > 0) |
|
tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'"; |
|
else |
|
tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'"; |
|
|
|
} //to outer while |
|
} // to idfield if |
|
} // table loop |
|
|
|
} catch (Exception e) |
|
{ |
|
System.out.println("Error while connecting to database " + e); |
|
if (dialog != null) |
|
{ |
|
dialog.setVisible(false); |
|
dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); |
|
FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); |
|
} |
|
java.io.ByteArrayOutputStream b = new java.io.ByteArrayOutputStream(); |
|
java.io.PrintStream stream = new java.io.PrintStream(b); |
|
stream.print(command + "\n\n"); |
|
e.printStackTrace(stream); |
|
FM2SQL.showErrorDialog(b.toString(), "Error occured !"); |
|
|
|
} |
|
if (dialog != null) |
|
{ |
|
dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); |
|
FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); |
|
|
|
dialog.setVisible(false); |
|
} |
|
} // to method |
|
|
|
|
|
|
/** |
/** |
* Converts input String in norman encoding to unicode |
* Converts input String in norman encoding to unicode |
* @param inp |
* @param inp |