Diff for /FM2SQL/Attic/Convert.java between versions 1.35 and 1.64

version 1.35, 2004/02/17 09:30:15 version 1.64, 2004/07/28 11:21:01
Line 1 Line 1
 import java.util.*;  /*
 import java.sql.*;   * Convert.java -- Converter class -  Filemaker to SQL Converter 
    * Copyright (C) 2003 Robert Gordesch (rogo@mpiwg-berlin.mpg.de
    * This program is free software; you can redistribute it and/or modify it
    * under the terms of the GNU General Public License as published by the Free
    * Software Foundation; either version 2 of the License, or (at your option)
    * any later version.  Please read license.txt for the full details. A copy of
    * the GPL may be found at http://www.gnu.org/copyleft/lgpl.html  You should
    * have received a copy of the GNU General Public License along with this
    * program; if not, write to the Free Software Foundation, Inc., 59 Temple
    * Place, Suite 330, Boston, MA 02111-1307 USA  Created on 15.09.2003 by
    * rogo  
    */
   
 import java.awt.Cursor;  import java.awt.Cursor;
 import java.io.BufferedReader;  import java.io.BufferedReader;
 import java.io.BufferedWriter;  import java.io.BufferedWriter;
Line 7  import java.io.File; Line 19  import java.io.File;
 import java.io.FileInputStream;  import java.io.FileInputStream;
 import java.io.FileNotFoundException;  import java.io.FileNotFoundException;
 import java.io.FileOutputStream;  import java.io.FileOutputStream;
   import java.io.InputStream;
 import java.io.InputStreamReader;  import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;  import java.io.OutputStreamWriter;
 import java.io.PrintStream;  import java.io.PrintStream;
 import java.io.UnsupportedEncodingException;  import java.io.UnsupportedEncodingException;
   import java.net.URL;
   import java.sql.PreparedStatement;
   import java.sql.SQLException;
   import java.sql.Statement;
   import java.sql.Types;
   import java.util.ArrayList;
   import java.util.Iterator;
   import java.util.List;
   import java.util.StringTokenizer;
   import java.util.TreeSet;
   import java.util.Vector;
   
 import com.exploringxml.xml.Node;  import com.exploringxml.xml.Node;
 import com.exploringxml.xml.Xparse;  import com.exploringxml.xml.Xparse;
Line 43  class Convert Line 67  class Convert
       System.out.println("Usage: java Convert <xml config file>");        System.out.println("Usage: java Convert <xml config file>");
       System.exit(-1);        System.exit(-1);
     }      }
     if (!(new File(args[0]).exists()))  
       System.exit(0);  
     try      try
     {      {
       file = new FileOutputStream("./log.txt");        file = new FileOutputStream("./log.txt");
Line 53  class Convert Line 75  class Convert
       e1.printStackTrace();        e1.printStackTrace();
     }      }
     PrintStream stream = new PrintStream(file);      PrintStream stream = new PrintStream(file);
     System.setOut(stream);     // System.setOut(stream);
     System.setErr(stream);      //System.setErr(stream);
   
     readXMLFile(args[0]);      readXMLFile(args[0]);
       if (!(new File(args[0]).exists()))
         System.exit(0);
   
     System.out.println("Finished!");      System.out.println("Finished!");
     //convert("jdbc:fmpro:http://141.14.237.74:8050","jdbc:postgresql://erebos/test",null,null);      //convert("jdbc:fmpro:http://141.14.237.74:8050","jdbc:postgresql://erebos/test",null,null);
   }    }
   public static void convertBatch(DBBean source, DBBean destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids,int mode) throws Exception    public static void convertBatch(DBBean source, DBBean destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode, String delimiter) throws Exception
   {    {
     bean = source;      bean = source;
     beanDest = destination;      beanDest = destination;
     convert(null,null,names,layouts,selects,creates,ids,mode);      convert(null, null, names, layouts, selects, creates, ids, mode, delimiter);
     if(true) return;      if (true)
         return;
     StringBuffer command = null;      StringBuffer command = null;
     try      try
     {      {
Line 190  class Convert Line 217  class Convert
           {            {
             obj = row.get(k);              obj = row.get(k);
             if (obj instanceof ArrayList)              if (obj instanceof ArrayList)
               obj = ((List) obj).get(0);                obj = formatFileMakerArray((List) obj, "\n");
             String str = (obj == null) ? "NULL" : obj.toString();              String str = (obj == null) ? "NULL" : obj.toString();
             if (!str.equals("NULL"))              if (!str.equals("NULL"))
               pstm.setString(k + 1, str);                pstm.setString(k + 1, str);
Line 221  class Convert Line 248  class Convert
   
     //  dialog.setVisible(false);       //  dialog.setVisible(false); 
   }    }
     public static String formatFileMakerArray(List list, String delimiter)
     {
       StringBuffer formattedString = new StringBuffer();
       for (int i = 0; i < list.size(); ++i)
       {
         formattedString.append(list.get(i).toString());
         if (i < list.size() - 1)
           formattedString.append(delimiter);
       }
       return formattedString.toString();
     }
     /**
      * Method for SQL UPDATE
      * @param source
      * @param destination
      * @param names
      * @param layouts
      * @param selects
      * @param creates
      * @param ids
      * @param mode
      * @throws Exception
      */
   public static void update(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode) throws Exception    public static void update(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode) throws Exception
   {    {
     FM2SQL.ProgressDialog dialog = null;      FM2SQL.ProgressDialog dialog = null;
     if (FM2SQL.fmInstance != null)      if (FM2SQL.fmInstance != null)
     {      {
       dialog = new FM2SQL.ProgressDialog(FM2SQL.fmInstance);        dialog = new FM2SQL.ProgressDialog(FM2SQL.fmInstance, bean);
       dialog.setTitle("Conversion running ...");        dialog.setTitle("Conversion running ...");
       dialog.title.setText("Getting table data ...");        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.setLocation(FM2SQL.fmInstance.getLocationOnScreen().x + (FM2SQL.fmInstance.getWidth() - 400) / 2, FM2SQL.fmInstance.getLocationOnScreen().y + (FM2SQL.fmInstance.getHeight() - 250) / 2);
Line 257  class Convert Line 306  class Convert
       for (tbIndex = 0; tbIndex < names.size(); ++tbIndex)        for (tbIndex = 0; tbIndex < names.size(); ++tbIndex)
       {        {
         Vector[] result = null;          Vector[] result = null;
           String destTableName = "";
         try          try
         {          {
           query = "select * from " + bean.getQC() + names.get(tbIndex).toString() + bean.getQC();            query = "select * from " + bean.getQC() + names.get(tbIndex).toString() + bean.getQC();
Line 283  class Convert Line 333  class Convert
         {          {
           continue;            continue;
         }          }
           // 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("(");
             destTableName = create.substring(fromIndex, toIndex).replaceAll(beanDest.getQC(), "").trim();
             System.out.println("destTable " + destTableName);
   
           } else
             destTableName = convertText(names.get(tbIndex).toString());
   
         //beanDest.setConnection("jdbc:postgresql://erebos/test3");          //beanDest.setConnection("jdbc:postgresql://erebos/test3");
         beanDest.setConnection(destination);          beanDest.setConnection(destination);
   
Line 297  class Convert Line 359  class Convert
         // System.exit(0);          // System.exit(0);
   
         if (dialog != null)          if (dialog != null)
           dialog.title.setText("Writing table data ...");            dialog.title.setText("Updating table data ...");
   
         int j = -1;          int j = -1;
   
Line 306  class Convert Line 368  class Convert
   
         command.append("UPDATE ");          command.append("UPDATE ");
         command.append(beanDest.getQC());          command.append(beanDest.getQC());
         command.append(convertText((String) names.get(tbIndex)));          command.append(destTableName);
           //command.append(convertText((String) names.get(tbIndex)));
         command.append(beanDest.getQC());          command.append(beanDest.getQC());
         command.append(" SET  ");          command.append(" SET  ");
   
Line 398  class Convert Line 461  class Convert
   
   }    }
   /**    /**
    transfers the specified array of tables  to the destination database     *   transfers the specified array of tables  to the destination database
     and creates the table if it does not exist if it exists and mode is not append the table is dropped      and creates the table if it does not exist if it exists and mode is not append the table is dropped
         
    **/     * @param source
   public static void convert(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode) throws Exception     * @param destination
      * @param names
      * @param layouts
      * @param selects
      * @param creates
      * @param ids
      * @param mode
      * @throws Exception
      */
   
     public static void convert(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode, String delimiter) throws Exception
   {    {
   
     FM2SQL.ProgressDialog dialog = null;      FM2SQL.ProgressDialog dialog = null;
   
     if (FM2SQL.fmInstance != null)      if (FM2SQL.fmInstance != null)
     {      {
       dialog = new FM2SQL.ProgressDialog(FM2SQL.fmInstance);        dialog = new FM2SQL.ProgressDialog(FM2SQL.fmInstance, bean);
       dialog.setTitle("Conversion running ...");        dialog.setTitle("Conversion running ...");
       dialog.title.setText("Getting table data ...");        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.setLocation(FM2SQL.fmInstance.getLocationOnScreen().x + (FM2SQL.fmInstance.getWidth() - 400) / 2, FM2SQL.fmInstance.getLocationOnScreen().y + (FM2SQL.fmInstance.getHeight() - 250) / 2);
Line 421  class Convert Line 494  class Convert
     java.util.TreeSet myIds = new TreeSet();      java.util.TreeSet myIds = new TreeSet();
     int deltaID = 1;      int deltaID = 1;
     String idField = "";      String idField = "";
       String destTableName = "";
       String[] fieldNames = null;
     if (source != null && destination != null)      if (source != null && destination != null)
     {      {
       // setting user and passwd         // setting user and passwd 
Line 494  class Convert Line 569  class Convert
         // System.out.println(beanDest.getTableNames(beanDest.getCatalogs().get(2).toString()));          // System.out.println(beanDest.getTableNames(beanDest.getCatalogs().get(2).toString()));
         stm = beanDest.getConnection().createStatement();          stm = beanDest.getConnection().createStatement();
         // System.exit(0);          // System.exit(0);
   
           // determine destTableName from createStatement or from source table name
           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 (mode == Convert.DataBase.CONVERT_MODE)
         {          {
   
             if (tables.indexOf(destTableName) >= 0)
             {
               stm.executeUpdate("drop table " + beanDest.getQC() + destTableName + beanDest.getQC());
               tables.remove(destTableName);
               System.out.println("dropped table" + destTableName);
   
             }
             /*
             if(destTableName.equals(""))
           if (tables.indexOf(names.get(tbIndex)) >= 0)            if (tables.indexOf(names.get(tbIndex)) >= 0)
           {            {
             stm.executeUpdate("drop table " + beanDest.getQC() + names.get(tbIndex) + beanDest.getQC());              stm.executeUpdate("drop table " + beanDest.getQC() + names.get(tbIndex) + beanDest.getQC());
Line 507  class Convert Line 597  class Convert
             tables.remove(convertText((String) names.get(tbIndex)));              tables.remove(convertText((String) names.get(tbIndex)));
             System.out.println("dropped table" + names.get(tbIndex));              System.out.println("dropped table" + names.get(tbIndex));
           }            }
             */
           if (tables.indexOf(names.get(tbIndex)) < 0 && tables.indexOf(convertText(names.get(tbIndex).toString())) < 0)            if ((tables.indexOf(destTableName) < 0)) //&& tables.indexOf(names.get(tbIndex)) < 0 && tables.indexOf(convertText(names.get(tbIndex).toString())) < 0   )
           {            {
   
             if (creates.get(tbIndex).equals("") || creates.get(tbIndex).toString().toLowerCase().indexOf("create") < 0)              if (creates.get(tbIndex).equals("") || creates.get(tbIndex).toString().toLowerCase().indexOf("create") < 0)
             {              {
               System.out.println("Warning empty or invalid create statement - creating one for you\n");                System.out.println("Warning empty or invalid create statement - creating one for you\n");
Line 541  class Convert Line 632  class Convert
               //  System.exit(0);                //  System.exit(0);
               //command.append(DBBean.getQC());                   //command.append(DBBean.getQC());   
             } else              } else
               command = new StringBuffer().append(creates.get(tbIndex).toString());                command = new StringBuffer().append(creates.get(tbIndex).toString().toLowerCase());
             stm.executeUpdate(command.toString());              stm.executeUpdate(command.toString());
   
           }            }
Line 556  class Convert Line 647  class Convert
   
         command.append("INSERT  INTO ");          command.append("INSERT  INTO ");
         command.append(beanDest.getQC());          command.append(beanDest.getQC());
         command.append(convertText((String) names.get(tbIndex)));          command.append(destTableName); //convertText((String) names.get(tbIndex)));
         command.append(beanDest.getQC());          command.append(beanDest.getQC());
           command.append(" (");
           for (int i = 0; i < fieldNames.length; i++)
           {
             command.append(fieldNames[i]);
             if (i < fieldNames.length - 1)
               command.append(",");
           }
           command.append(") ");
   
         command.append(" values ( ");          command.append(" values ( ");
   
           // add a question marks for every field 
         for (int i = 0; i < bean.getColumnNames().size() - 1; ++i)          for (int i = 0; i < bean.getColumnNames().size() - 1; ++i)
           command.append("?,");            command.append("?,");
         command.append("?)");          command.append("?)");
Line 570  class Convert Line 671  class Convert
         int endIndex = -1;          int endIndex = -1;
         String tempQuery = query;          String tempQuery = query;
         String tempID = bean.getQC() + idField + bean.getQC();          String tempID = bean.getQC() + idField + bean.getQC();
           // if id_field not do incremental conversion else do it all at once
         if (!idField.equals(""))          if (!idField.equals(""))
         {          {
           long startTime = System.currentTimeMillis();            long startTime = System.currentTimeMillis();
Line 579  class Convert Line 681  class Convert
             ++counter;              ++counter;
             if (counter == 0&&dialog!=null)              if (counter == 0&&dialog!=null)
               dialog.title.setText("Check if data  is available");                dialog.title.setText("Check if data  is available");
             else              else if (dialog != null)
               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, numHits);
             if (myIds.isEmpty())              if (myIds.isEmpty())
Line 598  class Convert Line 699  class Convert
             {              {
               System.out.println(vec.get(k) + " " + vec.get(k + deltaID) + " " + vec.lastElement());                System.out.println(vec.get(k) + " " + vec.get(k + deltaID) + " " + vec.lastElement());
               if (query.indexOf("where") > 0)                if (query.indexOf("where") > 0)
                 tempQuery = query + " and " + tempID + ">=" + vec.get(k) + " and " + tempID + "<=" + vec.get(k + deltaID);                  tempQuery = query + " and " + tempID + ">='" + vec.get(k) + "' and " + tempID + "<='" + vec.get(k + deltaID) + "'";
               else                else
                 tempQuery = query + "where " + tempID + ">=" + vec.get(k) + " and " + tempID + "<=" + vec.get(k + deltaID);                  tempQuery = query + " where " + tempID + ">='" + vec.get(k) + "' and " + tempID + "<='" + vec.get(k + deltaID) + "'";
               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 ...");
Line 609  class Convert Line 710  class Convert
               if(dialog!=null)                if(dialog!=null)
               dialog.title.setText("Writing table data ...");                dialog.title.setText("Writing table data ...");
   
               command = writeDatainDestTable(dialog, command, k, pstm, rowCount);                command = writeDatainDestTable(dialog, command, k, pstm, rowCount, delimiter);
               endIndex = k + deltaID;                endIndex = k + deltaID;
             }              }
             System.out.println(endIndex);              System.out.println(endIndex);
               //all data written ? if not write last chunk of data
             if (endIndex == vec.size() - 1)              if (endIndex == vec.size() - 1)
               System.out.println("fits");                System.out.println("fits");
             else              else
Line 620  class Convert Line 722  class Convert
               System.out.println(" last intervall from " + vec.get(endIndex) + " " + vec.lastElement());                System.out.println(" last intervall from " + vec.get(endIndex) + " " + vec.lastElement());
   
               if (query.indexOf("where") > 0)                if (query.indexOf("where") > 0)
                 tempQuery = query + " and " + tempID + ">=" + vec.get(endIndex) + " and " + tempID + "<=" + vec.lastElement();                  tempQuery = query + " and " + tempID + ">='" + vec.get(endIndex) + "' and " + tempID + "<='" + vec.lastElement() + "'";
               else                else
                 tempQuery = query + "where " + tempID + ">=" + vec.get(endIndex) + " and " + tempID + "<=" + vec.lastElement();                  tempQuery = query + " where " + tempID + ">='" + vec.get(endIndex) + "' and " + tempID + "<='" + vec.lastElement() + "'";
               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 ...");
               command = writeDatainDestTable(dialog, command, endIndex, pstm, rowCount);                command = writeDatainDestTable(dialog, command, endIndex, pstm, rowCount, delimiter);
             }              }
               // prepare new query for next chunk
             if (query.indexOf("where") > 0)              if (query.indexOf("where") > 0)
               tempQuery = query + " and " + tempID + ">" + vec.lastElement();                tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'";
             else              else
               tempQuery = query + " where " + tempID + ">" + vec.lastElement();                tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'";
   
           }            }
           long endTime = System.currentTimeMillis();            long endTime = System.currentTimeMillis();
           System.out.println("Time for incremental convert elapsed " + (endTime - startTime));            System.out.println("Time for incremental convert elapsed " + (endTime - startTime));
         } else          } else
         {          {
             // read and write all in one big chunk
           long startTime = System.currentTimeMillis();            long startTime = System.currentTimeMillis();
   
           bean.makeQuery(query, 0);            bean.makeQuery(query, 0);
           command = writeDatainDestTable(dialog, command, j, pstm, rowCount);            command = writeDatainDestTable(dialog, command, j, pstm, rowCount, delimiter);
           long endTime = System.currentTimeMillis();            long endTime = System.currentTimeMillis();
           System.out.println("Time for old convert elapsed " + (endTime - startTime));            System.out.println("Time for old convert elapsed " + (endTime - startTime));
   
Line 676  class Convert Line 780  class Convert
       dialog.setVisible(false);        dialog.setVisible(false);
     }      }
   }    }
   private static StringBuffer writeDatainDestTable(FM2SQL.ProgressDialog dialog, StringBuffer command, int j, PreparedStatement pstm, int rowCount) throws Exception, SQLException    /**
      * Writes data to the destination table 
      * @param dialog  progress dialog
      * @param command 
      * @param j       data index for progress bar
      * @param pstm    prepared statement
      * @param rowCount number of datasets
      * @return   command
      * @throws Exception
      * @throws SQLException
      */
     private static StringBuffer writeDatainDestTable(FM2SQL.ProgressDialog dialog, StringBuffer command, int j, PreparedStatement pstm, int rowCount, String delimiter) throws Exception, SQLException
   {    {
     Vector row;      Vector row;
     while ((row = bean.getNextRow()) != null)      while ((row = bean.getNextRow()) != null)
Line 721  class Convert Line 836  class Convert
       for (int k = 0; k < row.size(); ++k)        for (int k = 0; k < row.size(); ++k)
       {        {
         obj = row.get(k);          obj = row.get(k);
   
         if (obj instanceof ArrayList)          if (obj instanceof ArrayList)
           obj = ((List) obj).get(0);            obj = formatFileMakerArray((List) obj, delimiter);
   
         String str = (obj == null) ? "NULL" : obj.toString();          String str = (obj == null) ? "NULL" : obj.toString();
         if (!str.equals("NULL"))          if (obj instanceof Double)
           {
             pstm.setDouble(k + 1, ((Double) obj).doubleValue());
           } else if (!str.equals("NULL"))
           pstm.setString(k + 1, str);            pstm.setString(k + 1, str);
         else          else
           pstm.setNull(k + 1, Types.NULL);            pstm.setNull(k + 1, Types.NULL);
Line 739  class Convert Line 859  class Convert
     return command;      return command;
   }    }
   
     /**
      *  removes special characters from the input string as well as .fp5 
      * @param newName String to change
      * @return
      */
   public static String convertText(String newName)    public static String convertText(String newName)
   {    {
     StringBuffer alterMe = new StringBuffer(newName.trim().toLowerCase());      StringBuffer alterMe = new StringBuffer(newName.trim().toLowerCase());
Line 832  class Convert Line 957  class Convert
     }      }
     return alterMe.toString();      return alterMe.toString();
   }    }
     /**
      * Converts > and < in an entity (&gt; or &lt;)
      * @param newName
      * @return
      */
   public static String convertToEntities(String newName)    public static String convertToEntities(String newName)
   {    {
     StringBuffer alterMe = new StringBuffer(newName.trim());      StringBuffer alterMe = new StringBuffer(newName.trim());
Line 862  class Convert Line 992  class Convert
     }      }
     return alterMe.toString();      return alterMe.toString();
   }    }
     /**
      * Masks the single quote character '-->\'
      * @param newName
      * @return
      */
   public static String convertUml(String newName)    public static String convertUml(String newName)
   {    {
     StringBuffer alterMe = new StringBuffer(newName.trim());      StringBuffer alterMe = new StringBuffer(newName.trim());
Line 971  class Convert Line 1106  class Convert
     }      }
     return alterMe.toString();      return alterMe.toString();
   }    }
     /**
      * parses the input xml file for batch conversion
      * called from readXMLFile
      * * @param sb
      */
   public static void parseXMLConfig(StringBuffer sb)    public static void parseXMLConfig(StringBuffer sb)
   {    {
     boolean finished = false;      boolean finished = false;
Line 986  class Convert Line 1125  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();
       String delimiter = "|";
     int mode = -1;      int mode = -1;
   
     try      try
Line 1010  class Convert Line 1150  class Convert
         Node node2 = root.find("convert/source/database/password", new int[] { 1, 1, i, 1, 1 });          Node node2 = root.find("convert/source/database/password", new int[] { 1, 1, i, 1, 1 });
         Node node3 = root.find("convert/source/database", new int[] { 1, 1, i });          Node node3 = root.find("convert/source/database", new int[] { 1, 1, i });
         Node nodeMode = root.find("convert/source/database/mode", new int[] { 1, 1, i, 1, 1 });          Node nodeMode = root.find("convert/source/database/mode", new int[] { 1, 1, i, 1, 1 });
           Node delimiterNode = root.find("convert/source/database/delimiter", new int[] { 1, 1, i, 1, 1 });
           Node useNormanToUnicodeMapper = root.find("convert/source/database/usenormantounicodemapper", new int[] { 1, 1, i, 1, 1 });
   
         if (node3 == null)          if (node3 == null)
           throw new Error("parse error database tag missing");            throw new Error("parse error database tag missing");
Line 1019  class Convert Line 1161  class Convert
           throw new Error("parse error user tag missing");            throw new Error("parse error user tag missing");
         if (node2 == null)          if (node2 == null)
           throw new Error("parse error password tag missing");            throw new Error("parse error password tag missing");
           if (delimiterNode != null)
             delimiter = delimiterNode.getCharacters();
           if(useNormanToUnicodeMapper!=null)
           {
             database.setUseNormanToUnicodeMapper(Boolean.valueOf(useNormanToUnicodeMapper.getCharacters()).booleanValue());
             System.out.println("useMapper "+Boolean.valueOf(useNormanToUnicodeMapper.getCharacters().trim()).booleanValue());
           } 
      
         String url = node.getCharacters();          String url = node.getCharacters();
         String user = node1.getCharacters();          String user = node1.getCharacters();
         String password = node2.getCharacters();          String password = node2.getCharacters();
Line 1038  class Convert Line 1188  class Convert
           mode = DataBase.APPEND_MODE;            mode = DataBase.APPEND_MODE;
         else if (modeString.equals("update"))          else if (modeString.equals("update"))
           mode = DataBase.UPDATE_MODE;            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)          //   if(node3!=null)
         // System.out.println(node3.name);          // System.out.println(node3.name);
   
Line 1086  class Convert Line 1241  class Convert
             creates.add("");              creates.add("");
   
         }          }
         databases.add(new DataBase(database, tables, layouts, selects, creates, ids, mode));          DataBase dataBase = new DataBase(database, tables, layouts, selects, creates, ids, mode);
           dataBase.delimiter = delimiter;
           databases.add(dataBase);
       }        }
       DBBean database = new DBBean();        DBBean database = new DBBean();
       // parse dataBase        // parse dataBase
Line 1103  class Convert Line 1260  class Convert
       for (Iterator iter = databases.iterator(); iter.hasNext();)        for (Iterator iter = databases.iterator(); iter.hasNext();)
       {        {
         DataBase db = (DataBase) iter.next();          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);            convertBatch(db.bean, database, db.tables, db.layouts, db.selects, db.creates, db.ids, mode, db.delimiter);
         else          else
           if (mode == DataBase.UPDATE_MODE)
           update(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates, db.ids, 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);        // printContents(node3);
       //   FM2SQL.fmInstance=new FM2SQL();        //   FM2SQL.fmInstance=new FM2SQL();
Line 1152  class Convert Line 1318  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();
       String delimiter = "|";
     int mode = -1;      int mode = -1;
     try      try
     {      {
Line 1176  class Convert Line 1342  class Convert
         Node node2 = root.find("convert/source/database/password", new int[] { 1, 1, i, 1, 1 });          Node node2 = root.find("convert/source/database/password", new int[] { 1, 1, i, 1, 1 });
         Node node3 = root.find("convert/source/database", new int[] { 1, 1, i });          Node node3 = root.find("convert/source/database", new int[] { 1, 1, i });
         Node nodeMode = root.find("convert/source/database/mode", new int[] { 1, 1, i, 1, 1 });          Node nodeMode = root.find("convert/source/database/mode", new int[] { 1, 1, i, 1, 1 });
           Node delimiterNode = root.find("convert/source/database/delimiter", new int[] { 1, 1, i, 1, 1 });
           Node useNormanToUnicodeMapper = root.find("convert/source/database/usenormantounicodemapper", new int[] { 1, 1, i, 1, 1 });
   
           if (delimiterNode != null)
             delimiter = delimiterNode.getCharacters();
           if(useNormanToUnicodeMapper!=null)
           {
             database.setUseNormanToUnicodeMapper(Boolean.valueOf(useNormanToUnicodeMapper.getCharacters()).booleanValue());
             System.out.println("useMapper "+Boolean.valueOf(useNormanToUnicodeMapper.getCharacters().trim()).booleanValue());
           } 
   
         if (node3 == null)          if (node3 == null)
           throw new Error("parse error database tag missing");            throw new Error("parse error database tag missing");
Line 1204  class Convert Line 1380  class Convert
           mode = DataBase.APPEND_MODE;            mode = DataBase.APPEND_MODE;
         else if (modeString.equals("update"))          else if (modeString.equals("update"))
           mode = DataBase.UPDATE_MODE;            mode = DataBase.UPDATE_MODE;
           else if (modeString.equals("delete"))
             mode = DataBase.DELETE_MODE;
   
         //   if(node3!=null)          //   if(node3!=null)
         // System.out.println(node3.name);          // System.out.println(node3.name);
Line 1254  class Convert Line 1432  class Convert
             creates.add("");              creates.add("");
   
         }          }
         databases.add(new DataBase(database, tables, layouts, selects, creates, ids, mode));          DataBase dataBase = new DataBase(database, tables, layouts, selects, creates, ids, mode);
           dataBase.delimiter = delimiter;
           databases.add(dataBase);
       }        }
       DBBean database = new DBBean();        DBBean database = new DBBean();
       // parse dataBase        // parse dataBase
Line 1317  class Convert Line 1497  class Convert
         //contents=n.contents.v i=0;          //contents=n.contents.v i=0;
       }        }
       // System.out.println(n.type);        // System.out.println(n.type);
   
     }      }
   }    }
     /**
      * reads the specified xml file
      * @param xmlFile
      */
   public static void readXMLFile(String xmlFile)    public static void readXMLFile(String xmlFile)
   {    {
     try      try
     {      {
         InputStream stream = null;
         
         if(xmlFile.indexOf("file://")>=0||xmlFile.indexOf("http://")>=0)
         {
           URL url=new URL(xmlFile);
           stream = url.openStream();
         }
         else 
       // read XML Metadata from a file        // read XML Metadata from a file
       FileInputStream fi = new FileInputStream(xmlFile);         stream = new FileInputStream(xmlFile);
       InputStreamReader isr = new InputStreamReader(fi, "UTF-8");        InputStreamReader isr = new InputStreamReader(stream, "UTF-8");
       BufferedReader buffr = new BufferedReader(isr);        BufferedReader buffr = new BufferedReader(isr);
       StringBuffer sb = new StringBuffer();        StringBuffer sb = new StringBuffer();
       int c = 0;        int c = 0;
Line 1342  class Convert Line 1533  class Convert
       e.printStackTrace();        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
      * @author rogo
      *
      */
   public static class DataBase    public static class DataBase
   {    {
     DBBean bean;      DBBean bean;
Line 1350  class Convert Line 1569  class Convert
     Vector layouts;      Vector layouts;
     Vector tables;      Vector tables;
     Vector ids;      Vector ids;
       String delimiter = "//";
       boolean useNormanToUnicodeMapper = false;
       
     final static int CONVERT_MODE = 1;      final static int CONVERT_MODE = 1;
     final static int APPEND_MODE = 2;      final static int APPEND_MODE = 2;
     final static int UPDATE_MODE = 3;      final static int UPDATE_MODE = 3;
       final static int DELETE_MODE = 4;
       final static int SYNCHRONIZE_MODE = 5;
    
     int mode = -1;      int mode = -1;
   
     public DataBase(DBBean bean, Vector tables, Vector layouts, Vector selects, Vector creates, Vector ids, int mode)      public DataBase(DBBean bean, Vector tables, Vector layouts, Vector selects, Vector creates, Vector ids, int mode)
Line 1366  class Convert Line 1591  class Convert
       this.mode = mode;        this.mode = mode;
       this.bean.setIDVector(ids);        this.bean.setIDVector(ids);
     }      }
       /**
        * writes the data contained in this object to the buffered writer
        * * @param buffr
        * @throws Exception
        */
     public void exportToXML(BufferedWriter buffr) throws Exception      public void exportToXML(BufferedWriter buffr) throws Exception
     {      {
       // ids=bean.getIDVector();        // ids=bean.getIDVector();
Line 1373  class Convert Line 1603  class Convert
       buffr.write("      <url>" + bean.url + "</url>\n");        buffr.write("      <url>" + bean.url + "</url>\n");
       buffr.write("      <user>" + bean.user + "</user>\n");        buffr.write("      <user>" + bean.user + "</user>\n");
       buffr.write("      <password>" + bean.passwd + "</password>\n");        buffr.write("      <password>" + bean.passwd + "</password>\n");
         buffr.write("      <delimiter>" + delimiter + "</delimiter>\n");
       String modeString = "";        String modeString = "";
       if (mode == CONVERT_MODE)        if (mode == CONVERT_MODE)
         modeString = "convert";          modeString = "convert";
Line 1380  class Convert Line 1611  class Convert
         modeString = "append";          modeString = "append";
       else if (mode == UPDATE_MODE)        else if (mode == UPDATE_MODE)
         modeString = "update";          modeString = "update";
         else if (mode == DELETE_MODE)
           modeString = "delete";
   
       buffr.write("      <mode>" + modeString + "</mode>\n");        buffr.write("      <mode>" + modeString + "</mode>\n");
         buffr.write("      <usenormantounicodemapper>" + useNormanToUnicodeMapper + "</usenormantounicodemapper>\n");
         
       int index = 0;        int index = 0;
       while (index < tables.size())        while (index < tables.size())
       {        {
Line 1440  class Convert Line 1675  class Convert
     buffw.write("</convert>\n");      buffw.write("</convert>\n");
     buffw.close();      buffw.close();
   }    }
     public static void delete(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode) throws Exception
     {
       FM2SQL.ProgressDialog dialog = null;
       if (FM2SQL.fmInstance != null)
       {
         dialog = new FM2SQL.ProgressDialog(FM2SQL.fmInstance, bean);
         dialog.setTitle("Conversion 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));
         FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
         dialog.thread = Thread.currentThread();
       }
       // setting user and passwd 
       bean.setUserAndPasswd(user, passwd);
       // setting user and passwd 
       beanDest.setUserAndPasswd(userDest, passwdDest);
       if (dialog != null)
         dialog.setSize(400, 250);
       StringBuffer command = null;
       String query = null;
       try
       {
         //bean.setConnection("jdbc:fmpro:http://141.14.237.74:8050");    
         //bean.setConnection("jdbc:postgresql://erebos/test","postgres","rogo");
         bean.setConnection(source);
         if (names == null)
           names = bean.getTableNames();
         // Collections.sort(names);
         int tbIndex = 1;
   
         // System.out.println("Start at "+names.indexOf("archimedes_facsimiles"));
         for (tbIndex = 0; tbIndex < names.size(); ++tbIndex)
         {
           Vector[] result = null;
           java.util.TreeSet myIds = new TreeSet();
           java.util.TreeSet myIdsDest = new TreeSet();
           int deltaID = 1;
           String idField = "";
           String destTableName = "";
   
           try
           {
             query = "select * from " + bean.getQC() + names.get(tbIndex).toString() + bean.getQC();
             String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString();
             query = (selects != null) ? selects.get(tbIndex).toString() : query;
             //if  vectors[1].get(i) != null)
             if (layout != "")
             {
               layout = " layout " + bean.getQC() + layout + bean.getQC();
               String name = names.get(tbIndex).toString();
               StringBuffer queryLayout = new StringBuffer(query);
               queryLayout.insert(queryLayout.indexOf(name) + name.length() + 1, " " + layout);
               query = queryLayout.toString();
               System.out.println("added layout  " + query);
   
             }
             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();
   
           } catch (Exception e)
           {
             continue;
           }
           // 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("(");
             destTableName = create.substring(fromIndex, toIndex).replaceAll(beanDest.getQC(), "").trim();
             System.out.println("destTable " + destTableName);
   
           } else
             destTableName = convertText(names.get(tbIndex).toString());
   
           // for id kram
           Vector vec = null;
           Vector vecDest = null;
           //      tempo
           beanDest.setConnection(destination);
           int rowCount = (idField != "") ? myIds.size() : bean.getRowCount(query);
           String tempID = bean.getQC() + idField + bean.getQC();
           String tempIDdest = beanDest.getQC() + convertText(idField) + beanDest.getQC();
   
           int endIndex = -1;
           String tempQuery = query;
           String destQuery = query.replaceAll(names.get(tbIndex).toString(), destTableName);
           String tempQueryDest = destQuery;
           // remove extra query parts destQuery.substring(0,destQuery.lastIndexOf(destTableName)+destTableName.length()+1);
           System.out.println("new Query " + tempQueryDest);
           if (!idField.equals(""))
           {
             long startTime = System.currentTimeMillis();
             int counter = -1;
             while (true)
             {
               ++counter;
               if (counter == 0 && dialog != null)
                 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);
               if (myIds.isEmpty())
                 break;
               vec = new Vector(myIds);
               vecDest = new Vector(myIdsDest);
               rowCount = vec.size();
               // Deletion will work this way
               Vector deleted = new Vector(vec);
               Vector linesToDelete = new Vector(vecDest);
               // remove all lines that should not be deleted
               linesToDelete.removeAll(deleted);
               // 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);
               beanDest.setConnection(destination);
   
               Statement stm = beanDest.getConnection().createStatement();
   
               Vector tables = beanDest.getTableNames();
               // Collections.sort(tables);
               System.out.println(names.get(tbIndex) + " " + tables.indexOf(convertText((String) names.get(tbIndex)))); // "//beanDest.getTypeNames()); 
               tables = beanDest.getTableNames();
               // System.out.println(beanDest.getTableNames(beanDest.getCatalogs().get(2).toString()));
               stm = beanDest.getConnection().createStatement();
   
               if (dialog != null)
                 dialog.title.setText(" Deleting table data ...");
   
               int j = -1;
   
               Vector row = null;
               command = new StringBuffer();
   
               command.append("DELETE FROM");
               command.append(beanDest.getQC());
               command.append(destTableName);
               //command.append(convertText((String) names.get(tbIndex)));
               command.append(beanDest.getQC());
               int size = bean.getColumnNames().size();
               command.append("WHERE " + convertText(ids.get(tbIndex).toString()) + " =  ?");
               PreparedStatement pstm = beanDest.getConnection().prepareStatement(command.toString());
               System.out.println(command + " " + tbIndex);
               //int rowCount = bean.getRowCount(query);
               //        int idIndex = bean.getColumnNames().indexOf(ids.get(tbIndex));
               while (true)
               {
   
                 ++j;
                 if (j == linesToDelete.size())
                   break;
                 //print rows
                 pstm.setString(1, linesToDelete.get(j).toString());
                 System.out.println(pstm.toString());
                 pstm.execute();
                 if (dialog != null)
                   dialog.progress.setValue((int) (((double) (j + 1) / (double) rowCount) * 100.0));
                 command = null;
               }
               // prepare new query for next chunk
               if (query.indexOf("where") > 0)
                 tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'";
               else
                 tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'";
   
             } //to outer while
           } // to idfield if  
         } // table loop
   
       } catch (Exception e)
       {
         System.out.println("Error while connecting to database " + e);
         if (dialog != null)
         {
           dialog.setVisible(false);
           dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
           FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
         }
         java.io.ByteArrayOutputStream b = new java.io.ByteArrayOutputStream();
         java.io.PrintStream stream = new java.io.PrintStream(b);
         stream.print(command + "\n\n");
         e.printStackTrace(stream);
         FM2SQL.showErrorDialog(b.toString(), "Error occured !");
   
       }
       if (dialog != null)
       {
         dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
         FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
   
         dialog.setVisible(false);
       }
     } // to method
     
     
     /**
      * synchronize method based on delete method code
      * 
      * @param source
      * @param destination
      * @param names
      * @param layouts
      * @param selects
      * @param creates
      * @param ids
      * @param mode
      * @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) 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("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));
         FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
         dialog.thread = Thread.currentThread();
       }
       // setting user and passwd 
       bean.setUserAndPasswd(user, passwd);
       // setting user and passwd 
       beanDest.setUserAndPasswd(userDest, passwdDest);
       if (dialog != null)
         dialog.setSize(400, 250);
       StringBuffer command = null;
       String query = null;
       try
       {
         //bean.setConnection("jdbc:fmpro:http://141.14.237.74:8050");    
         //bean.setConnection("jdbc:postgresql://erebos/test","postgres","rogo");
         bean.setConnection(source);
         if (names == null)
           names = bean.getTableNames();
         // Collections.sort(names);
         int tbIndex = 1;
   
         // System.out.println("Start at "+names.indexOf("archimedes_facsimiles"));
         for (tbIndex = 0; tbIndex < names.size(); ++tbIndex)
         {
           Vector[] result = null;
           java.util.TreeSet myIds = new TreeSet();
           java.util.TreeSet myIdsDest = new TreeSet();
           int deltaID = 1;
           String idField = "";
           String destTableName = "";
   
           try
           {
             query = "select * from " + bean.getQC() + names.get(tbIndex).toString() + bean.getQC();
             String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString();
             query = (selects != null) ? selects.get(tbIndex).toString() : query;
             //if  vectors[1].get(i) != null)
             if (!layout.equals(""))
             {
               layout = " layout " + bean.getQC() + layout + bean.getQC();
               String name = names.get(tbIndex).toString();
               StringBuffer queryLayout = new StringBuffer(query);
               queryLayout.insert(queryLayout.indexOf(name) + name.length() + 1, " " + layout);
               query = queryLayout.toString();
               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();
   
           } catch (Exception e)
           {
             continue;
           }
           // 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("(");
             destTableName = create.substring(fromIndex, toIndex).replaceAll(beanDest.getQC(), "").trim();
             System.out.println("destTable " + destTableName);
   
           } else
             destTableName = convertText(names.get(tbIndex).toString());
   
           // for id kram
           Vector vec = null;
           Vector vecDest = null;
           //      tempo
           beanDest.setConnection(destination);
           int rowCount = (idField != "") ? myIds.size() : bean.getRowCount(query);
           String tempID = bean.getQC() + idField + bean.getQC();
           String tempIDdest = beanDest.getQC() + convertText(idField) + beanDest.getQC();
   
           int endIndex = -1;
           String tempQuery = query;
           String destQuery = query.replaceAll(names.get(tbIndex).toString(), destTableName);
           String tempQueryDest = destQuery;
           // remove extra query parts destQuery.substring(0,destQuery.lastIndexOf(destTableName)+destTableName.length()+1);
           System.out.println("new Query " + tempQueryDest);
           if (!idField.equals(""))
           {
             long startTime = System.currentTimeMillis();
             int counter = -1;
             while (true)
             {
               ++counter;
               if (counter == 0 && dialog != null)
                 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);
               if (myIds.isEmpty())
                 break;
               vec = new Vector(myIds);
               vecDest = new Vector(myIdsDest);
               rowCount = vec.size();
               // 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();
   
               Vector tables = beanDest.getTableNames();
               // Collections.sort(tables);
               System.out.println(names.get(tbIndex) + " " + tables.indexOf(convertText((String) names.get(tbIndex)))); // "//beanDest.getTypeNames()); 
               tables = beanDest.getTableNames();
               // System.out.println(beanDest.getTableNames(beanDest.getCatalogs().get(2).toString()));
               stm = beanDest.getConnection().createStatement();
   
               if (dialog != null)
                 dialog.title.setText(" Deleting table data ...");
   
               int j = -1;
   
               Vector row = null;
               command = new StringBuffer();
   
               command.append("DELETE FROM");
               command.append(beanDest.getQC());
               command.append(destTableName);
               //command.append(convertText((String) names.get(tbIndex)));
               command.append(beanDest.getQC());
               int size = bean.getColumnNames().size();
               command.append("WHERE " + convertText(ids.get(tbIndex).toString()) + " =  ?");
               PreparedStatement pstm = beanDest.getConnection().prepareStatement(command.toString());
               System.out.println(command + " " + tbIndex);
               //int rowCount = bean.getRowCount(query);
               //        int idIndex = bean.getColumnNames().indexOf(ids.get(tbIndex));
               while (true)
               {
   
                 ++j;
                 if (j == linesToDelete.size())
                   break;
                 //print rows
                 pstm.setString(1, linesToDelete.get(j).toString());
                 System.out.println(pstm.toString());
                 pstm.execute();
                 if (dialog != null)
                   dialog.progress.setValue((int) (((double) (j + 1) / (double) rowCount) * 100.0));
                 command = null;
               }
               // prepare new query for next chunk
               if (query.indexOf("where") > 0)
                 tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'";
               else
                 tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'";
   
             } //to outer while
           } // to idfield if  
         } // table loop
   
       } catch (Exception e)
       {
         System.out.println("Error while connecting to database " + e);
         if (dialog != null)
         {
           dialog.setVisible(false);
           dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
           FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
         }
         java.io.ByteArrayOutputStream b = new java.io.ByteArrayOutputStream();
         java.io.PrintStream stream = new java.io.PrintStream(b);
         stream.print(command + "\n\n");
         e.printStackTrace(stream);
         FM2SQL.showErrorDialog(b.toString(), "Error occured !");
   
       }
       if (dialog != null)
       {
         dialog.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
         FM2SQL.fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
   
         dialog.setVisible(false);
       }
     } // to method
     
   
    
     /**
      * Converts input String in norman encoding to unicode 
      * @param inp
      * @return converted String
      */
     static public String normanToUnicode(String inp) {
       StringBuffer buf = new StringBuffer();
       for (int i = 0; i < inp.length(); i++) {
         char c = inp.charAt(i);
        // System.out.println("char "+c+" "+(int)c);
         switch (c) {
         case 1: buf.append("\u00d0"); break; // Eth
         case 2: buf.append("\u00f0"); break; // eth
         case 3: buf.append("\u0141"); break; // Lslash
         case 4: buf.append("\u0142"); break; // lslash
         case 5: buf.append("\u0160"); break; // S caron
         case 6: buf.append("\u0161"); break; // s caron
         case 7: buf.append("\u00dd"); break; // Y acute
         case 8: buf.append("\u00fd"); break; // y acute
         case 11: buf.append("\u00de"); break; // Thorn
         case 12: buf.append("\u00fe"); break; // thorn
         case 14: buf.append("\u017d"); break; // Z caron
         case 15: buf.append("\u017e"); break; // z caron
         case 17: buf.append("\u0073"); break; // asciitilde
         case 18: buf.append("j\u0305"); break; // j macron [does a single char exist?]
         case 19: buf.append("^"); break; // circumflex
         case 20: buf.append("\u0303"); break; // tilde
         case 21: buf.append("\u00bd"); break; // onehalf
         case 22: buf.append("\u00bc"); break; // onequarter
         case 23: buf.append("\u00b9"); break; // onesuperior
         case 24: buf.append("\u00be"); break; // threequarters
         case 25: buf.append("\u00b3"); break; // threesuperior
         case 26: buf.append("\u00b2"); break; // twosuperior
         case 27: buf.append("\u00a6"); break; // brokenbar
         case 28: buf.append("-"); break; // minus
         case 29: buf.append("\u00d7"); break; // multiply
         case 39: buf.append("'"); break; // quotesingle
         case 94: buf.append("\u0302"); break; // circumflex
         case 96: buf.append("\u0300"); break; // grave
         case 196: buf.append("\u00c4"); break; // A dieresis
         case 197: buf.append("\u00c5"); break; // A ring
         case 201: buf.append("\u00c9"); break; // E acute
         case 209: buf.append("\u00d1"); break; // N tilde
         case 214: buf.append("\u00d6"); break; // O dieresis
         case 220: buf.append("\u00dc"); break; // U dieresis
         case 225: buf.append("\u00e1"); break; // a acute
         case 224: buf.append("\u00e0"); break; // a grave
         case 226: buf.append("\u00e2"); break; // a circumflex
         case 228: buf.append("\u00e4"); break; // a dieresis
         case 227: buf.append("\u00e3"); break; // a tilde
         case 229: buf.append("\u0101"); break; // a macron
         case 231: buf.append("\u00e7"); break; // c cedilla
         case 233: buf.append("\u00e9"); break; // e acute
         case 232: buf.append("\u00e8"); break; // e grave
         case 234: buf.append("\u00ea"); break; // e circumflex
         case 235: buf.append("\u00eb"); break; // e dieresis
         case 237: buf.append("\u00ed"); break; // i acute
         case 236: buf.append("\u00ec"); break; // i grave
         case 238: buf.append("\u00ee"); break; // i circumflex
         case 239: buf.append("\u00ef"); break; // i dieresis
         case 241: buf.append("\u00f1"); break; // n tilde
         case 243: buf.append("\u00f3"); break; // o acute
         case 242: buf.append("\u00f2"); break; // o grave
         case 244: buf.append("\u00f4"); break; // o circumflex
         case 246: buf.append("\u00f6"); break; // o dieresis
         case 245: buf.append("\u00f5"); break; // o tilde
         case 250: buf.append("\u00fa"); break; // u acute
         case 249: buf.append("\u00f9"); break; // u grave
         case 251: buf.append("\u00fb"); break; // u circumflex
         case 252: buf.append("\u00fc"); break; // u dieresis
         case 8224: buf.append("\u1e6d"); break; // t underdot
         case 176: buf.append("\u00b0"); break; // degree
         case 162: buf.append("\u1ebd"); break; // e tilde
         case 163: buf.append("\u00a3"); break; // sterling
         case 167: buf.append("\u00a7"); break; // section
         case 182: buf.append("\u00b6"); break; // paragraph
         case 223: buf.append("\u015b"); break; // s acute
         case 174: buf.append("\u1e5b"); break; // r underdot
         case 169: buf.append("\u1e45"); break; // n overdot
         case 353: buf.append("\u1e45"); break; // n overdot
         case 180: buf.append("\u0301"); break; // acute
         case 168: buf.append("\u0308"); break; // dieresis
         case 8800: buf.append("\u1e6d"); break; // t underdot
         case 198: buf.append("\u00c6"); break; // AE
         case 216: buf.append("\u014d"); break; // o macron
         case 8734: buf.append("\u0129"); break; // i tilde
         case 177: buf.append("\u00b1"); break; // plusminus
         case 165: buf.append("\u012b"); break; // i macron
         case 181: buf.append("\u1e43"); break; // m underdot
         case 8706: buf.append("\u1e0d"); break; // d underdot
         case 240: buf.append("\u1e0d"); break; // d underdot
   
         case 8721: buf.append("\u1e63"); break; // s underdot
         case 960: buf.append("\u017a"); break; // z acute
         case 8747: buf.append("\u1e45"); break; // n overdot
         case 937: buf.append("\u0169"); break; // u tilde
         case 230: buf.append("\u00e6"); break; // ae
         case 248: buf.append("\u00f8"); break; // oslash
         case 191: buf.append("\u0304\u0306"); break; // macron breve
         case 172: buf.append("\u1e37"); break; // 
         case 8730: buf.append("j\u0305"); break; // j macron [does a single char exist?]
         case 402: buf.append("\u0103"); break; // a breve
         case 8776: buf.append("\u016d"); break; // u breve
         case 187: buf.append("\u1e42"); break; // M underdot
         case 8230: buf.append("\u2026"); break; // ellipsis
         case 192: buf.append("\u00c0"); break; // A grave
         case 195: buf.append("\u00c3"); break; // A tilde
         case 213: buf.append("\u00d5"); break; // O tilde
         case 338: buf.append("m\u0306"); break; // m breve
         case 339: buf.append("\u0153"); break; // oe
         case 8211: buf.append("\u2013"); break; // endash
         case 8212: buf.append("\u2014"); break; // emdash
         case 8220: buf.append("\u201c"); break; // quotedblleft
         case 8221: buf.append("\u201d"); break; // quotedblright
         case 8216: buf.append("\u2018"); break; // quoteleft
         case 8217: buf.append("\u2019"); break; // quoteright
         case 247: buf.append("\u1e37"); break; // l underring [actually underdot]
         case 9674: buf.append("\u1e41"); break; // m overdot
         case 255: buf.append("n\u0306"); break; // n breve
         case 376: buf.append("\u00d7"); break; // multiply
         case 8364: buf.append("\u1e5b"); break; // r underring [actually underdot]
         case 8249: buf.append("\u1e44"); break; // N overdot
         case 8250: buf.append("\u1e62"); break; // S underdot
         case 64257: buf.append("\u1e24"); break; // H underdot
         case 64258: buf.append("\u1e0c"); break; // D underdot
         case 8225: buf.append("\u2021"); break; // daggerdbl
         case 8218: buf.append("\u1e36"); break; // L underdot
         case 8222: buf.append("\u0113"); break; // e macron
         case 194: buf.append("\u1e5f"); break; // r underbar
         case 202: buf.append("r\u0324"); break; // r underdieresis
         case 193: buf.append("\u012a"); break; // I macron
         case 8486:
         case 203: buf.append("\u016b"); break; // u macron
         case 200: buf.append("\u1e6c"); break; // T underdot
         case 205: buf.append("\u1e64"); break; // S acute
         case 206: buf.append("\u2020"); break; // dagger
         case 207: buf.append("\u0115"); break; // e breve
         case 204: buf.append("\u014f"); break; // o breve
         case 211: buf.append("\u0100"); break; // A macron
         case 212: buf.append("\u1e46"); break; // N underdot
         case 210: buf.append("\u1e3b"); break; // l underbar
         case 218: buf.append("\u016a"); break; // U macron
         case 219: buf.append("\u0179"); break; // Z acute
         case 217: buf.append("\u1e5a"); break; // R underdot
         case 305: buf.append("\u0131"); break; // dotlessi
         case 710: buf.append("\u1e47"); break; // n underdot
         case 732: buf.append("\u1e49"); break; // n underbar
         case 175: buf.append("\u0304"); break; // macron
         case 728: buf.append("\u0306"); break; // breve
         case 729:case 215: buf.append("\u1e25"); break; // h underdot
         case 730: buf.append("\u012d"); break; // i breve
         case 184: buf.append("\u0327"); break; // cedilla
         case 733: buf.append("\u030b"); break; // hungarumlaut
         case 731: buf.append("\u0328"); break; // ogonek
         case 711: buf.append("\u030c"); break; // caron
         case 199: buf.append("\u012b\u0303"); break; // imacron tilde
         case 8226: buf.append("\u1e5d"); break; // runderdot macron
         case 8482: buf.append("\u016b\0306"); break; // umacron breve
         case 8804: buf.append("\u0101\u0301"); break; // amacron acute
         case 8805: buf.append("\u016b\u0301"); break; // umacron acute
         case 8719: buf.append("\u0113\u0301"); break; // emacron acute
         case 170: buf.append("\u0113\u0300"); break; // emacron breve
         case 186: buf.append("\u014d\u0300"); break; // omacron breve
         case 161: buf.append("\u0101\u0306"); break; // amacron breve
         case 8710: buf.append("\u0101\u0303"); break; // amacron tilde
         case 171: buf.append("\u012b\u0301"); break; // imacron acute
         case 8260: buf.append("\u1e00"); break; // runderdotmacron acute
         case 183: buf.append("\u1e5b\u0301"); break; // runderdot acute
         case 8240: buf.append("\u012b\u0306"); break; // imacron breve
         case 63743: buf.append("\u016b\u0303"); break; // umacron tilde
         default: buf.append(c);    
          if((int)c>127)
          System.out.println("char "+c+" "+(int)c);
          break;
         }
       }
       return buf.toString();
     }
   
     static public String normanToUnicodeOld(String inp) {
       StringBuffer buf = new StringBuffer();
       for (int i = 0; i < inp.length(); i++) {
         char c = inp.charAt(i);
         switch (c) {
         case 1: buf.append("\u00d0"); break; // Eth
         case 2: buf.append("\u00f0"); break; // eth
         case 3: buf.append("\u0141"); break; // Lslash
         case 4: buf.append("\u0142"); break; // lslash
         case 5: buf.append("\u0160"); break; // S caron
         case 6: buf.append("\u0161"); break; // s caron
         case 7: buf.append("\u00dd"); break; // Y acute
         case 8: buf.append("\u00fd"); break; // y acute
         case 11: buf.append("\u00de"); break; // Thorn
         case 12: buf.append("\u00fe"); break; // thorn
         case 14: buf.append("\u017d"); break; // Z caron
         case 15: buf.append("\u017e"); break; // z caron
         case 17: buf.append("\u0073"); break; // asciitilde
         case 18: buf.append("j\u0305"); break; // j macron [does a single char exist?]
         case 19: buf.append("^"); break; // circumflex
         case 20: buf.append("\u0303"); break; // tilde
         case 21: buf.append("\u00bd"); break; // onehalf
         case 22: buf.append("\u00bc"); break; // onequarter
         case 23: buf.append("\u00b9"); break; // onesuperior
         case 24: buf.append("\u00be"); break; // threequarters
         case 25: buf.append("\u00b3"); break; // threesuperior
         case 26: buf.append("\u00b2"); break; // twosuperior
         case 27: buf.append("\u00a6"); break; // brokenbar
         case 28: buf.append("-"); break; // minus
         case 29: buf.append("\u00d7"); break; // multiply
         case 39: buf.append("'"); break; // quotesingle
         case 94: buf.append("\u0302"); break; // circumflex
         case 96: buf.append("\u0300"); break; // grave
         case 128: buf.append("\u00c4"); break; // A dieresis
         case 129: buf.append("\u00c5"); break; // A ring
         case 131: buf.append("\u00c9"); break; // E acute
         case 132: buf.append("\u00d1"); break; // N tilde
         case 133: buf.append("\u00d6"); break; // O dieresis
         case 134: buf.append("\u00dc"); break; // U dieresis
         case 135: buf.append("\u00e1"); break; // a acute
         case 136: buf.append("\u00e0"); break; // a grave
         case 137: buf.append("\u00e2"); break; // a circumflex
         case 138: buf.append("\u00e4"); break; // a dieresis
         case 139: buf.append("\u00e3"); break; // a tilde
         case 140: buf.append("\u0101"); break; // a macron
         case 141: buf.append("\u00e7"); break; // c cedilla
         case 142: buf.append("\u00e9"); break; // e acute
         case 143: buf.append("\u00e8"); break; // e grave
         case 144: buf.append("\u00ea"); break; // e circumflex
         case 145: buf.append("\u00eb"); break; // e dieresis
         case 146: buf.append("\u00ed"); break; // i acute
         case 147: buf.append("\u00ec"); break; // i grave
         case 148: buf.append("\u00ee"); break; // i circumflex
         case 149: buf.append("\u00ef"); break; // i dieresis
         case 150: buf.append("\u00f1"); break; // n tilde
         case 151: buf.append("\u00f3"); break; // o acute
         case 152: buf.append("\u00f2"); break; // o grave
         case 153: buf.append("\u00f4"); break; // o circumflex
         case 154: buf.append("\u00f6"); break; // o dieresis
         case 155: buf.append("\u00f5"); break; // o tilde
         case 156: buf.append("\u00fa"); break; // u acute
         case 157: buf.append("\u00f9"); break; // u grave
         case 158: buf.append("\u00fb"); break; // u circumflex
         case 159: buf.append("\u00fc"); break; // u dieresis
         case 160: buf.append("\u1e6d"); break; // t underdot
         case 161: buf.append("\u00b0"); break; // degree
         case 162: buf.append("\u1ebd"); break; // e tilde
         case 163: buf.append("\u00a3"); break; // sterling
         case 164: buf.append("\u00a7"); break; // section
         case 166: buf.append("\u00b6"); break; // paragraph
         case 167: buf.append("\u015b"); break; // s acute
         case 168: buf.append("\u1e5b"); break; // r underdot
         case 169: buf.append("\u1e67"); break; // s caron
         case 171: buf.append("\u0301"); break; // acute
         case 172: buf.append("\u0308"); break; // dieresis
         case 173: buf.append("\u1e6d"); break; // t underdot
         case 174: buf.append("\u00c6"); break; // AE
         case 175: buf.append("\u014d"); break; // o macron
         case 176: buf.append("\u0129"); break; // i tilde
         case 177: buf.append("\u00b1"); break; // plusminus
         case 180: buf.append("\u012b"); break; // i macron
         case 181: buf.append("\u1e43"); break; // m underdot
         case 182: buf.append("\u1e0d"); break; // d underdot
         case 183: buf.append("\u1e63"); break; // s underdot
         case 185: buf.append("\u017a"); break; // z acute
         case 186: buf.append("\u1e45"); break; // n overdot
         case 189: buf.append("\u0169"); break; // u tilde
         case 190: buf.append("\u00e6"); break; // ae
         case 191: buf.append("\u00f8"); break; // oslash
         case 192: buf.append("\u0304\u0306"); break; // macron breve
         case 194: buf.append("\u1e37"); break; // 
         case 195: buf.append("j\u0305"); break; // j macron [does a single char exist?]
         case 196: buf.append("\u0103"); break; // a breve
         case 197: buf.append("\u016d"); break; // u breve
         case 200: buf.append("\u1e42"); break; // M underdot
         case 201: buf.append("\u2026"); break; // ellipsis
         case 203: buf.append("\u00c0"); break; // A grave
         case 204: buf.append("\u00c3"); break; // A tilde
         case 205: buf.append("\u00d5"); break; // O tilde
         case 206: buf.append("m\u0306"); break; // m breve
         case 207: buf.append("\u0153"); break; // oe
         case 208: buf.append("\u2013"); break; // endash
         case 209: buf.append("\u2014"); break; // emdash
         case 210: buf.append("\u201c"); break; // quotedblleft
         case 211: buf.append("\u201d"); break; // quotedblright
         case 212: buf.append("\u2018"); break; // quoteleft
         case 213: buf.append("\u2019"); break; // quoteright
         case 214: buf.append("\u1e37"); break; // l underring [actually underdot]
         case 215: buf.append("\u1e41"); break; // m overdot
         case 216: buf.append("n\u0306"); break; // n breve
         case 217: buf.append("\u00d7"); break; // multiply
         case 219: buf.append("\u1e5b"); break; // r underring [actually underdot]
         case 220: buf.append("\u1e44"); break; // N overdot
         case 221: buf.append("\u1e62"); break; // S underdot
         case 222: buf.append("\u1e24"); break; // H underdot
         case 223: buf.append("\u1e0c"); break; // D underdot
         case 224: buf.append("\u2021"); break; // daggerdbl
         case 226: buf.append("\u1e36"); break; // L underdot
         case 227: buf.append("\u0113"); break; // e macron
         case 229: buf.append("\u1e5f"); break; // r underbar
         case 230: buf.append("r\u0324"); break; // r underdieresis
         case 231: buf.append("\u012a"); break; // I macron
         case 232: buf.append("\u016b"); break; // u macron
         case 233: buf.append("\u01e6c"); break; // T underdot
         case 234: buf.append("\u1e64"); break; // S acute
         case 235: buf.append("\u2020"); break; // dagger
         case 236: buf.append("\u0115"); break; // e breve
         case 237: buf.append("\u014f"); break; // o breve
         case 238: buf.append("\u0100"); break; // A macron
         case 239: buf.append("\u1e46"); break; // N underdot
         case 241: buf.append("\u1e3b"); break; // l underbar
         case 242: buf.append("\u016a"); break; // U macron
         case 243: buf.append("\u0179"); break; // Z acute
         case 244: buf.append("\u1e5a"); break; // R underdot
         case 245: buf.append("\u0131"); break; // dotlessi
         case 246: buf.append("\u1e47"); break; // n underdot
         case 247: buf.append("\u1e49"); break; // n underbar
         case 248: buf.append("\u0304"); break; // macron
         case 249: buf.append("\u0306"); break; // breve
         case 250: buf.append("\u1e25"); break; // h underdot
         case 251: buf.append("\u012d"); break; // i breve
         case 252: buf.append("\u0327"); break; // cedilla
         case 253: buf.append("\u030b"); break; // hungarumlaut
         case 254: buf.append("\u0328"); break; // ogonek
         case 255: buf.append("\u030c"); break; // caron
         case 130: buf.append("\u012b\u0303"); break; // imacron tilde
         case 165: buf.append("\u1e5d"); break; // runderdot macron
         case 170: buf.append("\u016b\0306"); break; // umacron breve
         case 178: buf.append("\u0101\u0301"); break; // amacron acute
         case 179: buf.append("\u016b\u0301"); break; // umacron acute
         case 184: buf.append("\u0113\u0301"); break; // emacron acute
         case 187: buf.append("\u0113\u0300"); break; // emacron breve
         case 188: buf.append("\u014d\u0300"); break; // omacron breve
         case 193: buf.append("\u0101\u0306"); break; // amacron breve
         case 198: buf.append("\u0101\u0303"); break; // amacron tilde
         case 199: buf.append("\u012b\u0301"); break; // imacron acute
         case 218: buf.append("\u1e00"); break; // runderdotmacron acute
         case 225: buf.append("\u1e5b\u0301"); break; // runderdot acute
         case 228: buf.append("\u012b\u0306"); break; // imacron breve
         case 240: buf.append("\u016b\u0303"); break; // umacron tilde
         default: buf.append(c); break;
         }
       }
       return buf.toString();
     }
     static public String normanToUnicodeNew(String inp) {
       StringBuffer buf = new StringBuffer();
       for (int i = 0; i < inp.length(); i++) {
         char c = inp.charAt(i);
         switch (c) {
           case 1: buf.append("\u00d0"); break; // Eth
           case 2: buf.append("\u00f0"); break; // eth
           case 3: buf.append("\u0141"); break; // Lslash
           case 4: buf.append("\u0142"); break; // lslash
           case 5: buf.append("\u0160"); break; // S caron
           case 6: buf.append("\u0161"); break; // s caron
           case 7: buf.append("\u00dd"); break; // Y acute
           case 8: buf.append("\u00fd"); break; // y acute
           case 11: buf.append("\u00de"); break; // Thorn
           case 12: buf.append("\u00fe"); break; // thorn
           case 14: buf.append("\u017d"); break; // Z caron
           case 15: buf.append("\u017e"); break; // z caron
           case 17: buf.append("\u0073"); break; // asciitilde
           case 18: buf.append("j\u0305"); break; // j macron [does a single char exist?]
           case 19: buf.append("^"); break; // circumflex
           case 20: buf.append("\u0303"); break; // tilde
           case 21: buf.append("\u00bd"); break; // onehalf
           case 22: buf.append("\u00bc"); break; // onequarter
           case 23: buf.append("\u00b9"); break; // onesuperior
           case 24: buf.append("\u00be"); break; // threequarters
           case 25: buf.append("\u00b3"); break; // threesuperior
           case 26: buf.append("\u00b2"); break; // twosuperior
           case 27: buf.append("\u00a6"); break; // brokenbar
           case 28: buf.append("-"); break; // minus
           case 29: buf.append("\u00d7"); break; // multiply
           case 39: buf.append("'"); break; // quotesingle
           case 94: buf.append("\u0302"); break; // circumflex
           case 96: buf.append("\u0300"); break; // grave
           case 196: buf.append("\u00c4"); break; // A dieresis
           case 197: buf.append("\u00c5"); break; // A ring
           case 201: buf.append("\u00c9"); break; // E acute
           case 209: buf.append("\u00d1"); break; // N tilde
           case 214: buf.append("\u00d6"); break; // O dieresis
           case 220: buf.append("\u00dc"); break; // U dieresis
           case 225: buf.append("\u00e1"); break; // a acute
           case 224: buf.append("\u00e0"); break; // a grave
           case 226: buf.append("\u00e2"); break; // a circumflex
           case 228: buf.append("\u00e4"); break; // a dieresis
           case 227: buf.append("\u00e3"); break; // a tilde
           case 229: buf.append("\u0101"); break; // a macron
           case 231: buf.append("\u00e7"); break; // c cedilla
           case 233: buf.append("\u00e9"); break; // e acute
           case 232: buf.append("\u00e8"); break; // e grave
           case 234: buf.append("\u00ea"); break; // e circumflex
           case 235: buf.append("\u00eb"); break; // e dieresis
           case 237: buf.append("\u00ed"); break; // i acute
           case 236: buf.append("\u00ec"); break; // i grave
           case 238: buf.append("\u00ee"); break; // i circumflex
           case 239: buf.append("\u00ef"); break; // i dieresis
           case 241: buf.append("\u00f1"); break; // n tilde
           case 243: buf.append("\u00f3"); break; // o acute
           case 242: buf.append("\u00f2"); break; // o grave
           case 244: buf.append("\u00f4"); break; // o circumflex
           case 246: buf.append("\u00f6"); break; // o dieresis
           case 245: buf.append("\u00f5"); break; // o tilde
           case 250: buf.append("\u00fa"); break; // u acute
           case 249: buf.append("\u00f9"); break; // u grave
           case 251: buf.append("\u00fb"); break; // u circumflex
           case 252: buf.append("\u00fc"); break; // u dieresis
           case 8224: buf.append("\u1e6d"); break; // t underdot
           case 176: buf.append("\u00b0"); break; // degree
           case 162: buf.append("\u1ebd"); break; // e tilde
           case 163: buf.append("\u00a3"); break; // sterling
           case 167: buf.append("\u00a7"); break; // section
           case 182: buf.append("\u00b6"); break; // paragraph
           case 223: buf.append("\u015b"); break; // s acute
           case 174: buf.append("\u1e5b"); break; // r underdot
           case 169: buf.append("\u1e45"); break; // n overdot
           case 180: buf.append("\u0301"); break; // acute
           case 168: buf.append("\u0308"); break; // dieresis
           case 8800: buf.append("\u1e6d"); break; // t underdot
           case 198: buf.append("\u00c6"); break; // AE
           case 216: buf.append("\u014d"); break; // o macron
           case 8734: buf.append("\u0129"); break; // i tilde
           case 177: buf.append("\u00b1"); break; // plusminus
           case 165: buf.append("\u012b"); break; // i macron
           case 181: buf.append("\u1e43"); break; // m underdot
           case 8706: buf.append("\u1e0d"); break; // d underdot
           case 8721: buf.append("\u1e63"); break; // s underdot
           case 960: buf.append("\u017a"); break; // z acute
           case 8747: buf.append("\u1e45"); break; // n overdot
           case 937: buf.append("\u0169"); break; // u tilde
           case 230: buf.append("\u00e6"); break; // ae
           case 248: buf.append("\u00f8"); break; // oslash
           case 191: buf.append("\u0304\u0306"); break; // macron breve
           case 172: buf.append("\u1e37"); break; // 
           case 8730: buf.append("j\u0305"); break; // j macron [does a single char exist?]
           case 402: buf.append("\u0103"); break; // a breve
           case 8776: buf.append("\u016d"); break; // u breve
           case 187: buf.append("\u1e42"); break; // M underdot
           case 8230: buf.append("\u2026"); break; // ellipsis
           case 192: buf.append("\u00c0"); break; // A grave
           case 195: buf.append("\u00c3"); break; // A tilde
           case 213: buf.append("\u00d5"); break; // O tilde
           case 338: buf.append("m\u0306"); break; // m breve
           case 339: buf.append("\u0153"); break; // oe
           case 8211: buf.append("\u2013"); break; // endash
           case 8212: buf.append("\u2014"); break; // emdash
           case 8220: buf.append("\u201c"); break; // quotedblleft
           case 8221: buf.append("\u201d"); break; // quotedblright
           case 8216: buf.append("\u2018"); break; // quoteleft
           case 8217: buf.append("\u2019"); break; // quoteright
           case 247: buf.append("\u1e37"); break; // l underring [actually underdot]
           case 9674: buf.append("\u1e41"); break; // m overdot
           case 255: buf.append("n\u0306"); break; // n breve
           case 376: buf.append("\u00d7"); break; // multiply
           case 8364: buf.append("\u1e5b"); break; // r underring [actually underdot]
           case 8249: buf.append("\u1e44"); break; // N overdot
           case 8250: buf.append("\u1e62"); break; // S underdot
           case 64257: buf.append("\u1e24"); break; // H underdot
           case 64258: buf.append("\u1e0c"); break; // D underdot
           case 8225: buf.append("\u2021"); break; // daggerdbl
           case 8218: buf.append("\u1e36"); break; // L underdot
           case 8222: buf.append("\u0113"); break; // e macron
           case 194: buf.append("\u1e5f"); break; // r underbar
           case 202: buf.append("r\u0324"); break; // r underdieresis
           case 193: buf.append("\u012a"); break; // I macron
           case 203: buf.append("\u016b"); break; // u macron
           case 200: buf.append("\u1e6c"); break; // T underdot
           case 205: buf.append("\u1e64"); break; // S acute
           case 206: buf.append("\u2020"); break; // dagger
           case 207: buf.append("\u0115"); break; // e breve
           case 204: buf.append("\u014f"); break; // o breve
           case 211: buf.append("\u0100"); break; // A macron
           case 212: buf.append("\u1e46"); break; // N underdot
           case 210: buf.append("\u1e3b"); break; // l underbar
           case 218: buf.append("\u016a"); break; // U macron
           case 219: buf.append("\u0179"); break; // Z acute
           case 217: buf.append("\u1e5a"); break; // R underdot
           case 305: buf.append("\u0131"); break; // dotlessi
           case 710: buf.append("\u1e47"); break; // n underdot
           case 732: buf.append("\u1e49"); break; // n underbar
           case 175: buf.append("\u0304"); break; // macron
           case 728: buf.append("\u0306"); break; // breve
           case 729: buf.append("\u1e25"); break; // h underdot
           case 730: buf.append("\u012d"); break; // i breve
           case 184: buf.append("\u0327"); break; // cedilla
           case 733: buf.append("\u030b"); break; // hungarumlaut
           case 731: buf.append("\u0328"); break; // ogonek
           case 711: buf.append("\u030c"); break; // caron
           case 199: buf.append("\u012b\u0303"); break; // imacron tilde
           case 8226: buf.append("\u1e5d"); break; // runderdot macron
           case 8482: buf.append("\u016b\0306"); break; // umacron breve
           case 8804: buf.append("\u0101\u0301"); break; // amacron acute
           case 8805: buf.append("\u016b\u0301"); break; // umacron acute
           case 8719: buf.append("\u0113\u0301"); break; // emacron acute
           case 170: buf.append("\u0113\u0300"); break; // emacron breve
           case 186: buf.append("\u014d\u0300"); break; // omacron breve
           case 161: buf.append("\u0101\u0306"); break; // amacron breve
           case 8710: buf.append("\u0101\u0303"); break; // amacron tilde
           case 171: buf.append("\u012b\u0301"); break; // imacron acute
           case 8260: buf.append("\u1e00"); break; // runderdotmacron acute
           case 183: buf.append("\u1e5b\u0301"); break; // runderdot acute
           case 8240: buf.append("\u012b\u0306"); break; // imacron breve
           case 63743: buf.append("\u016b\u0303"); break; // umacron tilde
           default: buf.append(c); break;
         }
       }
       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);
     }
 }  }
   

Removed from v.1.35  
changed lines
  Added in v.1.64


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