--- FM2SQL/Attic/Convert.java 2004/08/04 11:53:08 1.67 +++ FM2SQL/Attic/Convert.java 2004/09/22 11:14:10 1.78 @@ -26,23 +26,53 @@ import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.net.URL; import java.sql.PreparedStatement; +import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Types; import java.text.ParseException; import java.util.ArrayList; +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; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JPanel; + import com.exploringxml.xml.Node; import com.exploringxml.xml.Xparse; class Convert { + /**Helper class for index creation + * @author rogo + * + */ + public static class IndexList extends Vector + { + public String toString() + { + StringBuffer buff = new StringBuffer(1000); + int count = 0; + for (Iterator iter = this.iterator(); iter.hasNext();) + { + String element = (String) iter.next(); + if (count < elementCount - 1) + { + buff.append(element).append(", "); + count++; + } else + buff.append(element); + + } + + return buff.toString(); + } + } static DBBean bean = new DBBean(); static DBBean beanDest = new DBBean(); @@ -51,7 +81,8 @@ class Convert static boolean batchRun = false; static Vector databases = new Vector(); final static int numHits = 5000; - final static int numIntervalls = 2; + final static int numIntervalls = 4; + static boolean debug = true; public static void main(String args[]) { /* try @@ -76,10 +107,12 @@ class Convert { e1.printStackTrace(); } - PrintStream stream = new PrintStream(file); - // System.setOut(stream); - //System.setErr(stream); - + PrintStream stream = new PrintStream(file, false); + if (!debug) + { + System.setOut(stream); + System.setErr(stream); + } readXMLFile(args[0]); if (!(new File(args[0]).exists())) System.exit(0); @@ -1127,6 +1160,7 @@ class Convert Vector selects = new Vector(); Vector creates = new Vector(); Vector ids = new Vector(); + Vector indexListVec = new Vector(); String delimiter = "|"; int mode = -1; @@ -1146,6 +1180,7 @@ class Convert selects = new Vector(); creates = new Vector(); ids = new Vector(); + indexListVec = new Vector(); // parse dataBase Node node = root.find("convert/source/database/url", new int[] { 1, 1, i, 1 }); Node node1 = root.find("convert/source/database/user", new int[] { 1, 1, i, 1, 1 }); @@ -1220,6 +1255,8 @@ class Convert String name = (String) node4.attributes.get("name"); String layout = (String) node4.attributes.get("layout"); String id = (String) node4.attributes.get("id"); + String indexList = (String) node4.attributes.get("indexList"); + System.out.println("id was " + id); if (name == null) throw new Error("parse error required table tag attribute name missing"); @@ -1227,11 +1264,15 @@ class Convert layout = ""; if (id == null) id = ""; + if (indexList == null) + indexList = ""; if (name.equals("")) throw new Error("parse error table tag attribute must not be empty"); tables.add(name); layouts.add(layout); + ids.add(id); + indexListVec.add(indexList); String query = (node5 == null) ? "" : node5.getCharacters(); if (query.equals("")) System.err.println("Warning empty select tag or select tag missing !!"); @@ -1245,6 +1286,7 @@ class Convert } DataBase dataBase = new DataBase(database, tables, layouts, selects, creates, ids, mode); dataBase.delimiter = delimiter; + dataBase.buildIndexTable(indexListVec); databases.add(dataBase); } DBBean database = new DBBean(); @@ -1268,12 +1310,12 @@ class Convert update(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates, db.ids, mode); else if (mode == DataBase.SYNCHRONIZE_MODE) { - user = bean.user; - passwd = bean.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); + synchronize(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates, db.ids, mode, db.delimiter, new Vector(db.htIndex.values())); } } // printContents(node3); @@ -1575,6 +1617,10 @@ class Convert Vector tables; Vector ids; String delimiter = "//"; + /** + * maps table name to index fields + */ + Hashtable htIndex = new Hashtable(); boolean useNormanToUnicodeMapper = false; final static int CONVERT_MODE = 1; @@ -1597,6 +1643,16 @@ class Convert this.bean.setIDVector(ids); } /** + * @param indexListVec + */ + public void buildIndexTable(Vector indexListVec) + { + for (int i = 0; i < tables.size(); i++) + { + fillIndexList((String) tables.get(i), (String) indexListVec.get(i)); + } + } + /** * writes the data contained in this object to the buffered writer * * @param buffr * @throws Exception @@ -1630,8 +1686,10 @@ class Convert String select = (String) selects.get(index); String create = (String) creates.get(index); String id = (String) ids.get(index); - - buffr.write(" \n"); + IndexList indexList = (IndexList) htIndex.get(table); + if (indexList == null) + indexList = new IndexList(); + buffr.write("
\n"); buffr.write(" \n"); if (!create.equals("")) buffr.write(" " + create + " \n"); @@ -1640,6 +1698,19 @@ class Convert } buffr.write(" \n"); } + + public void fillIndexList(String table, String list) + { + IndexList indexList = new IndexList(); + StringTokenizer tokenizer = new StringTokenizer(list, ","); + while (tokenizer.hasMoreTokens()) + { + indexList.add(tokenizer.nextToken()); + } + System.out.println(indexList); + + htIndex.put(table, indexList); + } public String toString() { return bean.url + " " + tables; @@ -1897,7 +1968,8 @@ class Convert */ // 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) throws Exception + public static void synchronize(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode, String delimiter, Vector indexList) + throws Exception { System.out.println(" bin in synchronize!!!"); FM2SQL.ProgressDialog dialog = null; @@ -1994,9 +2066,13 @@ class Convert int endIndex = -1; String tempQuery = query; String destQuery = query.replaceAll(names.get(tbIndex).toString(), destTableName); + destQuery = destQuery.replaceAll(bean.getQC(), beanDest.getQC()); + destQuery = removeLayoutPartFromQuery(destQuery, layouts.get(tbIndex).toString()); + // TODO remove layout part for destQuery String tempQueryDest = destQuery; // 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()); if (!idField.equals("")) { long startTime = System.currentTimeMillis(); @@ -2010,8 +2086,11 @@ class Convert 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); + + myIds = bean.getIDVector(ids.get(tbIndex).toString(), (String) names.get(tbIndex), tempQuery, 0); + myIdsDest = beanDest.getIDVector(convertText(idField), destTableName, tempQueryDest, 0); + //System.out.println("status of remove "+myIds.remove("b015892")); + System.out.println("ids found for "+idField+" "+!myIds.isEmpty()); if (myIds.isEmpty()) break; vec = new Vector(myIds); @@ -2019,7 +2098,7 @@ class Convert rowCount = vec.size(); // Deletion will work this way Vector deleted = new Vector(vec); - + TreeSet linesToAppend = new TreeSet(vec); linesToAppend.addAll(vec); linesToDelete = new TreeSet(vecDest); @@ -2027,8 +2106,8 @@ class Convert linesToAppend.removeAll(vecDest); // remove all lines that should not be deleted linesToDelete.removeAll(deleted); - System.out.println("linesToAppend " + linesToAppend + " " + destTableName); - System.out.println("linesToDelete " + linesToDelete + " " + destTableName); + System.out.println("linesToAppend " + linesToAppend.size() + " " + destTableName); + System.out.println("linesToDelete " + linesToDelete.size() + " " + destTableName); System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIds.size()); deltaID = (int) Math.round((double) myIds.size() / (double) numIntervalls); ConversionProperties prop = getFieldNamesAndDestTableName(creates.get(tbIndex).toString(), query, names.get(tbIndex).toString()); @@ -2037,10 +2116,10 @@ class Convert StringBuffer delCommand = createDeleteCommand(destTableName, tempIDdest); PreparedStatement insPst = beanDest.getConnection().prepareStatement(insCommand.toString()); PreparedStatement updPst = beanDest.getConnection().prepareStatement(updCommand.toString()); - // delPSt = beanDest.getConnection().prepareStatement(delCommand.toString()); - // delPSt.setString(1,"b015892"); - // delPSt.execute(); - // if (true) + delPSt = beanDest.getConnection().prepareStatement(delCommand.toString()); + // delPSt.setString(1,"b015892"); + // delPSt.execute(); + // if (true) // return; if (vec.size() <= numIntervalls) { @@ -2062,7 +2141,7 @@ class Convert if (dialog != null) dialog.title.setText("Writing table data ..."); - // performSynchronize(idField, vec, tempQuery, linesToDelete, linesToAppend, insPst, updPst, delPSt, deltaID, delimiter); + performSynchronize(idField, vec, tempQuery, linesToDelete, linesToAppend, insPst, updPst, delPSt, deltaID, delimiter); // System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIdsDest.size()); endIndex = k + deltaID; } @@ -2081,10 +2160,10 @@ class Convert System.out.println(tempQuery); if (dialog != null) dialog.title.setText("Reading table data ..."); - // bean.makeQuery(tempQuery, 0); + // bean.makeQuery(tempQuery, 0); if (dialog != null) dialog.title.setText("Writing table data ..."); - // performSynchronize(idField, vec, tempQuery, linesToDelete, linesToAppend, insPst, updPst, delPSt, deltaID, delimiter); + performSynchronize(idField, vec, tempQuery, linesToDelete, linesToAppend, insPst, updPst, delPSt, deltaID, delimiter); // System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIdsDest.size()); } // prepare new query for next chunk @@ -2094,7 +2173,50 @@ class Convert tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'"; } - + String tableName = names.get(tbIndex).toString(); + IndexList idList = (IndexList) indexList.get(0); + System.out.println("found list " + idList); + Statement stm = beanDest.getConnection().createStatement(); + Vector destTables = beanDest.getTableNames(); + System.out.println("tempQueryDest" + tempQueryDest); + beanDest.makeQuery(tempQueryDest, 0); + for (Iterator iter = idList.iterator(); iter.hasNext();) + { + String indexField = (String) iter.next(); + indexField = convertText(indexField); + String indexName = destTableName + "_" + indexField; + if (destTables.contains(indexName)) + { + stm.execute("DROP INDEX " + destTableName + "_" + indexField); + // continue; + } + // stm.execute("DROP INDEX "+destTableName+"_"+indexField); + + String type = beanDest.getColumnType(indexField).toLowerCase(); + // System.out.println(indexField+" "+type+" "+(type.indexOf("text") >= 0 || type.indexOf("varchar") >= 0 || type.indexOf("char") >= 0)); + if (type.indexOf("text") >= 0 || type.indexOf("varchar") >= 0 || type.indexOf("char") >= 0) + { + if (beanDest.url.indexOf("mysql") >= 0) + { + //System.out.println("CREATE INDEX " + indexName + " ON " + destTableName + " (" + indexField + "(10))"); + // TODO problem if index exist !!! + stm.execute("CREATE INDEX " + indexName + " ON " + destTableName + " (" + indexField + "(10))"); + } else + { + stm.execute("CREATE INDEX " + indexName + " ON " + destTableName + " (lower( " + indexField + "))"); + + } + + } else + { + stm.execute("CREATE INDEX " + destTableName + "_" + indexField + " ON " + destTableName + "(" + indexField + ")"); + + } + + // stm.execute("DROP INDEX "+destTableName+"_"+indexField); + + } + // CREATE UNIQUE INDEX title_idx ON films (title); for (Iterator iter = linesToDelete.iterator(); iter.hasNext();) { String id = (String) iter.next(); @@ -2133,6 +2255,18 @@ class Convert dialog.setVisible(false); } } + /** + * @param destQuery + * @param string + * @return + */ + private static String removeLayoutPartFromQuery(String destQuery, String layoutName) + { + String removeString = "layout " + beanDest.getQC() + layoutName + beanDest.getQC(); + destQuery = destQuery.replaceFirst(removeString, ""); + System.out.println("destQuery change to " + destQuery); + return destQuery; + } private static void performSynchronize( String idField, Vector vec, @@ -2148,6 +2282,7 @@ class Convert { Vector[] vectors = bean.getQueryData(tempQuery, deltaID); int idIndex = vectors[1].indexOf(idField); + System.out.println(idIndex+" "+vectors[1]+" "+idField); // todo arraylist code has to be added for (Iterator iter = vectors[0].iterator(); iter.hasNext();) { @@ -2182,11 +2317,11 @@ class Convert updPst.setNull(l + 1, Types.NULL); } updPst.setString(line.size() + 1, line.get(idIndex).toString()); + //updPst.addBatch(); updPst.execute(); - } } - + //updPst.executeBatch(); } // to method /** @@ -3708,7 +3843,7 @@ class Convert while (tokenizer.hasMoreTokens()) { String fieldName = tokenizer.nextToken().trim(); - fieldNames[fieldIndex] = convertText(fieldName); + fieldNames[fieldIndex] = beanDest.getQC() + convertText(fieldName) + beanDest.getQC(); // System.out.println("field "+ fieldNames[fieldIndex]); fieldIndex++; } @@ -3721,7 +3856,7 @@ class Convert for (Iterator iter = fieldNamesVec.iterator(); iter.hasNext();) { String element = (String) iter.next(); - fieldNames[++fieldIndex] = bean.getQC() + convertText(element) + bean.getQC(); + fieldNames[++fieldIndex] = beanDest.getQC() + convertText(element) + beanDest.getQC(); // System.out.println("field " + fieldNames[fieldIndex]); } } @@ -3788,4 +3923,61 @@ class Convert command.append("WHERE " + idField + " = ?"); return command; } +public void makeTest(String table,String idField,String tempQuery) throws Exception +{ + int counter=0; + + // ****** test code ***** + + bean.getConnection(); + ResultSet resultSet=null; + String lastResult ="P227634.11";//"P227625.79554";//"P227625.77391";//"P116034.970998"; + String myQuery="select "+bean.getQC()+idField+bean.getQC()+",serial "+" from "+bean.getQC()+table+bean.getQC(); + System.out.println("Query is now "+myQuery); + JDialog statusDialog=new JDialog(); + statusDialog.setTitle("Status Information"); + JLabel status=new JLabel("actual DataSet : "); + JLabel status2=new JLabel(Integer.toString(++counter)); + JLabel status3=new JLabel(lastResult); + + JPanel statusPanel = new JPanel(); + JPanel statusPanel2 = new JPanel(); + statusPanel.add(status); + statusPanel.add(status2); + statusPanel2.add(status3); + statusDialog.getContentPane().add(statusPanel,"North"); + statusDialog.getContentPane().add(statusPanel2,"Center"); + statusDialog.setLocation(400,500); + statusDialog.setSize(300,150); + statusDialog.setVisible(true); + while (true) + { + if (!statusDialog.isVisible()) + statusDialog.setVisible(true); + tempQuery = myQuery + " where " + bean.getQC() + idField + bean.getQC() + ">'" + lastResult + "'"; + resultSet = bean.makeQuery(tempQuery, 1); + if (resultSet == null) + { + System.out.println("lastResult was " + lastResult + " counter was " + counter); + break; + } else + { + resultSet.next(); + lastResult = resultSet.getString(1); + counter++; + status2.setText(Integer.toString(counter)); + status3.setText(lastResult+" "+resultSet.getString(2)); + if(counter%100==0) + { + System.out.println("actual Result was " + lastResult + " counter was " + counter); + // break; + } + } + resultSet = null; + } + System.exit(0); + + //****** end Test ****** + +} } \ No newline at end of file