Diff for /FM2SQL/Attic/Convert.java between versions 1.66 and 1.76

version 1.66, 2004/08/03 11:41:16 version 1.76, 2004/08/18 11:14:51
Line 31  import java.sql.Statement; Line 31  import java.sql.Statement;
 import java.sql.Types;  import java.sql.Types;
 import java.text.ParseException;  import java.text.ParseException;
 import java.util.ArrayList;  import java.util.ArrayList;
   import java.util.Hashtable;
 import java.util.Iterator;  import java.util.Iterator;
 import java.util.List;  import java.util.List;
 import java.util.Properties;  
 import java.util.StringTokenizer;  import java.util.StringTokenizer;
 import java.util.TreeSet;  import java.util.TreeSet;
 import java.util.Vector;  import java.util.Vector;
Line 43  import com.exploringxml.xml.Xparse; Line 43  import com.exploringxml.xml.Xparse;
   
 class Convert  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 bean = new DBBean();
   static DBBean beanDest = new DBBean();    static DBBean beanDest = new DBBean();
   
Line 51  class Convert Line 76  class Convert
   static boolean batchRun = false;    static boolean batchRun = false;
   static Vector databases = new Vector();    static Vector databases = new Vector();
   final static int numHits = 5000;    final static int numHits = 5000;
   final static int numIntervalls = 2;    final static int numIntervalls = 4;
     static boolean debug = false;
   public static void main(String args[])    public static void main(String args[])
   {    {
     /*    try      /*    try
Line 76  class Convert Line 102  class Convert
     {      {
       e1.printStackTrace();        e1.printStackTrace();
     }      }
     PrintStream stream = new PrintStream(file);      PrintStream stream = new PrintStream(file, false);
     // System.setOut(stream);      if (!debug)
     //System.setErr(stream);      {
         System.setOut(stream);
         System.setErr(stream);
       }
     readXMLFile(args[0]);      readXMLFile(args[0]);
     if (!(new File(args[0]).exists()))      if (!(new File(args[0]).exists()))
       System.exit(0);        System.exit(0);
Line 1127  class Convert Line 1155  class Convert
     Vector selects = new Vector();      Vector selects = new Vector();
     Vector creates = new Vector();      Vector creates = new Vector();
     Vector ids = new Vector();      Vector ids = new Vector();
       Vector indexListVec = new Vector();
     String delimiter = "|";      String delimiter = "|";
     int mode = -1;      int mode = -1;
   
Line 1146  class Convert Line 1175  class Convert
         selects = new Vector();          selects = new Vector();
         creates = new Vector();          creates = new Vector();
         ids = new Vector();          ids = new Vector();
           indexListVec = new Vector();
         // parse dataBase          // parse dataBase
         Node node = root.find("convert/source/database/url", new int[] { 1, 1, i, 1 });          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 });          Node node1 = root.find("convert/source/database/user", new int[] { 1, 1, i, 1, 1 });
Line 1220  class Convert Line 1250  class Convert
           String name = (String) node4.attributes.get("name");            String name = (String) node4.attributes.get("name");
           String layout = (String) node4.attributes.get("layout");            String layout = (String) node4.attributes.get("layout");
           String id = (String) node4.attributes.get("id");            String id = (String) node4.attributes.get("id");
             String indexList = (String) node4.attributes.get("indexList");
   
           System.out.println("id was " + id);            System.out.println("id was " + id);
           if (name == null)            if (name == null)
             throw new Error("parse error required table tag attribute name missing");              throw new Error("parse error required table tag attribute name missing");
Line 1227  class Convert Line 1259  class Convert
             layout = "";              layout = "";
           if (id == null)            if (id == null)
             id = "";              id = "";
             if (indexList == null)
               indexList = "";
           if (name.equals(""))            if (name.equals(""))
             throw new Error("parse error table tag attribute must not be empty");              throw new Error("parse error table tag attribute must not be empty");
           tables.add(name);            tables.add(name);
           layouts.add(layout);            layouts.add(layout);
   
           ids.add(id);            ids.add(id);
             indexListVec.add(indexList);
           String query = (node5 == null) ? "" : node5.getCharacters();            String query = (node5 == null) ? "" : node5.getCharacters();
           if (query.equals(""))            if (query.equals(""))
             System.err.println("Warning empty select tag or  select tag missing !!");              System.err.println("Warning empty select tag or  select tag missing !!");
Line 1245  class Convert Line 1281  class Convert
         }          }
         DataBase dataBase = new DataBase(database, tables, layouts, selects, creates, ids, mode);          DataBase dataBase = new DataBase(database, tables, layouts, selects, creates, ids, mode);
         dataBase.delimiter = delimiter;          dataBase.delimiter = delimiter;
           dataBase.buildIndexTable(indexListVec);
         databases.add(dataBase);          databases.add(dataBase);
       }        }
       DBBean database = new DBBean();        DBBean database = new DBBean();
Line 1273  class Convert Line 1310  class Convert
           userDest = database.user;            userDest = database.user;
           passwdDest = database.passwd;            passwdDest = database.passwd;
   
           synchronize(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates, db.ids, mode);            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);        // printContents(node3);
Line 1575  class Convert Line 1612  class Convert
     Vector tables;      Vector tables;
     Vector ids;      Vector ids;
     String delimiter = "//";      String delimiter = "//";
       /**
        * maps table name to index fields
        */
       Hashtable htIndex = new Hashtable();
     boolean useNormanToUnicodeMapper = false;      boolean useNormanToUnicodeMapper = false;
   
     final static int CONVERT_MODE = 1;      final static int CONVERT_MODE = 1;
Line 1597  class Convert Line 1638  class Convert
       this.bean.setIDVector(ids);        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       * writes the data contained in this object to the buffered writer
      * * @param buffr       * * @param buffr
      * @throws Exception       * @throws Exception
Line 1630  class Convert Line 1681  class Convert
         String select = (String) selects.get(index);          String select = (String) selects.get(index);
         String create = (String) creates.get(index);          String create = (String) creates.get(index);
         String id = (String) ids.get(index);          String id = (String) ids.get(index);
           IndexList indexList = (IndexList) htIndex.get(table);
         buffr.write("      <table name = \"" + table + "\" layout = \"" + layout + "\" id = \"" + id + "\" >\n");          if (indexList == null)
             indexList = new IndexList();
           buffr.write("      <table name = \"" + table + "\" layout = \"" + layout + "\" id = \"" + id + "\" indexList =\"" + indexList + "\">\n");
         buffr.write("         <select>" + convertToEntities(select) + "</select>\n");          buffr.write("         <select>" + convertToEntities(select) + "</select>\n");
         if (!create.equals(""))          if (!create.equals(""))
           buffr.write("         <create>" + create + "         </create>\n");            buffr.write("         <create>" + create + "         </create>\n");
Line 1640  class Convert Line 1693  class Convert
       }        }
       buffr.write("    </database>\n");        buffr.write("    </database>\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()      public String toString()
     {      {
       return bean.url + " " + tables;        return bean.url + " " + tables;
Line 1897  class Convert Line 1963  class Convert
    */     */
   // TODO implement append,update and delete in one method    // TODO implement append,update and delete in one method
   // TODO using id based algorithm    // 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    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!!!");      System.out.println(" bin in synchronize!!!");
     FM2SQL.ProgressDialog dialog = null;      FM2SQL.ProgressDialog dialog = null;
Line 1994  class Convert Line 2061  class Convert
         int endIndex = -1;          int endIndex = -1;
         String tempQuery = query;          String tempQuery = query;
         String destQuery = query.replaceAll(names.get(tbIndex).toString(), destTableName);          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;          String tempQueryDest = destQuery;
         // remove extra query parts destQuery.substring(0,destQuery.lastIndexOf(destTableName)+destTableName.length()+1);          // remove extra query parts destQuery.substring(0,destQuery.lastIndexOf(destTableName)+destTableName.length()+1);
         System.out.println("new Query " + tempQueryDest);          System.out.println("new Query " + tempQueryDest);
Line 2010  class Convert Line 2080  class Convert
               dialog.title.setText("Check if data  is available");                dialog.title.setText("Check if data  is available");
             else if (dialog != null)              else if (dialog != null)
               dialog.title.setText("Check if more  data  is available");                dialog.title.setText("Check if more  data  is available");
             myIds = bean.getIDVector(ids.get(tbIndex).toString(), (String) names.get(tbIndex), tempQuery, numHits);              myIds = bean.getIDVector(ids.get(tbIndex).toString(), (String) names.get(tbIndex), tempQuery, 0);
             myIdsDest = beanDest.getIDVector(convertText(idField), destTableName, tempQueryDest, numHits);              myIdsDest = beanDest.getIDVector(convertText(idField), destTableName, tempQueryDest, 0);
               //System.out.println("status of remove  "+myIds.remove("b015892"));
             if (myIds.isEmpty())              if (myIds.isEmpty())
               break;                break;
             vec = new Vector(myIds);              vec = new Vector(myIds);
Line 2019  class Convert Line 2090  class Convert
             rowCount = vec.size();              rowCount = vec.size();
             // Deletion will work this way              // Deletion will work this way
             Vector deleted = new Vector(vec);              Vector deleted = new Vector(vec);
             linesToDelete = new TreeSet(vecDest);  
   
             TreeSet linesToAppend = new TreeSet(vec);              TreeSet linesToAppend = new TreeSet(vec);
               linesToAppend.addAll(vec);
               linesToDelete = new TreeSet(vecDest);
             // remove all lines that are already in dest database              // remove all lines that are already in dest database
             linesToAppend.removeAll(vecDest);              linesToAppend.removeAll(vecDest);
             // remove all lines that should not be deleted              // remove all lines that should not be deleted
             linesToDelete.removeAll(deleted);              linesToDelete.removeAll(deleted);
             System.out.println("linesToAppend " + linesToAppend + " " + vecDest + " " + destTableName);              System.out.println("linesToAppend " + linesToAppend + " " + destTableName);
             System.out.println("linesToDelete " + linesToDelete + " " + vecDest + " " + destTableName);              System.out.println("linesToDelete " + linesToDelete + " " + destTableName);
             System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIds.size());              System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIds.size());
             deltaID = (int) Math.round((double) myIds.size() / (double) numIntervalls);              deltaID = (int) Math.round((double) myIds.size() / (double) numIntervalls);
             ConversionProperties prop = getFieldNamesAndDestTableName(creates.get(tbIndex).toString(), query, names.get(tbIndex).toString());              ConversionProperties prop = getFieldNamesAndDestTableName(creates.get(tbIndex).toString(), query, names.get(tbIndex).toString());
             StringBuffer insCommand = createInsertCommand(prop.destTableName, prop.fieldNames);              StringBuffer insCommand = createInsertCommand(prop.destTableName, prop.fieldNames);
             StringBuffer updCommand = createUpdateCommand(prop.destTableName, prop.fieldNames, tempID);              StringBuffer updCommand = createUpdateCommand(prop.destTableName, prop.fieldNames, tempIDdest);
             StringBuffer delCommand = createDeleteCommand(destTableName, tempID);              StringBuffer delCommand = createDeleteCommand(destTableName, tempIDdest);
             PreparedStatement insPst = beanDest.getConnection().prepareStatement(insCommand.toString());              PreparedStatement insPst = beanDest.getConnection().prepareStatement(insCommand.toString());
             PreparedStatement updPst = beanDest.getConnection().prepareStatement(updCommand.toString());              PreparedStatement updPst = beanDest.getConnection().prepareStatement(updCommand.toString());
             delPSt = beanDest.getConnection().prepareStatement(delCommand.toString());              delPSt = beanDest.getConnection().prepareStatement(delCommand.toString());
               //    delPSt.setString(1,"b015892");
               //   delPSt.execute();
               //  if (true)
               //  return;
             if (vec.size() <= numIntervalls)              if (vec.size() <= numIntervalls)
             {              {
               endIndex = 0;                endIndex = 0;
Line 2058  class Convert Line 2133  class Convert
               if (dialog != null)                if (dialog != null)
                 dialog.title.setText("Writing table data ...");                  dialog.title.setText("Writing table data ...");
   
               performSynchronize(idField, vec, tempQuery, linesToDelete, linesToAppend, insPst, updPst, delPSt, deltaID);                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());                // System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIdsDest.size());
               endIndex = k + deltaID;                endIndex = k + deltaID;
             }              }
Line 2077  class Convert Line 2152  class Convert
               System.out.println(tempQuery);                System.out.println(tempQuery);
               if (dialog != null)                if (dialog != null)
                 dialog.title.setText("Reading table data ...");                  dialog.title.setText("Reading table data ...");
               bean.makeQuery(tempQuery, 0);                //    bean.makeQuery(tempQuery, 0);
               if (dialog != null)                if (dialog != null)
                 dialog.title.setText("Writing table data ...");                  dialog.title.setText("Writing table data ...");
               performSynchronize(idField, vec, tempQuery, linesToDelete, linesToAppend, insPst, updPst, delPSt, deltaID);                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());                // System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIdsDest.size());
             }              }
             // prepare new query for next chunk              // prepare new query for next chunk
Line 2090  class Convert Line 2165  class Convert
               tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'";                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();)            for (Iterator iter = linesToDelete.iterator(); iter.hasNext();)
           {            {
             String id = (String) iter.next();              String id = (String) iter.next();
Line 2106  class Convert Line 2225  class Convert
     } catch (Exception e)      } catch (Exception e)
     {      {
       System.out.println("Error while connecting to database " + e);        System.out.println("Error while connecting to database " + e);
         e.printStackTrace();
       if (dialog != null)        if (dialog != null)
       {        {
         dialog.setVisible(false);          dialog.setVisible(false);
Line 2127  class Convert Line 2247  class Convert
       dialog.setVisible(false);        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(    private static void performSynchronize(
     String idField,      String idField,
     Vector vec,      Vector vec,
Line 2136  class Convert Line 2268  class Convert
     PreparedStatement insPst,      PreparedStatement insPst,
     PreparedStatement updPst,      PreparedStatement updPst,
     PreparedStatement delPSt,      PreparedStatement delPSt,
     int deltaID)      int deltaID,
       String delimiter)
     throws SQLException, ParseException      throws SQLException, ParseException
   {    {
     Vector[] vectors = bean.getQueryData(tempQuery, deltaID);      Vector[] vectors = bean.getQueryData(tempQuery, deltaID);
Line 2146  class Convert Line 2279  class Convert
     {      {
       Vector line = (Vector) iter.next();        Vector line = (Vector) iter.next();
       Object lineIDIndex = line.get(idIndex);        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(line.get(idIndex)) + " " + lineIDIndex);
       if (linesToAppend.contains(lineIDIndex))        if (linesToAppend.contains(lineIDIndex))
       {        {
         for (int l = 0; l < line.size(); ++l)          for (int l = 0; l < line.size(); ++l)
         {          {
           Object obj = line.get(l);            Object obj = line.get(l);
             if (obj instanceof ArrayList)
               obj = formatFileMakerArray((List) obj, delimiter);
           if (obj != null)            if (obj != null)
             insPst.setString(l + 1, obj.toString());              insPst.setString(l + 1, obj.toString());
           else            else
Line 2164  class Convert Line 2300  class Convert
         for (int l = 0; l < line.size(); ++l)          for (int l = 0; l < line.size(); ++l)
         {          {
           Object obj = line.get(l);            Object obj = line.get(l);
             if (obj instanceof ArrayList)
               obj = formatFileMakerArray((List) obj, delimiter);
           if (obj != null)            if (obj != null)
             updPst.setString(l + 1, obj.toString());              updPst.setString(l + 1, obj.toString());
           else            else
             updPst.setNull(l + 1, Types.NULL);              updPst.setNull(l + 1, Types.NULL);
         }          }
         updPst.setString(line.size() + 1, line.get(idIndex).toString());          updPst.setString(line.size() + 1, line.get(idIndex).toString());
           //updPst.addBatch();
         updPst.execute();          updPst.execute();
   
       }        }
     }      }
       //updPst.executeBatch();
   } // to method    } // to method
   
   /**    /**
Line 3696  class Convert Line 3834  class Convert
         while (tokenizer.hasMoreTokens())          while (tokenizer.hasMoreTokens())
         {          {
           String fieldName = tokenizer.nextToken().trim();            String fieldName = tokenizer.nextToken().trim();
           fieldNames[fieldIndex] = convertText(fieldName);            fieldNames[fieldIndex] = beanDest.getQC() + convertText(fieldName) + beanDest.getQC();
           // System.out.println("field "+ fieldNames[fieldIndex]);            // System.out.println("field "+ fieldNames[fieldIndex]);
           fieldIndex++;            fieldIndex++;
         }          }
Line 3709  class Convert Line 3847  class Convert
         for (Iterator iter = fieldNamesVec.iterator(); iter.hasNext();)          for (Iterator iter = fieldNamesVec.iterator(); iter.hasNext();)
         {          {
           String element = (String) iter.next();            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]);            // System.out.println("field " + fieldNames[fieldIndex]);
         }          }
       }        }

Removed from v.1.66  
changed lines
  Added in v.1.76


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>