--- FM2SQL/src/Convert.java 2005/04/12 11:02:51 1.9
+++ FM2SQL/src/Convert.java 2005/09/22 12:24:30 1.15
@@ -29,13 +29,13 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
+import java.text.DateFormat;
import java.text.ParseException;
import java.util.ArrayList;
-import java.util.Enumeration;
+import java.util.Date;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
-import java.util.Properties;
import java.util.StringTokenizer;
import java.util.TreeSet;
import java.util.Vector;
@@ -49,6 +49,8 @@ import com.exploringxml.xml.Xparse;
class Convert
{
+ private static final String _TEMP = "_temp";
+
/**
* Helper class for index creation
*
@@ -135,10 +137,16 @@ class Convert
static Vector postSQLCommands = new Vector();
- static final String versionID = new String("FM2SQL Version 0.9.0b\n");
+ static final String versionID = new String("FM2SQL Version 0.9.9b\n");
+
+ private static boolean noError = false;
public static void main(String args[]) throws IOException
{
+ // DateFormat d = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT,
+ // Locale.GERMANY);
+ // System.out.println(convertText("rogoistSuper" + "_" + d.format(new Date()).replace(':', '_')));
+
/*
* try { //byte[] b = "�".getBytes("UTF-8"); //
* System.out.println("QueryString " +b[0]+" "+b[1]+(new
@@ -158,7 +166,7 @@ class Convert
File temp = null;
try
{
- temp = new File(tmpPath, "fm2sql.txt");
+ temp = new File(tmpPath, "fm2sql.txt");
int count = 1;
while (temp.exists())
{
@@ -172,8 +180,8 @@ class Convert
PrintStream stream = new PrintStream(file, true);
// write info for user to stdout
System.out.println(versionID);
- System.out.println("Loading "+args[0]+"....");
- System.out.println("Log will be written to "+temp.getCanonicalPath());
+ System.out.println("Loading " + args[0] + "....");
+ System.out.println("Log will be written to " + temp.getCanonicalPath());
if (!debug)
{
@@ -181,8 +189,8 @@ class Convert
System.setErr(stream);
}
System.out.println(versionID);
- System.out.println("Using config file : "+args[0]+"....");
-
+ System.out.println("Using config file : " + args[0] + "....");
+
StringBuffer sb = readXMLFile(args[0]);
parseXMLConfig(sb);
if (!(new File(args[0]).exists()))
@@ -264,8 +272,9 @@ class Convert
String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString();
query = (selects != null) ? selects.get(tbIndex).toString() : query;
// if vectors[1].get(i) != null)
- if (layout != "")
+ if (!layout.equals(""))
{
+
query = addLayoutToQuery(names, query, tbIndex, layout);
}
@@ -488,7 +497,7 @@ class Convert
String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString();
query = (selects != null) ? selects.get(tbIndex).toString() : "select * from "
+ bean.getQC() + names.get(tbIndex).toString() + bean.getQC();
- if (layout != "")
+ if (layout.intern() != "")
{
query = addLayoutToQuery(names, query, tbIndex, layout);
@@ -530,12 +539,22 @@ class Convert
destTableName = prop.destTableName;
if (mode == Convert.DataBase.CONVERT_TEMP_MODE)
{
- destTableName += "_temp";
+ String tableNameSave=destTableName;
+ destTableName += _TEMP;
+ if(creates.get(tbIndex)!="")
+ {
+ System.out.println("Changed tablename of create statement to "+destTableName);
+ StringBuffer buffer=new StringBuffer(creates.get(tbIndex).toString());
+ int startIndex = buffer.indexOf(tableNameSave);
+ buffer.replace(startIndex,startIndex+tableNameSave.length(),destTableName);
+ creates.set(tbIndex,buffer.toString());
+ }
}
+ System.out.println("destTableName is now "+destTableName);
+
fieldNames = prop.fieldNames;
if (mode == Convert.DataBase.CONVERT_MODE || mode == Convert.DataBase.CONVERT_TEMP_MODE)
{
-
if (tables.indexOf(destTableName) >= 0)
{
stm.executeUpdate("drop table " + beanDest.getQC() + destTableName + beanDest.getQC());
@@ -579,8 +598,10 @@ class Convert
command.append(" )");
} else
- command = new StringBuffer().append(creates.get(tbIndex).toString().toLowerCase());
- stm.executeUpdate(command.toString());
+ {
+ command = new StringBuffer().append(creates.get(tbIndex).toString());
+ }
+ stm.executeUpdate(command.toString());
}
}
@@ -606,7 +627,6 @@ class Convert
command.append(") ");
command.append(" values ( ");
-
// add a question marks for every field
for (int i = 0; i < bean.getColumnNames().size() - 1; ++i)
command.append("?,");
@@ -648,7 +668,7 @@ class Convert
for (int k = 0; k < vec.size() - deltaID; k = k + deltaID)
{
System.out.println(vec.get(k) + " " + vec.get(k + deltaID) + " " + vec.lastElement());
- if (query.indexOf("where") > 0)
+ if (query.toLowerCase().indexOf("where") > 0)
tempQuery = query + " and " + tempID + ">='" + vec.get(k) + "' and " + tempID
+ "<='" + vec.get(k + deltaID) + "'";
else
@@ -674,7 +694,7 @@ class Convert
System.out.println(" last intervall from " + vec.get(endIndex) + " "
+ vec.lastElement());
- if (query.indexOf("where") > 0)
+ if (query.toLowerCase().indexOf("where") > 0)
tempQuery = query + " and " + tempID + ">='" + vec.get(endIndex) + "' and "
+ tempID + "<='" + vec.lastElement() + "'";
else
@@ -689,7 +709,7 @@ class Convert
command = writeDatainDestTable(dialog, command, endIndex, pstm, rowCount, delimiter);
}
// prepare new query for next chunk
- if (query.indexOf("where") > 0)
+ if (query.toLowerCase().indexOf("where") > 0)
tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'";
else
tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'";
@@ -703,6 +723,7 @@ class Convert
long startTime = System.currentTimeMillis();
bean.makeQuery(query, 0);
+ System.err.println("query for whole table done");
command = writeDatainDestTable(dialog, command, j, pstm, rowCount, delimiter);
long endTime = System.currentTimeMillis();
System.out.println("Time for old convert elapsed " + (endTime - startTime));
@@ -710,10 +731,31 @@ class Convert
}
if (isGUI)
resetGUI(dialog);
+ noError = true;
+ if (mode == Convert.DataBase.CONVERT_TEMP_MODE)
+ {
+ String originalName = destTableName.split(_TEMP)[0];
+ // TODO
+ if (beanDest.getTableNames().contains(originalName))
+ {
+ DateFormat d = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM);
+ d.setTimeZone(java.util.TimeZone.getTimeZone("CET"));
+
+ String date = d.format(new Date());
+ date = date.replace(':', '_');
+ String newName = addQuotes(beanDest, convertText(originalName + "_" + date));
+ // rename table to newName
+ renameTable(beanDest, addQuotes(beanDest, originalName), newName);
+ }
+ // rename Table_temp to originalName
+ renameTable(beanDest, addQuotes(beanDest, destTableName), addQuotes(beanDest,
+ originalName));
+ }
}
} catch (Exception e)
{
- System.out.println("Error while connecting to database " + e);
+ System.out.println("Error while connecting to database " + e.getMessage());
+ noError = false;
if (isGUI)
{
showExceptionDialog(dialog, command, e);
@@ -723,11 +765,28 @@ class Convert
e.printStackTrace();
}
+ } catch (Error e)
+ {
+ noError = false;
+
+ System.out.println(e);
+ e.printStackTrace();
}
}
/**
+ *
+ * @param beanDest2
+ * @param originalName
+ * @return
+ */
+ private static String addQuotes(DBBean bean, String originalName)
+ {
+ return bean.getQC() + originalName + bean.getQC();
+ }
+
+ /**
* @param names
* @param dialog
* @param tbIndex
@@ -1033,8 +1092,25 @@ class Convert
sqlCommand.executeCommand();
}
int mode = db.mode;
- if (mode == DataBase.CONVERT_MODE || mode == DataBase.APPEND_MODE
- || mode == DataBase.CONVERT_TEMP_MODE)
+ if (mode == DataBase.CONVERT_TEMP_MODE)
+ {
+ convertBatch(db.bean, database, db.tables, db.layouts, db.selects, db.creates, db.ids,
+ mode, db.delimiter);
+ if (noError)
+ {
+ System.out.println("no Error occured ");
+ // db.bean.setURL(database.url);
+ // db.bean.setUserAndPasswd(database.user,database.passwd);
+ //
+ // Convert.user = db.bean.user;
+ // Convert.passwd = db.bean.passwd;
+ // userDest = database.user;
+ // passwdDest = database.passwd;
+ // synchronize(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates,
+ // db.ids, mode, db.delimiter, new Vector(db.htIndex.values()));
+ }
+ }
+ if (mode == DataBase.CONVERT_MODE || mode == DataBase.APPEND_MODE)
convertBatch(db.bean, database, db.tables, db.layouts, db.selects, db.creates, db.ids,
mode, db.delimiter);
else if (mode == DataBase.UPDATE_MODE)
@@ -1055,7 +1131,7 @@ class Convert
passwdDest = database.passwd;
synchronize(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates,
- db.ids, mode, db.delimiter, new Vector(db.htIndex.values()));
+ db.ids, mode, db.delimiter, new Vector(db.htIndex.values()), db.destIDs);
}
for (Iterator iterator = db.postCommands.iterator(); iterator.hasNext();)
{
@@ -1082,6 +1158,21 @@ class Convert
}
}
+ /**
+ *
+ * @param database
+ * @param db
+ * @throws Exception
+ * @throws SQLException
+ */
+ private static void renameTable(DBBean database, String sourceTable, String destTable)
+ throws SQLException, Exception
+ {
+ String command = "alter table " + sourceTable + " rename " + " to " + destTable;
+ SQLCommand sqlCommand = new SQLCommand(database, command);
+ sqlCommand.executeCommand();
+ }
+
public static Vector getXMLConfig(StringBuffer sb)
{
@@ -1097,6 +1188,8 @@ class Convert
Vector selects = new Vector();
Vector creates = new Vector();
Vector ids = new Vector();
+ Vector destIDs = new Vector();
+
Vector preSQLCommands = new Vector();
Vector postSQLCommands = new Vector();
@@ -1119,6 +1212,8 @@ class Convert
selects = new Vector();
creates = new Vector();
ids = new Vector();
+ destIDs = new Vector();
+
preSQLCommands = new Vector();
postSQLCommands = new Vector();
@@ -1191,6 +1286,7 @@ class Convert
else if (modeString.equals("convert_temp"))
mode = DataBase.CONVERT_TEMP_MODE;
+ System.out.println("mode ist "+mode);
// if(node3!=null)
// System.out.println(node3.name);
@@ -1222,7 +1318,9 @@ class Convert
String name = (String) node4.attributes.get("name");
String layout = (String) node4.attributes.get("layout");
String id = (String) node4.attributes.get("id");
+ String destID = (String) node4.attributes.get("targetID");
System.out.println("id was " + id);
+ System.out.println("targetID was " + destID);
if (name == null)
throw new Error("parse error required table tag attribute name missing");
@@ -1230,11 +1328,15 @@ class Convert
layout = "";
if (id == null)
id = "";
+ if (destID == null)
+ destID = id ;
+
if (name.equals(""))
throw new Error("parse error table tag attribute must not be empty");
- tables.add(name);
- layouts.add(layout);
- ids.add(id);
+ tables.add(name.intern());
+ layouts.add(layout.intern());
+ ids.add(id.intern());
+ destIDs.add(destID.intern());
String query = (node5 == null) ? "" : node5.getCharacters();
if (query.equals(""))
System.err.println("Warning empty select tag or select tag missing !!");
@@ -1251,6 +1353,7 @@ class Convert
dataBase.delimiter = delimiter;
dataBase.preCommands = new Vector(preSQLCommands);
dataBase.postCommands = new Vector(postSQLCommands);
+ dataBase.destIDs = destIDs;
databases.add(dataBase);
}
DBBean database = new DBBean();
@@ -1444,6 +1547,7 @@ class Convert
*/
public static class DataBase
{
+
DBBean bean;
Vector creates;
@@ -1455,6 +1559,7 @@ class Convert
Vector tables = new Vector();
Vector ids;
+ Vector destIDs;
String delimiter = "//";
@@ -1521,7 +1626,9 @@ class Convert
buffr.write(" " + bean.passwd + "\n");
buffr.write(" " + delimiter + "\n");
String modeString = "";
- if (mode == CONVERT_MODE)
+ if (mode == CONVERT_TEMP_MODE)
+ modeString = "convert_temp";
+ else if (mode == CONVERT_MODE)
modeString = "convert";
else if (mode == APPEND_MODE)
modeString = "append";
@@ -1799,7 +1906,7 @@ class Convert
command = null;
}
// prepare new query for next chunk
- if (query.indexOf("where") > 0)
+ if (query.toLowerCase().indexOf("where") > 0)
tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'";
else
tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'";
@@ -1824,7 +1931,6 @@ class Convert
/**
* synchronize method based on delete method code
- *
* @param source
* @param destination
* @param names
@@ -1833,12 +1939,14 @@ class Convert
* @param creates
* @param ids
* @param mode
+ * @param destIDs TODO
+ *
* @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, String delimiter, Vector indexList)
+ Vector selects, Vector creates, Vector ids, int mode, String delimiter, Vector indexList, java.util.Vector destIDs)
throws Exception
{
System.out.println(" bin in synchronize!!!");
@@ -1869,6 +1977,7 @@ class Convert
java.util.TreeSet myIdsDest = new TreeSet();
int deltaID = 1;
String idField = "";
+ String destIDField = "";
String destTableName = "";
try
@@ -1889,7 +1998,7 @@ class Convert
bean.getConnection();
bean.makeQuery(query, 50);
idField = ids.get(tbIndex).toString();
-
+ destIDField = (destIDs!=null) ? destIDs.get(tbIndex).toString():convertText(idField);
} catch (Exception e)
{
System.out.println("Warning exception occured \n " + e);
@@ -1929,7 +2038,7 @@ class Convert
// remove extra query parts
// destQuery.substring(0,destQuery.lastIndexOf(destTableName)+destTableName.length()+1);
System.out.println("new Query " + tempQueryDest);
- System.out.println("idfield " + idField + " " + ids.get(tbIndex).toString());
+ System.out.println("idfield " + idField + " " + ids.get(tbIndex).toString()+" targetID is "+destIDField);
if (!idField.equals(""))
{
long startTime = System.currentTimeMillis();
@@ -1946,7 +2055,7 @@ class Convert
myIds = bean.getIDVector(ids.get(tbIndex).toString(), (String) names.get(tbIndex),
tempQuery, 0);
- myIdsDest = beanDest.getIDVector(convertText(idField), destTableName, tempQueryDest, 0);
+ myIdsDest = beanDest.getIDVector(destIDField, destTableName, tempQueryDest, 0);
// System.out.println("status of remove
// "+myIds.remove("b015892"));
System.out.println("ids found for " + idField + " " + !myIds.isEmpty());
@@ -1959,7 +2068,7 @@ class Convert
Vector deleted = new Vector(vec);
TreeSet linesToAppend = new TreeSet(vec);
- linesToAppend.addAll(vec);
+ // linesToAppend.addAll(vec);
linesToDelete = new TreeSet(vecDest);
// remove all lines that are already in dest database
linesToAppend.removeAll(vecDest);
@@ -1993,7 +2102,7 @@ class Convert
for (int k = 0; k < vec.size() - deltaID; k = k + deltaID)
{
System.out.println(vec.get(k) + " " + vec.get(k + deltaID) + " " + vec.lastElement());
- if (query.indexOf("where") > 0)
+ if (query.toLowerCase().indexOf("where") > 0)
tempQuery = query + " and " + tempID + ">='" + vec.get(k) + "' and " + tempID
+ "<='" + vec.get(k + deltaID) + "'";
else
@@ -2023,7 +2132,7 @@ class Convert
System.out.println(" last intervall from " + vec.get(endIndex) + " "
+ vec.lastElement());
- if (query.indexOf("where") > 0)
+ if (query.toLowerCase().indexOf("where") > 0)
tempQuery = query + " and " + tempID + ">='" + vec.get(endIndex) + "' and "
+ tempID + "<='" + vec.lastElement() + "'";
else
@@ -2042,7 +2151,7 @@ class Convert
// numIntervalls) + " " + myIdsDest.size());
}
// prepare new query for next chunk
- if (query.indexOf("where") > 0)
+ if (query.toLowerCase().indexOf("where") > 0)
tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'";
else
tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'";
@@ -2108,7 +2217,7 @@ class Convert
// CREATE UNIQUE INDEX title_idx ON films (title);
for (Iterator iter = linesToDelete.iterator(); iter.hasNext();)
{
- String id = (String) iter.next();
+ String id = iter.next().toString();
delPSt.setString(1, id);
delPSt.execute();
@@ -2156,7 +2265,7 @@ class Convert
dialog.title.setText("Retrieving new data");
}
- Vector[] vectors = bean.getQueryData(tempQuery, deltaID);
+ Vector[] vectors = bean.getQueryData(tempQuery, 0);
int count = 0, size = vectors[0].size();
int idIndex = vectors[1].indexOf(idField);
// System.out.println(idIndex + " " + vectors[1] + " " + idField);
@@ -2169,7 +2278,7 @@ class Convert
Vector line = (Vector) iter.next();
Object lineIDIndex = line.get(idIndex);
if (linesToAppend.contains(lineIDIndex))
- System.out.println("line " + linesToAppend.contains(line.get(idIndex)) + " " + lineIDIndex);
+ System.out.println("line " + linesToAppend.contains(lineIDIndex) + " " + lineIDIndex);
if (linesToAppend.contains(lineIDIndex))
{
for (int l = 0; l < line.size(); ++l)
@@ -2199,7 +2308,8 @@ class Convert
}
updPst.setString(line.size() + 1, line.get(idIndex).toString());
// updPst.addBatch();
- // updPst.execute();
+ // System.out.println("updating "+line.get(idIndex).toString()+" "+line);
+ updPst.execute();
}
if (dialog != null)
{
@@ -3729,7 +3839,7 @@ class Convert
// retrieve field_names from select statement
if (query.indexOf("*") < 0)
{
- int selectEndIndex = query.indexOf("from");
+ int selectEndIndex = query.lastIndexOf("from");
StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ",");
int numFields = tokenizer.countTokens();
fieldNames = new String[numFields];
@@ -3737,7 +3847,11 @@ class Convert
while (tokenizer.hasMoreTokens())
{
String fieldName = tokenizer.nextToken().trim();
- fieldNames[fieldIndex] = beanDest.getQC() + convertText(fieldName) + beanDest.getQC();
+ String text = convertText(fieldName);
+ if (text.indexOf("\"") >= 0)
+ fieldNames[fieldIndex] = convertText(fieldName);
+ else
+ fieldNames[fieldIndex] = beanDest.getQC() + convertText(fieldName) + beanDest.getQC();
// System.out.println("field "+ fieldNames[fieldIndex]);
fieldIndex++;
}