--- FM2SQL/Attic/Convert.java 2004/07/09 10:26:39 1.60 +++ FM2SQL/Attic/Convert.java 2004/07/28 11:21:01 1.64 @@ -25,7 +25,6 @@ import java.io.OutputStreamWriter; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.net.URL; -import java.net.URLConnection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; @@ -572,81 +571,10 @@ class Convert // System.exit(0); // 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("("); - int endIndex = create.indexOf(")", toIndex); - - destTableName = create.substring(fromIndex, toIndex).replaceAll(beanDest.getQC(), "").trim(); - System.out.println("destTable " + destTableName); - // retrieve field_names from select statement - if (query.indexOf("*") < 0) - { - int selectEndIndex = query.indexOf("from"); - StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ","); - int numFields = tokenizer.countTokens(); - fieldNames = new String[numFields]; - int fieldIndex = 0; - while (tokenizer.hasMoreTokens()) - { - String fieldName = tokenizer.nextToken().trim(); - fieldNames[fieldIndex] = convertText(fieldName); - System.out.println(fieldNames[fieldIndex]); - fieldIndex++; - } - - } else - { - // use create statement for field names - StringTokenizer tokenizer = new StringTokenizer(create.substring(toIndex + 1, endIndex), ","); - int numFields = tokenizer.countTokens(); - fieldNames = new String[numFields]; - int fieldIndex = 0; - while (tokenizer.hasMoreTokens()) - { - String fieldName = tokenizer.nextToken().trim(); - int index = fieldName.lastIndexOf(" "); - fieldNames[fieldIndex] = fieldName.substring(0, index); - System.out.println(fieldNames[fieldIndex]); - fieldIndex++; - } - } - } else - { - destTableName = convertText(names.get(tbIndex).toString()); - - // retrieve field_names from select statement - if (query.indexOf("*") < 0) - { - int selectEndIndex = query.indexOf("from"); - StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ","); - int numFields = tokenizer.countTokens(); - fieldNames = new String[numFields]; - int fieldIndex = 0; - while (tokenizer.hasMoreTokens()) - { - String fieldName = tokenizer.nextToken().trim(); - fieldNames[fieldIndex] = convertText(fieldName); - // System.out.println("field "+ fieldNames[fieldIndex]); - fieldIndex++; - } - - } else - { - Vector fieldNamesVec = bean.getColumnNames(); - fieldNames = new String[fieldNamesVec.size()]; - int fieldIndex = -1; - for (Iterator iter = fieldNamesVec.iterator(); iter.hasNext();) - { - String element = (String) iter.next(); - fieldNames[++fieldIndex] = bean.getQC() + convertText(element) + bean.getQC(); - // System.out.println("field " + fieldNames[fieldIndex]); - } - } - } - if (mode == Convert.DataBase.CONVERT_MODE) + ConversionProperties prop= getFieldNamesAndDestTableName(creates.get(tbIndex).toString(),query,names.get(tbIndex).toString()); + destTableName = prop.destTableName; + fieldNames = prop.fieldNames; + if (mode == Convert.DataBase.CONVERT_MODE) { if (tables.indexOf(destTableName) >= 0) @@ -1262,6 +1190,8 @@ class Convert mode = DataBase.UPDATE_MODE; else if (modeString.equals("delete")) mode = DataBase.DELETE_MODE; + else if (modeString.equals("synchronize")) + mode = DataBase.SYNCHRONIZE_MODE; // if(node3!=null) // System.out.println(node3.name); @@ -1330,11 +1260,20 @@ class Convert for (Iterator iter = databases.iterator(); iter.hasNext();) { DataBase db = (DataBase) iter.next(); - if (mode != DataBase.UPDATE_MODE) + 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 - update(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates, db.ids, mode); - + if (mode == DataBase.UPDATE_MODE) + 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; + userDest =database.user; + passwdDest =database.passwd; + + synchronize(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates, db.ids, mode); + } } // printContents(node3); // FM2SQL.fmInstance=new FM2SQL(); @@ -1594,7 +1533,28 @@ class Convert e.printStackTrace(); } } - + /** + * Helper class for Conversion etc + * Holds the some data + * @author rogo + * + */ + + public static class ConversionProperties + { + String destTableName; + String[] fieldNames ; + public ConversionProperties() + { + } + public ConversionProperties(String destTableName, String[] fieldNames) + { + this.destTableName = destTableName; + this.fieldNames = fieldNames; + + } + + } /** * Helper class for XML-File parsing * Holds the parsed data @@ -1616,7 +1576,8 @@ class Convert final static int APPEND_MODE = 2; final static int UPDATE_MODE = 3; final static int DELETE_MODE = 4; - + final static int SYNCHRONIZE_MODE = 5; + int mode = -1; public DataBase(DBBean bean, Vector tables, Vector layouts, Vector selects, Vector creates, Vector ids, int mode) @@ -1934,11 +1895,12 @@ class Convert // 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 { + System.out.println(" bin in synchronize!!!"); FM2SQL.ProgressDialog dialog = null; if (FM2SQL.fmInstance != null) { dialog = new FM2SQL.ProgressDialog(FM2SQL.fmInstance, bean); - dialog.setTitle("Conversion running ..."); + dialog.setTitle("Synchronize 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)); @@ -1979,7 +1941,7 @@ 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("")) { layout = " layout " + bean.getQC() + layout + bean.getQC(); String name = names.get(tbIndex).toString(); @@ -1989,10 +1951,12 @@ class Convert System.out.println("added layout " + query); } + if(dialog!=null) { 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(); @@ -2049,12 +2013,36 @@ class Convert // Deletion will work this way Vector deleted = new Vector(vec); Vector linesToDelete = new Vector(vecDest); + + TreeSet linesToAppend = new TreeSet(vec); + // remove all lines that are already in dest database + linesToAppend.removeAll(vecDest); // remove all lines that should not be deleted linesToDelete.removeAll(deleted); + System.out.println("linesToAppend "+linesToAppend+" "+vecDest+" "+destTableName); + System.out.println("linesToDelete "+linesToDelete+" "+vecDest+" "+destTableName); + // prepare new query for next chunk + if (query.indexOf("where") > 0) + tempQuery = query + " and " + tempID + ">='" + vec.firstElement() + "' and "+tempID + "<='" + vec.lastElement() + "' order by "+tempID; + else + tempQuery = query + " where " + tempID + ">='" + vec.firstElement() + "' and "+tempID + "<='" + vec.lastElement() + "'";// order by "+tempID; + System.out.println("tempQuery is now "+tempQuery+" order by "+tempID); + // bean.makeQuery(tempQuery,vec.size()); + Vector[] vectors=bean.getQueryData(tempQuery,vec.size()); + int idIndex = vectors[1].indexOf(idField); + for (Iterator iter = vectors[0].iterator(); iter.hasNext();) + { + Vector line = (Vector) iter.next(); + System.out.println("line "+linesToAppend.contains(line.get(idIndex))); + } + System.out.println( ); // 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); + System.out.println("deltaID "+deltaID); + System.exit(0); + beanDest.setConnection(destination); Statement stm = beanDest.getConnection().createStatement(); @@ -2645,6 +2633,85 @@ class Convert } return buf.toString(); } + public static ConversionProperties getFieldNamesAndDestTableName(String create,String query,String tableName ) + { + String[] fieldNames = null; + String destTableName = null; + // determine destTableName from createStatement or from source table name + if (!create.equals("")) + { + int fromIndex = create.toLowerCase().indexOf("table") + 5; + int toIndex = create.indexOf("("); + int endIndex = create.indexOf(")", toIndex); + + destTableName = create.substring(fromIndex, toIndex).replaceAll(beanDest.getQC(), "").trim(); + System.out.println("destTable " + destTableName); + // retrieve field_names from select statement + // TODO problem with different fieldNames in create statement will overwrite them + if (query.indexOf("*") < 0) + { + int selectEndIndex = query.indexOf("from"); + StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ","); + int numFields = tokenizer.countTokens(); + fieldNames = new String[numFields]; + int fieldIndex = 0; + while (tokenizer.hasMoreTokens()) + { + String fieldName = tokenizer.nextToken().trim(); + fieldNames[fieldIndex] = convertText(fieldName); + System.out.println(fieldNames[fieldIndex]); + fieldIndex++; + } + } else + { + // use create statement for field names + StringTokenizer tokenizer = new StringTokenizer(create.substring(toIndex + 1, endIndex), ","); + int numFields = tokenizer.countTokens(); + fieldNames = new String[numFields]; + int fieldIndex = 0; + while (tokenizer.hasMoreTokens()) + { + String fieldName = tokenizer.nextToken().trim(); + int index = fieldName.lastIndexOf(" "); + fieldNames[fieldIndex] = fieldName.substring(0, index); + System.out.println(fieldNames[fieldIndex]); + fieldIndex++; + } + } + } else + { + destTableName = convertText(tableName); + // retrieve field_names from select statement + if (query.indexOf("*") < 0) + { + int selectEndIndex = query.indexOf("from"); + StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ","); + int numFields = tokenizer.countTokens(); + fieldNames = new String[numFields]; + int fieldIndex = 0; + while (tokenizer.hasMoreTokens()) + { + String fieldName = tokenizer.nextToken().trim(); + fieldNames[fieldIndex] = convertText(fieldName); + // System.out.println("field "+ fieldNames[fieldIndex]); + fieldIndex++; + } + + } else + { + Vector fieldNamesVec = bean.getColumnNames(); + fieldNames = new String[fieldNamesVec.size()]; + int fieldIndex = -1; + for (Iterator iter = fieldNamesVec.iterator(); iter.hasNext();) + { + String element = (String) iter.next(); + fieldNames[++fieldIndex] = bean.getQC() + convertText(element) + bean.getQC(); + // System.out.println("field " + fieldNames[fieldIndex]); + } + } + } + return new ConversionProperties(destTableName,fieldNames); + } } \ No newline at end of file