--- FM2SQL/src/Convert.java 2005/04/19 10:49:05 1.10 +++ FM2SQL/src/Convert.java 2006/09/30 10:58:58 1.16 @@ -29,8 +29,10 @@ 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.Date; import java.util.Hashtable; import java.util.Iterator; import java.util.List; @@ -47,6 +49,8 @@ import com.exploringxml.xml.Xparse; class Convert { + private static final String _TEMP = "_temp"; + /** * Helper class for index creation * @@ -119,7 +123,7 @@ class Convert final static int numIntervalls = 4; - static boolean debug = !false; + static boolean debug = false; static boolean isGUI = true; @@ -133,12 +137,16 @@ class Convert static Vector postSQLCommands = new Vector(); - static final String versionID = new String("FM2SQL Version 0.9.1b\n"); + static final String versionID = new String("FM2SQL Version 0.9.10b\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 @@ -266,7 +274,7 @@ class Convert // if vectors[1].get(i) != null) if (!layout.equals("")) { - + query = addLayoutToQuery(names, query, tbIndex, layout); } @@ -531,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()); @@ -580,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()); } } @@ -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() + "'"; @@ -712,6 +732,25 @@ 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) { @@ -728,6 +767,8 @@ class Convert } } catch (Error e) { + noError = false; + System.out.println(e); e.printStackTrace(); } @@ -735,6 +776,17 @@ class Convert } /** + * + * @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 @@ -786,41 +838,39 @@ class Convert throws Exception, SQLException { Vector row; - while ((row = bean.getNextRow()) != null) - { - j++; - Object obj = null; - for (int k = 0; k < row.size(); ++k) - { - obj = row.get(k); - - if (obj instanceof ArrayList) - obj = formatFileMakerArray((List) obj, delimiter); - - String str = (obj == null) ? "NULL" : obj.toString(); - if (obj instanceof Double) - { - pstm.setDouble(k + 1, ((Double) obj).doubleValue()); - } else if (!str.equals("NULL")) - pstm.setString(k + 1, str); - else - pstm.setNull(k + 1, Types.NULL); - } - pstm.execute(); - if (isGUI) - dialog.progress.setValue((int) (((double) (j + 1) / (double) rowCount) * 100.0)); - command = null; - } // to while loop + while ((row = bean.getNextRow()) != null) { + j++; + Object obj = null; + for (int k = 0; k < row.size(); ++k) { + obj = row.get(k); + + if (obj instanceof ArrayList) + obj = formatFileMakerArray((List) obj, delimiter); + + String str = (obj == null) ? "NULL" : obj.toString(); + if (obj instanceof Double) { + pstm.setDouble(k + 1, ((Double) obj).doubleValue()); + } else if (!str.equals("NULL")) + pstm.setString(k + 1, str); + else + pstm.setNull(k + 1, Types.NULL); + } + pstm.execute(); + if (isGUI) + dialog.progress + .setValue((int) (((double) (j + 1) / (double) rowCount) * 100.0)); + command = null; + } // to while loop return command; } /** - * removes special characters from the input string as well as .fp5 - * - * @param newName - * String to change - * @return - */ + * removes special characters from the input string as well as .fp5 + * + * @param newName + * String to change + * @return + */ public static String convertText(String newName) { StringBuffer alterMe = new StringBuffer(newName.trim().toLowerCase()); @@ -1079,7 +1129,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();) { @@ -1106,6 +1156,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) { @@ -1121,6 +1186,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(); @@ -1143,6 +1210,8 @@ class Convert selects = new Vector(); creates = new Vector(); ids = new Vector(); + destIDs = new Vector(); + preSQLCommands = new Vector(); postSQLCommands = new Vector(); @@ -1215,6 +1284,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); @@ -1246,7 +1316,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"); @@ -1254,11 +1326,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.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 !!"); @@ -1275,6 +1351,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(); @@ -1468,6 +1545,7 @@ class Convert */ public static class DataBase { + DBBean bean; Vector creates; @@ -1479,6 +1557,7 @@ class Convert Vector tables = new Vector(); Vector ids; + Vector destIDs; String delimiter = "//"; @@ -1545,7 +1624,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"; @@ -1823,7 +1904,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() + "'"; @@ -1848,7 +1929,6 @@ class Convert /** * synchronize method based on delete method code - * * @param source * @param destination * @param names @@ -1857,12 +1937,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!!!"); @@ -1893,6 +1975,7 @@ class Convert java.util.TreeSet myIdsDest = new TreeSet(); int deltaID = 1; String idField = ""; + String destIDField = ""; String destTableName = ""; try @@ -1913,7 +1996,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); @@ -1953,7 +2036,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(); @@ -1970,7 +2053,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()); @@ -1983,7 +2066,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); @@ -2017,7 +2100,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 @@ -2047,7 +2130,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 @@ -2066,7 +2149,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() + "'"; @@ -2132,7 +2215,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(); @@ -2180,7 +2263,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); @@ -2193,7 +2276,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) @@ -2223,7 +2306,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) {