Diff for /FM2SQL/Attic/Convert.java between versions 1.45 and 1.77

version 1.45, 2004/03/09 12:34:09 version 1.77, 2004/09/20 11:57:41
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.ResultSet;
   import java.sql.SQLException;
   import java.sql.Statement;
   import java.sql.Types;
   import java.text.ParseException;
   import java.util.ArrayList;
   import java.util.Hashtable;
   import java.util.Iterator;
   import java.util.List;
   import java.util.StringTokenizer;
   import java.util.TreeSet;
   import java.util.Vector;
   
   import javax.swing.JDialog;
   import javax.swing.JLabel;
   import javax.swing.JPanel;
   
 import com.exploringxml.xml.Node;  import com.exploringxml.xml.Node;
 import com.exploringxml.xml.Xparse;  import com.exploringxml.xml.Xparse;
   
 class Convert  class Convert
 {  {
     /**Helper class for index creation
      * @author rogo
      *
      */
     public static class IndexList extends Vector
     {
       public String toString()
       {
         StringBuffer buff = new StringBuffer(1000);
         int count = 0;
         for (Iterator iter = this.iterator(); iter.hasNext();)
         {
           String element = (String) iter.next();
           if (count < elementCount - 1)
           {
             buff.append(element).append(", ");
             count++;
           } else
             buff.append(element);
   
         }
   
         return buff.toString();
       }
     }
   static DBBean bean = new DBBean();    static DBBean bean = new DBBean();
   static DBBean beanDest = new DBBean();    static DBBean beanDest = new DBBean();
   
Line 25  class Convert Line 81  class Convert
   static boolean batchRun = false;    static boolean batchRun = false;
   static Vector databases = new Vector();    static Vector databases = new Vector();
   final static int numHits = 5000;    final static int numHits = 5000;
   final static int numIntervalls = 2;    final static int numIntervalls = 4;
     static boolean debug = false;
   public static void main(String args[])    public static void main(String args[])
   {    {
     /*    try      /*    try
Line 43  class Convert Line 100  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 52  class Convert Line 107  class Convert
     {      {
       e1.printStackTrace();        e1.printStackTrace();
     }      }
     PrintStream stream = new PrintStream(file);      PrintStream stream = new PrintStream(file, false);
       if (!debug)
       {
     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);
   }    }
Line 64  class Convert Line 125  class Convert
     bean = source;      bean = source;
     beanDest = destination;      beanDest = destination;
     convert(null,null,names,layouts,selects,creates,ids,mode,delimiter);      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 249  class Convert Line 311  class Convert
     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 448  class Convert Line 510  class Convert
    * @throws Exception     * @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    public static void convert(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode,String delimiter) throws Exception
   {    {
   
Line 456  class Convert Line 517  class Convert
   
     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 469  class Convert Line 530  class Convert
     int deltaID = 1;      int deltaID = 1;
     String idField = "";      String idField = "";
     String destTableName = "";      String destTableName = "";
       String[] fieldNames = null;
     if (source != null && destination != null)      if (source != null && destination != null)
     {      {
       // setting user and passwd         // setting user and passwd 
Line 544  class Convert Line 606  class Convert
         // System.exit(0);          // System.exit(0);
               
       // determine destTableName from createStatement or from source table name        // determine destTableName from createStatement or from source table name
         if(!creates.get(tbIndex).equals(""))          ConversionProperties prop = getFieldNamesAndDestTableName(creates.get(tbIndex).toString(), query, names.get(tbIndex).toString());
         {          destTableName = prop.destTableName;
           String create =creates.get(tbIndex).toString().toLowerCase();          fieldNames = prop.fieldNames;
           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());  
   
         if (mode == Convert.DataBase.CONVERT_MODE)          if (mode == Convert.DataBase.CONVERT_MODE)
         {          {
   
Line 630  class Convert Line 684  class Convert
         command.append(beanDest.getQC());          command.append(beanDest.getQC());
         command.append(destTableName); //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 ( ");
   
Line 654  class Convert Line 716  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 810  class Convert Line 871  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)                  if (obj instanceof ArrayList)
              obj = formatFileMakerArray((List) obj,delimiter);               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 1096  class Convert Line 1160  class Convert
     Vector selects = new Vector();      Vector selects = new Vector();
     Vector creates = new Vector();      Vector creates = new Vector();
     Vector ids = new Vector();      Vector ids = new Vector();
       Vector indexListVec = new Vector();
     String delimiter = "|";      String delimiter = "|";
     int mode = -1;      int mode = -1;
   
Line 1115  class Convert Line 1180  class Convert
         selects = new Vector();          selects = new Vector();
         creates = new Vector();          creates = new Vector();
         ids = new Vector();          ids = new Vector();
           indexListVec = new Vector();
         // parse dataBase          // parse dataBase
         Node node = root.find("convert/source/database/url", new int[] { 1, 1, i, 1 });          Node node = root.find("convert/source/database/url", new int[] { 1, 1, i, 1 });
         Node node1 = root.find("convert/source/database/user", new int[] { 1, 1, i, 1, 1 });          Node node1 = root.find("convert/source/database/user", new int[] { 1, 1, i, 1, 1 });
Line 1122  class Convert Line 1188  class Convert
         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 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");
         if (node == null)          if (node == null)
Line 1130  class Convert Line 1198  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 (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 1150  class Convert Line 1225  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 1175  class Convert Line 1255  class Convert
           String name = (String) node4.attributes.get("name");            String name = (String) node4.attributes.get("name");
           String layout = (String) node4.attributes.get("layout");            String layout = (String) node4.attributes.get("layout");
           String id = (String) node4.attributes.get("id");            String id = (String) node4.attributes.get("id");
             String indexList = (String) node4.attributes.get("indexList");
   
           System.out.println("id was " + id);            System.out.println("id was " + id);
           if (name == null)            if (name == null)
             throw new Error("parse error required table tag attribute name missing");              throw new Error("parse error required table tag attribute name missing");
Line 1182  class Convert Line 1264  class Convert
             layout = "";              layout = "";
           if (id == null)            if (id == null)
             id = "";              id = "";
             if (indexList == null)
               indexList = "";
           if (name.equals(""))            if (name.equals(""))
             throw new Error("parse error table tag attribute must not be empty");              throw new Error("parse error table tag attribute must not be empty");
           tables.add(name);            tables.add(name);
           layouts.add(layout);            layouts.add(layout);
   
           ids.add(id);            ids.add(id);
             indexListVec.add(indexList);
           String query = (node5 == null) ? "" : node5.getCharacters();            String query = (node5 == null) ? "" : node5.getCharacters();
           if (query.equals(""))            if (query.equals(""))
             System.err.println("Warning empty select tag or  select tag missing !!");              System.err.println("Warning empty select tag or  select tag missing !!");
Line 1200  class Convert Line 1286  class Convert
         }          }
         DataBase dataBase = new DataBase(database, tables, layouts, selects, creates, ids, mode);          DataBase dataBase = new DataBase(database, tables, layouts, selects, creates, ids, mode);
         dataBase.delimiter = delimiter;          dataBase.delimiter = delimiter;
           dataBase.buildIndexTable(indexListVec);
         databases.add(dataBase);          databases.add(dataBase);
       }        }
       DBBean database = new DBBean();        DBBean database = new DBBean();
Line 1217  class Convert Line 1304  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,db.delimiter);            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, db.delimiter, new Vector(db.htIndex.values()));
           }
       }        }
       // printContents(node3);        // printContents(node3);
       //   FM2SQL.fmInstance=new FM2SQL();        //   FM2SQL.fmInstance=new FM2SQL();
Line 1229  class Convert Line 1324  class Convert
     {      {
           
       e.printStackTrace();        e.printStackTrace();
   
       } finally
       {
         bean.closeAllConnections();
         beanDest.closeAllConnections();
     }      }
   }    }
   public static Vector getXMLConfig(String xmlFile)    public static Vector getXMLConfig(String xmlFile)
Line 1291  class Convert Line 1391  class Convert
         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 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)          if (delimiterNode != null)
           delimiter = delimiterNode.getCharacters();            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");
         if (node == null)          if (node == null)
Line 1321  class Convert Line 1428  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 1435  class Convert Line 1545  class Convert
         //contents=n.contents.v i=0;          //contents=n.contents.v i=0;
       }        }
       // System.out.println(n.type);        // System.out.println(n.type);
   
     }      }
   }    }
   /**    /**
Line 1446  class Convert Line 1555  class Convert
   {    {
     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 1464  class Convert Line 1580  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     * Helper class for XML-File parsing
    * Holds the parsed data     * Holds the parsed data
Line 1480  class Convert Line 1617  class Convert
     Vector tables;      Vector tables;
     Vector ids;      Vector ids;
     String delimiter = "//";      String delimiter = "//";
       /**
        * maps table name to index fields
        */
       Hashtable htIndex = new Hashtable();
       boolean useNormanToUnicodeMapper = false;
   
     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 DELETE_MODE = 4;
       final static int SYNCHRONIZE_MODE = 5;
   
     int mode = -1;      int mode = -1;
   
Line 1499  class Convert Line 1643  class Convert
       this.bean.setIDVector(ids);        this.bean.setIDVector(ids);
     }      }
     /**      /**
        * @param indexListVec
        */
       public void buildIndexTable(Vector indexListVec)
       {
         for (int i = 0; i < tables.size(); i++)
         {
           fillIndexList((String) tables.get(i), (String) indexListVec.get(i));
         }
       }
       /**
      * writes the data contained in this object to the buffered writer       * writes the data contained in this object to the buffered writer
      * * @param buffr       * * @param buffr
      * @throws Exception       * @throws Exception
Line 1518  class Convert Line 1672  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 1528  class Convert Line 1686  class Convert
         String select = (String) selects.get(index);          String select = (String) selects.get(index);
         String create = (String) creates.get(index);          String create = (String) creates.get(index);
         String id = (String) ids.get(index);          String id = (String) ids.get(index);
           IndexList indexList = (IndexList) htIndex.get(table);
         buffr.write("      <table name = \"" + table + "\" layout = \"" + layout + "\" id = \"" + id + "\" >\n");          if (indexList == null)
             indexList = new IndexList();
           buffr.write("      <table name = \"" + table + "\" layout = \"" + layout + "\" id = \"" + id + "\" indexList =\"" + indexList + "\">\n");
         buffr.write("         <select>" + convertToEntities(select) + "</select>\n");          buffr.write("         <select>" + convertToEntities(select) + "</select>\n");
         if (!create.equals(""))          if (!create.equals(""))
           buffr.write("         <create>" + create + "         </create>\n");            buffr.write("         <create>" + create + "         </create>\n");
Line 1538  class Convert Line 1698  class Convert
       }        }
       buffr.write("    </database>\n");        buffr.write("    </database>\n");
     }      }
   
       public void fillIndexList(String table, String list)
       {
         IndexList indexList = new IndexList();
         StringTokenizer tokenizer = new StringTokenizer(list, ",");
         while (tokenizer.hasMoreTokens())
         {
           indexList.add(tokenizer.nextToken());
         }
         System.out.println(indexList);
   
         htIndex.put(table, indexList);
       }
     public String toString()      public String toString()
     {      {
       return bean.url + " " + tables;        return bean.url + " " + tables;
Line 1578  class Convert Line 1751  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, String delimiter, Vector indexList)
       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);
           destQuery = destQuery.replaceAll(bean.getQC(), beanDest.getQC());
           destQuery = removeLayoutPartFromQuery(destQuery, layouts.get(tbIndex).toString());
           // TODO remove layout part for destQuery
           String tempQueryDest = destQuery;
           // remove extra query parts destQuery.substring(0,destQuery.lastIndexOf(destTableName)+destTableName.length()+1);
           System.out.println("new Query " + tempQueryDest);
           System.out.println("idfield "+idField+" "+ids.get(tbIndex).toString());
           if (!idField.equals(""))
           {
             long startTime = System.currentTimeMillis();
             int counter = -1;
             TreeSet linesToDelete = null;
             PreparedStatement delPSt = null;
             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, 0);
               myIdsDest = beanDest.getIDVector(convertText(idField), destTableName, tempQueryDest, 0);
               //System.out.println("status of remove  "+myIds.remove("b015892"));
               System.out.println("ids found for "+idField+" "+!myIds.isEmpty());
               if (myIds.isEmpty())
                 break;
               vec = new Vector(myIds);
               vecDest = new Vector(myIdsDest);
               rowCount = vec.size();
               // Deletion will work this way
               Vector deleted = new Vector(vec);
   
               TreeSet linesToAppend = new TreeSet(vec);
               linesToAppend.addAll(vec);
               linesToDelete = new TreeSet(vecDest);
               // 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 + " " + destTableName);
               System.out.println("linesToDelete " + linesToDelete + " " + destTableName);
               System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIds.size());
               deltaID = (int) Math.round((double) myIds.size() / (double) numIntervalls);
               ConversionProperties prop = getFieldNamesAndDestTableName(creates.get(tbIndex).toString(), query, names.get(tbIndex).toString());
               StringBuffer insCommand = createInsertCommand(prop.destTableName, prop.fieldNames);
               StringBuffer updCommand = createUpdateCommand(prop.destTableName, prop.fieldNames, tempIDdest);
               StringBuffer delCommand = createDeleteCommand(destTableName, tempIDdest);
               PreparedStatement insPst = beanDest.getConnection().prepareStatement(insCommand.toString());
               PreparedStatement updPst = beanDest.getConnection().prepareStatement(updCommand.toString());
               delPSt = beanDest.getConnection().prepareStatement(delCommand.toString());
               //    delPSt.setString(1,"b015892");
               //   delPSt.execute();
               //  if (true)
               //  return;
               if (vec.size() <= numIntervalls)
               {
                 endIndex = 0;
                 deltaID = vec.size();
               }
               for (int k = 0; k < vec.size() - deltaID; k = k + deltaID)
               {
                 System.out.println(vec.get(k) + " " + vec.get(k + deltaID) + " " + vec.lastElement());
                 if (query.indexOf("where") > 0)
                   tempQuery = query + " and " + tempID + ">='" + vec.get(k) + "' and " + tempID + "<='" + vec.get(k + deltaID) + "'";
                 else
                   tempQuery = query + " where " + tempID + ">='" + vec.get(k) + "' and " + tempID + "<='" + vec.get(k + deltaID) + "'";
                 System.out.println(tempQuery);
                 if (dialog != null)
                   dialog.title.setText("Reading table data ...");
   
                 // bean.makeQuery(tempQuery, deltaID);
                 if (dialog != null)
                   dialog.title.setText("Writing table data ...");
   
                 performSynchronize(idField, vec, tempQuery, linesToDelete, linesToAppend, insPst, updPst, delPSt, deltaID, delimiter);
                 // System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIdsDest.size());
                 endIndex = k + deltaID;
               }
               System.out.println(endIndex);
               //all data written ? if not write last chunk of data
               if (endIndex == vec.size() - 1)
                 System.out.println("fits");
               else
               {
                 System.out.println(" last intervall from " + vec.get(endIndex) + " " + vec.lastElement());
   
                 if (query.indexOf("where") > 0)
                   tempQuery = query + " and " + tempID + ">='" + vec.get(endIndex) + "' and " + tempID + "<='" + vec.lastElement() + "'";
                 else
                   tempQuery = query + " where " + tempID + ">='" + vec.get(endIndex) + "' and " + tempID + "<='" + vec.lastElement() + "'";
                 System.out.println(tempQuery);
                 if (dialog != null)
                   dialog.title.setText("Reading table data ...");
                 //    bean.makeQuery(tempQuery, 0);
                 if (dialog != null)
                   dialog.title.setText("Writing table data ...");
                 performSynchronize(idField, vec, tempQuery, linesToDelete, linesToAppend, insPst, updPst, delPSt, deltaID, delimiter);
                 // System.out.println("ID LIST SIZE " + Math.round((double) myIds.size() / (double) numIntervalls) + " " + myIdsDest.size());
               }
               // prepare new query for next chunk
               if (query.indexOf("where") > 0)
                 tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'";
               else
                 tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'";
   
             }
             String tableName = names.get(tbIndex).toString();
             IndexList idList = (IndexList) indexList.get(0);
             System.out.println("found list " + idList);
             Statement stm = beanDest.getConnection().createStatement();
             Vector destTables = beanDest.getTableNames();
             System.out.println("tempQueryDest" + tempQueryDest);
             beanDest.makeQuery(tempQueryDest, 0);
             for (Iterator iter = idList.iterator(); iter.hasNext();)
             {
               String indexField = (String) iter.next();
               indexField = convertText(indexField);
               String indexName = destTableName + "_" + indexField;
               if (destTables.contains(indexName))
               {
                 stm.execute("DROP  INDEX " + destTableName + "_" + indexField);
                 //  continue;
               }
            //    stm.execute("DROP  INDEX "+destTableName+"_"+indexField);
   
               String type = beanDest.getColumnType(indexField).toLowerCase();
               // System.out.println(indexField+" "+type+" "+(type.indexOf("text") >= 0 || type.indexOf("varchar") >= 0 || type.indexOf("char") >= 0));
               if (type.indexOf("text") >= 0 || type.indexOf("varchar") >= 0 || type.indexOf("char") >= 0)
               {
                 if (beanDest.url.indexOf("mysql") >= 0)
                 {
                   //System.out.println("CREATE  INDEX " + indexName + " ON " + destTableName + " (" + indexField + "(10))");
                   // TODO problem if index exist !!!
                   stm.execute("CREATE  INDEX " + indexName + " ON " + destTableName + " (" + indexField + "(10))");
                 } else
                 {
                   stm.execute("CREATE  INDEX " + indexName + " ON " + destTableName + " (lower( " + indexField + "))");
   
                 }
               
               } else
               {
                 stm.execute("CREATE  INDEX " + destTableName + "_" + indexField + " ON " + destTableName + "(" + indexField + ")");
   
               }
   
               // stm.execute("DROP  INDEX "+destTableName+"_"+indexField);
   
             }
             //  CREATE UNIQUE INDEX title_idx ON films (title);  
             for (Iterator iter = linesToDelete.iterator(); iter.hasNext();)
             {
               String id = (String) iter.next();
               delPSt.setString(1, id);
               delPSt.execute();
   
             }
   
             long endTime = System.currentTimeMillis();
             System.out.println("Time for incremental synchronize  elapsed " + (endTime - startTime));
           } // to idfield if  
         } // table loop
   
       } catch (Exception e)
       {
         System.out.println("Error while connecting to database " + e);
         e.printStackTrace();
         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);
       }
     }
     /**
      * @param destQuery
      * @param string
      * @return
      */
     private static String removeLayoutPartFromQuery(String destQuery, String layoutName)
     {
       String removeString = "layout " + beanDest.getQC() + layoutName + beanDest.getQC();
       destQuery = destQuery.replaceFirst(removeString, "");
       System.out.println("destQuery change to " + destQuery);
       return destQuery;
     }
     private static void performSynchronize(
       String idField,
       Vector vec,
       String tempQuery,
       TreeSet linesToDelete,
       TreeSet linesToAppend,
       PreparedStatement insPst,
       PreparedStatement updPst,
       PreparedStatement delPSt,
       int deltaID,
       String delimiter)
       throws SQLException, ParseException
     {
       Vector[] vectors = bean.getQueryData(tempQuery, deltaID);
       int idIndex = vectors[1].indexOf(idField);
       // todo arraylist code has to be added
       for (Iterator iter = vectors[0].iterator(); iter.hasNext();)
       {
         Vector line = (Vector) iter.next();
         Object lineIDIndex = line.get(idIndex);
         if (linesToAppend.contains(lineIDIndex))
           System.out.println("line " + linesToAppend.contains(line.get(idIndex)) + " " + lineIDIndex);
         if (linesToAppend.contains(lineIDIndex))
         {
           for (int l = 0; l < line.size(); ++l)
           {
             Object obj = line.get(l);
             if (obj instanceof ArrayList)
               obj = formatFileMakerArray((List) obj, delimiter);
             if (obj != null)
               insPst.setString(l + 1, obj.toString());
             else
               insPst.setNull(l + 1, Types.NULL);
           }
           insPst.execute();
   
         } else // update
           {
           for (int l = 0; l < line.size(); ++l)
           {
             Object obj = line.get(l);
             if (obj instanceof ArrayList)
               obj = formatFileMakerArray((List) obj, delimiter);
             if (obj != null)
               updPst.setString(l + 1, obj.toString());
             else
               updPst.setNull(l + 1, Types.NULL);
           }
           updPst.setString(line.size() + 1, line.get(idIndex).toString());
           //updPst.addBatch();
           updPst.execute();
         }
       }
       //updPst.executeBatch();
     } // 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] = beanDest.getQC() + convertText(fieldName) + beanDest.getQC();
             // 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] = beanDest.getQC() + convertText(element) + beanDest.getQC();
             // System.out.println("field " + fieldNames[fieldIndex]);
           }
         }
       }
       return new ConversionProperties(destTableName, fieldNames);
     }
     /**
      * creates an insert into statement for the specified table and given
      * field names 
      * @param destTableName
      * @param fieldNames
      * @return
      */
     public static StringBuffer createInsertCommand(String destTableName, String[] fieldNames)
     {
       StringBuffer command = new StringBuffer();
       command.append("INSERT  INTO ");
       command.append(beanDest.getQC());
       command.append(destTableName); //convertText((String) names.get(tbIndex)));
       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 ( ");
       // add a question marks for every field 
       for (int i = 0; i < bean.getColumnNames().size() - 1; ++i)
         command.append("?,");
       command.append("?)");
       return command;
     }
     public static StringBuffer createUpdateCommand(String destTableName, String[] fieldNames, String id)
     {
       StringBuffer command = new StringBuffer();
   
       command.append("UPDATE ");
       command.append(beanDest.getQC());
       command.append(destTableName);
       //command.append(convertText((String) names.get(tbIndex)));
       command.append(beanDest.getQC());
       command.append(" SET  ");
   
       int size = bean.getColumnNames().size();
       for (int i = 0; i < size - 1; ++i)
         command.append(fieldNames[i] + " = ? ,");
       command.append(fieldNames[size - 1] + " = ? ");
       command.append("WHERE " + id + " =  ?");
       return command;
     }
     public static StringBuffer createDeleteCommand(String destTableName, String idField)
     {
       StringBuffer 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());
       command.append("WHERE " + idField + " =  ?");
       return command;
     }
   public void makeTest(String table,String idField,String tempQuery) throws Exception
   {
     int counter=0;
     
     // ****** test code *****
               
           bean.getConnection();
           ResultSet resultSet=null;
           String lastResult ="P227634.11";//"P227625.79554";//"P227625.77391";//"P116034.970998";
           String myQuery="select "+bean.getQC()+idField+bean.getQC()+",serial "+" from "+bean.getQC()+table+bean.getQC();
           System.out.println("Query is now "+myQuery);
           JDialog statusDialog=new JDialog();
           statusDialog.setTitle("Status Information");
           JLabel status=new JLabel("actual DataSet : ");
           JLabel status2=new JLabel(Integer.toString(++counter));
           JLabel status3=new JLabel(lastResult);
           
           JPanel statusPanel = new JPanel();
           JPanel statusPanel2 = new JPanel();
           statusPanel.add(status);
           statusPanel.add(status2);
           statusPanel2.add(status3);
           statusDialog.getContentPane().add(statusPanel,"North");
           statusDialog.getContentPane().add(statusPanel2,"Center");
           statusDialog.setLocation(400,500);
           statusDialog.setSize(300,150);
           statusDialog.setVisible(true);
           while (true)
           {
             if (!statusDialog.isVisible())
               statusDialog.setVisible(true);
             tempQuery = myQuery + " where " + bean.getQC() + idField + bean.getQC() + ">'" + lastResult + "'";
             resultSet = bean.makeQuery(tempQuery, 1);
             if (resultSet == null)
             {
               System.out.println("lastResult was " + lastResult + " counter was " + counter);
               break;
             } else
             {
               resultSet.next();
               lastResult = resultSet.getString(1);
               counter++;
               status2.setText(Integer.toString(counter));
               status3.setText(lastResult+" "+resultSet.getString(2));
                 if(counter%100==0)
                  {
                    System.out.println("actual Result was " + lastResult + " counter was " + counter);
                    // break;
                  }
             }
             resultSet = null;
           }
           System.exit(0);
   
           //****** end Test ******
   
   }
 }  }
   

Removed from v.1.45  
changed lines
  Added in v.1.77


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