--- FM2SQL/src/DBBean.java 2005/01/21 11:27:03 1.1 +++ FM2SQL/src/DBBean.java 2006/09/30 10:58:58 1.5 @@ -79,23 +79,29 @@ public class DBBean Hashtable connectionPool = new Hashtable(); public ResultSetMetaData metaData; // register DataBase Drivers + public static String[] jdbcDrivers = { + "com.fmi.jdbc.JdbcDriver", + "org.postgresql.Driver", + "com.mysql.jdbc.Driver", + "sun.jdbc.odbc.JdbcOdbcDriver", + "com.ddtek.jdbc.sequelink.SequeLinkDriver", + "acs.jdbc.Driver" + }; static { - try - { - DriverManager.registerDriver(new com.fmi.jdbc.JdbcDriver()); - DriverManager.registerDriver((Driver) Class.forName("org.postgresql.Driver").newInstance()); - DriverManager.registerDriver((Driver) Class.forName("com.mysql.jdbc.Driver").newInstance()); - DriverManager.registerDriver((Driver) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance()); - DriverManager.registerDriver((Driver) Class.forName("com.ddtek.jdbc.sequelink.SequeLinkDriver").newInstance()); - DriverManager.registerDriver((Driver) Class.forName("acs.jdbc.Driver").newInstance()); - + for (int i = 0; i < jdbcDrivers.length; i++) { + String driverName = jdbcDrivers[i]; + try { + System.out.println("trying to load jdbc driver "+driverName); + DriverManager.registerDriver((Driver) Class.forName(driverName).newInstance()); + System.out.println(driverName+" loaded OK"); + } catch (Exception e) { + e.printStackTrace(); + } + } // wait a maximum of 10 seconds when attempting to establish a connection DriverManager.setLoginTimeout(10); - } catch (Exception e) - { - System.out.println(e); - } } + /** * Constructs a database bean */ @@ -460,241 +466,7 @@ public class DBBean */ public Vector[] getQueryData(String query, int maxHits) throws SQLException, ParseException,Exception { - long timeStart = System.currentTimeMillis(); - ResultSet resultSet = null; - if (connection == null) - { - Vector[] noData = new Vector[2]; - //System.out.println("Exception occured"); - noData[1] = new Vector(); - Vector vec2 = new Vector(); - noData[0] = new Vector(); - vec2.add("no Connection available"); - noData[0].add(vec2); - noData[1].add("Exception occured! No results available"); - //noData[1].add("no Results were produced"); - - return noData; - } - resultSet = makeQuery(query, maxHits); - metaData = resultSet.getMetaData(); - int columnCount = metaData.getColumnCount(); - - Vector tableData = new Vector(); - while (resultSet.next()) - { - //System.out.println("datatype "+(Types.LONGVARCHAR ==metaData.getColumnType(3))); - Vector tableRow = new Vector(), m_columnClasses = new Vector(); - for (int i = 1; i <= columnCount; i++) - { - // repeating fields and fields from related databases may contain - // multliple data values; the data values are stored using - // a Vector which is then added to the tableRow - // if (metaData instanceof ResultSetMetaDataExt) - if ((metaData instanceof ResultSetMetaDataExt) && (((ResultSetMetaDataExt) metaData).isRelated(i) || ((ResultSetMetaDataExt) metaData).isRepeating(i))) - { - //System.out.println("Related fields"); - // retrieve the repeating or related field contents as a - // com.fmi.jdbc.Array via the ResultSet.getObject method - com.fmi.jdbc.Array array = (com.fmi.jdbc.Array) resultSet.getObject(i); - // create a Vector for storing all of the data values - ArrayList columnData = new ArrayList(); - - try - { - - // call the Array.getStringArray method since the data will - // only be displayed - Object[] fieldData = (Object[]) array.getArray(); - - if (fieldData != null) - { - // add each value to the Vector - for (int j = 0; j < fieldData.length; j++) - { - if (fieldData[j] != null) - columnData.add(fieldData[j]); - } - - } - } catch (Exception e) - { - //System.out.println(e); - } - if (columnData.isEmpty()) - tableRow.add(null); - else - tableRow.addElement(columnData); - //System.out.println(columnData); - //System.out.println("Related fields"+columnData.size()+" "+tableRow.size()); - - m_columnClasses.addElement(java.util.Vector.class); - } else if (metaData.getColumnType(i) == Types.LONGVARBINARY) - { - // use the ResultSet.getObject method for retrieving images - // from FileMaker Pro container fields; the ResultSet.getObject - // method returns a java.awt.Image object for FileMaker Pro - // container fields - try - { - - tableRow.addElement(resultSet.getObject(i)); - } catch (Exception e) - { - // TODO Auto-generated catch block - //e.printStackTrace(); - tableRow.addElement(null); - } - //tableRow.addElement("Picture ignored"); - m_columnClasses.addElement(java.awt.Image.class); - } else if (metaData.getColumnType(i) == Types.TIME) - { - // use the ResultSet.getObject method for retieving images - // from FileMaker Pro container fields; the ResultSet.getObject - // method returns a java.awt.Image object for FileMaker Pro - // container fields - try - { - tableRow.addElement(resultSet.getTime(i).toString()); - m_columnClasses.addElement(java.sql.Time.class); - } catch (Exception e) - { - - String value = resultSet.getString(i); - if (value != null) - { - //System.out.println("SQLTime new "+Time.valueOf("17:00:00").toString()); - int index = 0; - for (int j = 0; j < value.length(); ++j) - { - if (!Character.isLetter(value.charAt(j))) - index = j + 1; - else - break; - } - - tableRow.addElement(value.substring(0, index)); - //m_columnClasses.addElement(java.sql.Time.class); - } else - tableRow.add(null); - m_columnClasses.addElement(String.class); - } // to catch - - } else if (metaData.getColumnType(i) == Types.DATE) - { - // use the ResultSet.getObject method for retieving images - // from FileMaker Pro container fields; the ResultSet.getObject - // method returns a java.awt.Image object for FileMaker Pro - // container fields - - try - { - tableRow.addElement(resultSet.getDate(i)); - - } catch (Exception e) - { - // work around for parse bug in FM JDBC Driver - // for dates of format dd-mm-yyyy - String date = resultSet.getString(i); - date = date.replace('-', '.'); - java.text.DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.GERMAN); - java.util.Date d = dateFormat.parse(date); - // Calendar cal=Calendar.getInstance(Locale.GERMAN); - // cal.setTime(d); - // date=(cal.get(Calendar.YEAR))+"-"+(cal.get(Calendar.MONTH)+1)+"-"+cal.get(Calendar.DATE); - tableRow.addElement(new java.sql.Date(d.getTime())); - System.out.println("Date " + date); - } - } else if (metaData.getColumnTypeName(i) == "NUMBER") - { - // use the ResultSet.getObject method for retieving images - // from FileMaker Pro container fields; the ResultSet.getObject - // method returns a java.awt.Image object for FileMaker Pro - // container fields - try - { - Double value =new Double(resultSet.getDouble(i)); - - - // tableRow.addElement(new Double(resultSet.getDouble(i))); - String tVal =value.toString(); - tVal = tVal.substring(tVal.indexOf('.')+1); - boolean checkMe = tVal.length()==1&&tVal.equals("0"); - // System.out.println("check was"+checkMe+" "+tVal); - if(checkMe) - tableRow.addElement(new Integer(value.intValue())); - else - tableRow.addElement(value); - - } catch (Exception e) - { - - StringBuffer number = new StringBuffer(); - String value = resultSet.getString(i); - System.out.println(value); - for (int c = 0; c < value.length(); ++c) - { - if (Character.isDigit(value.charAt(c))) - { - number.append(value.charAt(c)); - } - } - if (number.length() > 0) - { - tableRow.addElement(null); - m_columnClasses.addElement(Double.class); - } else - tableRow.addElement(null); - } - } else - { - // all other field values are retrieved as strings and - // added to the tableRow Vector - // if(resultSet.getObject(i)!=null) System.out.println(resultSet.getObject(i)); - try - { - String utf8 = null; - if (metaData instanceof ResultSetMetaDataExt) - { - byte[] b = resultSet.getBytes(i); - - if (metaData instanceof ResultSetMetaDataExt) - utf8 = (b == null) ? null : new String(b); - else - utf8 = (b == null) ? null : new String(b, "UTF-8"); - } - else - utf8=resultSet.getString(i); - - // utf8 = (utf8 == null) ? null : new String(utf8.getBytes("UTF-8"), "UTF-8"); - tableRow.addElement(utf8); - - } catch (Exception e) - { - System.out.println("Hey I Got an error" + e); - e.printStackTrace(); - } - m_columnClasses.addElement(java.lang.String.class); - } - } - - // add the tableRow Vector to the tableData Vector - tableData.addElement(tableRow); - } - - // retrieve the column names from the result set; the column names - // are used for the table header - columnNames = new Vector(); - - for (int i = 1; i <= columnCount; i++) - columnNames.addElement(metaData.getColumnName(i)); - Vector data[] = new Vector[2]; - data[0] = tableData; - data[1] = columnNames; - System.out.println("Rows " + tableData.size() + " " + ((Vector) tableData.get(0)).size()); - long timeEnd = System.currentTimeMillis(); - System.out.println("Time needed for query and data retrieval " + (timeEnd - timeStart) + " ms"); - return data; + return getQueryData(query,null,maxHits); } public Vector getColumnNames() @@ -1234,244 +1006,221 @@ public class DBBean if (!check) return null; Vector tableRow = new Vector(), m_columnClasses = new Vector(); - for (int i = 1; i <= columnCount; i++) - { - // repeating fields and fields from related databases may contain - // multliple data values; the data values are stored using - // a Vector which is then added to the tableRow - // if (metaData instanceof ResultSetMetaDataExt) - if ((metaData instanceof ResultSetMetaDataExt) && (((ResultSetMetaDataExt) metaData).isRelated(i) || ((ResultSetMetaDataExt) metaData).isRepeating(i))) - { - //System.out.println("Related fields"); - // retrieve the repeating or related field contents as a - // com.fmi.jdbc.Array via the ResultSet.getObject method - com.fmi.jdbc.Array array = (com.fmi.jdbc.Array) resultSet.getObject(i); - // create a Vector for storing all of the data values - ArrayList columnData = new ArrayList(); - try - { - - // call the Array.getStringArray method since the data will - // only be displayed - Object[] fieldData = (Object[]) array.getArray(); - - if (fieldData != null) - { - // add each value to the Vector - for (int j = 0; j < fieldData.length; j++) - { - if (fieldData[j] != null) - columnData.add(fieldData[j]); - } - } - } catch (Exception e) - { - //System.out.println(e); - } - - if (columnData.isEmpty()) - tableRow.add(null); - else - tableRow.addElement(columnData); - //System.out.println(columnData); - //System.out.println("Related fields"+columnData.size()+" "+tableRow.size()); - - // m_columnClasses.addElement(java.util.Vector.class); - } else if (metaData.getColumnType(i) == Types.LONGVARBINARY) - { - // use the ResultSet.getObject method for retrieving images - // from FileMaker Pro container fields; the ResultSet.getObject - // method returns a java.awt.Image object for FileMaker Pro - // container fields - - try - { - tableRow.addElement(resultSet.getObject(i)); - } catch (Exception e) - { - // TODO Auto-generated catch block - // e.printStackTrace(); - tableRow.addElement(null); - } - // m_columnClasses.addElement(java.awt.Image.class); - } else if (metaData.getColumnType(i) == Types.TIME) - { - // use the ResultSet.getObject method for retieving images - // from FileMaker Pro container fields; the ResultSet.getObject - // method returns a java.awt.Image object for FileMaker Pro - // container fields - try - { - tableRow.addElement(resultSet.getTime(i).toString()); - // m_columnClasses.addElement(java.sql.Time.class); - } catch (Exception e) - { - - String value = resultSet.getString(i); - if (value != null) - { - //System.out.println("SQLTime new "+Time.valueOf("17:00:00").toString()); - int index = 0; - for (int j = 0; j < value.length(); ++j) - { - if (!Character.isLetter(value.charAt(j))) - index = j + 1; - else - break; - } - - tableRow.addElement(value.substring(0, index)); - //m_columnClasses.addElement(java.sql.Time.class); - } else - tableRow.add(null); - // m_columnClasses.addElement(String.class); - } // to catch - - } else if (metaData.getColumnType(i) == Types.INTEGER) - { - // use the ResultSet.getObject method for retieving images - // from FileMaker Pro container fields; the ResultSet.getObject - // method returns a java.awt.Image object for FileMaker Pro - // container fields - - tableRow.addElement(new Integer(resultSet.getInt(i))); - // m_columnClasses.addElement(java.sql.Date.class); - } else if (metaData.getColumnType(i) == Types.DATE) - { - // use the ResultSet.getObject method for retieving images - // from FileMaker Pro container fields; the ResultSet.getObject - // method returns a java.awt.Image object for FileMaker Pro - // container fields - try - { - tableRow.addElement(resultSet.getDate(i)); - - } catch (Exception e) - { - // work around for parse bug in FM JDBC Driver - // for dates of format dd-mm-yyyy - String date = resultSet.getString(i); - date = date.replace('-', '.'); - java.text.DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.GERMAN); - java.util.Date d = dateFormat.parse(date); - // Calendar cal=Calendar.getInstance(Locale.GERMAN); - // cal.setTime(d); - // date=(cal.get(Calendar.YEAR))+"-"+(cal.get(Calendar.MONTH)+1)+"-"+cal.get(Calendar.DATE); - tableRow.addElement(new java.sql.Date(d.getTime())); - System.out.println("Date " + date); - } - // m_columnClasses.addElement(java.sql.Date.class); - } else if (metaData.getColumnTypeName(i) == "NUMBER") - { - // use the ResultSet.getObject method for retieving images - // from FileMaker Pro container fields; the ResultSet.getObject - // method returns a java.awt.Image object for FileMaker Pro - // container fields - try - { - Double value =new Double(resultSet.getDouble(i)); - - - // tableRow.addElement(new Double(resultSet.getDouble(i))); - String tVal =value.toString(); - tVal = tVal.substring(tVal.indexOf('.')+1); - boolean checkMe = tVal.length()==1&&tVal.equals("0"); - // System.out.println("check was"+checkMe+" "+tVal); - if(checkMe) - tableRow.addElement(new Integer(value.intValue())); - else - tableRow.addElement(value); - - // m_columnClasses.addElement(Integer.class); - - } catch (Exception e) - { - - StringBuffer number = new StringBuffer(); - String value = resultSet.getString(i); - System.out.println(value); - for (int c = 0; c < value.length(); ++c) - { - if (Character.isDigit(value.charAt(c))) - { - number.append(value.charAt(c)); - } - } - if (number.length() > 0) - { - tableRow.addElement(null); - // m_columnClasses.addElement(Integer.class); - } else - tableRow.addElement(null); - } - } else - { - // all other field values are retrieved as strings and - // added to the tableRow Vector - // System.out.println("row "+resultSet.getString(i)); - try - { - byte[] b = null; - if (metaData instanceof ResultSetMetaDataExt) - b = resultSet.getBytes(i); - /* if (b != null) - { - java.io.ByteArrayInputStream stream = (java.io.ByteArrayInputStream) resultSet.getBinaryStream(i); - // System.out.println(" stream "+resultSet.getBinaryStream(i)); - byte[] c = new byte[stream.available()]; - int length = stream.read(c, 0, c.length); - int count = 0; - b = new byte[c.length]; - for (int n = 0; n < length; ++n) - { - - if (c[n] != 0) - { - // System.out.println(c[n]+" "+(int)'?'+" "+(char)c[n]+" "+count+" "+b.length); - b[count++] = c[n]; - } - } - byte[] bCopy = new byte[count]; - System.arraycopy(b, 0, bCopy, 0, count); - b = bCopy; - }*/ - String utf8 = null; - utf8 = (b == null) ? null : new String(b); - if (metaData instanceof ResultSetMetaDataExt) - { - String rowElement = ""; - if (b != null) - { - rowElement = resultSet.getString(i); - if (useNormanToUnicodeMapper) - rowElement = Convert.normanToUnicode(rowElement); - tableRow.addElement(rowElement); - - } else - tableRow.addElement(null); - } else - { - if (url.toLowerCase().indexOf("odbc") >= 0) - { - byte[] val = resultSet.getBytes(i); - for (int j = 0; j < val.length; ++j) - System.out.println(Integer.toHexString(val[j])); - tableRow.addElement((val == null) ? null : new String(val)); - - } else - // byte[] val = resultSet.getBytes(i); - tableRow.add(resultSet.getString(i)); - //tableRow.addElement((val==null) ? null:new String(val,"UTF-8")); - } - } catch (Exception e) - { - System.out.println("Hey I got an error" + e); - e.printStackTrace(); - } - // m_columnClasses.addElement(java.lang.String.class); - } - } - // tableData.addElement(tableRow); + for (int i = 1; i <= columnCount; i++) { + // repeating fields and fields from related databases may contain + // multliple data values; the data values are stored using + // a Vector which is then added to the tableRow + // if (metaData instanceof ResultSetMetaDataExt) + if ((metaData instanceof ResultSetMetaDataExt) + && (((ResultSetMetaDataExt) metaData).isRelated(i) || ((ResultSetMetaDataExt) metaData) + .isRepeating(i))) { + // System.out.println("Related fields"); + // retrieve the repeating or related field contents as a + // com.fmi.jdbc.Array via the ResultSet.getObject method + com.fmi.jdbc.Array array = (com.fmi.jdbc.Array) resultSet + .getObject(i); + // create a Vector for storing all of the data values + ArrayList columnData = new ArrayList(); + try { + + // call the Array.getStringArray method since the data will + // only be displayed + Object[] fieldData = (Object[]) array.getArray(); + + if (fieldData != null) { + // add each value to the Vector + for (int j = 0; j < fieldData.length; j++) { + if (fieldData[j] != null) + columnData.add(fieldData[j]); + } + } + } catch (Exception e) { + // System.out.println(e); + } + + if (columnData.isEmpty()) + tableRow.add(null); + else + tableRow.addElement(columnData); + // System.out.println(columnData); + // System.out.println("Related fields"+columnData.size()+" + // "+tableRow.size()); + + // m_columnClasses.addElement(java.util.Vector.class); + } else if (metaData.getColumnType(i) == Types.LONGVARBINARY) { + // use the ResultSet.getObject method for retrieving images + // from FileMaker Pro container fields; the ResultSet.getObject + // method returns a java.awt.Image object for FileMaker Pro + // container fields + + try { + tableRow.addElement(null); + // image objects removed from resultset !!! + // tableRow.addElement(resultSet.getObject(i)); + } catch (Exception e) { + // TODO Auto-generated catch block + // e.printStackTrace(); + tableRow.addElement(null); + } + // m_columnClasses.addElement(java.awt.Image.class); + } else if (metaData.getColumnType(i) == Types.TIME) { + // use the ResultSet.getObject method for retieving images + // from FileMaker Pro container fields; the ResultSet.getObject + // method returns a java.awt.Image object for FileMaker Pro + // container fields + try { + tableRow.addElement(resultSet.getTime(i).toString()); + // m_columnClasses.addElement(java.sql.Time.class); + } catch (Exception e) { + + String value = resultSet.getString(i); + if (value != null) { + // System.out.println("SQLTime new + // "+Time.valueOf("17:00:00").toString()); + int index = 0; + for (int j = 0; j < value.length(); ++j) { + if (!Character.isLetter(value.charAt(j))) + index = j + 1; + else + break; + } + + tableRow.addElement(value.substring(0, index)); + // m_columnClasses.addElement(java.sql.Time.class); + } else + tableRow.add(null); + // m_columnClasses.addElement(String.class); + } // to catch + + } else if (metaData.getColumnType(i) == Types.INTEGER) { + // use the ResultSet.getObject method for retieving images + // from FileMaker Pro container fields; the ResultSet.getObject + // method returns a java.awt.Image object for FileMaker Pro + // container fields + + tableRow.addElement(new Integer(resultSet.getInt(i))); + // m_columnClasses.addElement(java.sql.Date.class); + } else if (metaData.getColumnType(i) == Types.DATE) { + // use the ResultSet.getObject method for retieving images + // from FileMaker Pro container fields; the ResultSet.getObject + // method returns a java.awt.Image object for FileMaker Pro + // container fields + try { + tableRow.addElement(resultSet.getDate(i)); + + } catch (Exception e) { + // work around for parse bug in FM JDBC Driver + // for dates of format dd-mm-yyyy + String date = resultSet.getString(i); + date = date.replace('-', '.'); + java.text.DateFormat dateFormat = DateFormat + .getDateInstance(DateFormat.SHORT, Locale.GERMAN); + java.util.Date d = dateFormat.parse(date); + // Calendar cal=Calendar.getInstance(Locale.GERMAN); + // cal.setTime(d); + // date=(cal.get(Calendar.YEAR))+"-"+(cal.get(Calendar.MONTH)+1)+"-"+cal.get(Calendar.DATE); + tableRow.addElement(new java.sql.Date(d.getTime())); + System.out.println("Date " + date); + } + // m_columnClasses.addElement(java.sql.Date.class); + } else if (metaData.getColumnTypeName(i) == "NUMBER") { + // use the ResultSet.getObject method for retieving images + // from FileMaker Pro container fields; the ResultSet.getObject + // method returns a java.awt.Image object for FileMaker Pro + // container fields + try { + Double value = new Double(resultSet.getDouble(i)); + + // tableRow.addElement(new Double(resultSet.getDouble(i))); + String tVal = value.toString(); + tVal = tVal.substring(tVal.indexOf('.') + 1); + boolean checkMe = tVal.length() == 1 && tVal.equals("0"); + // System.out.println("check was"+checkMe+" "+tVal); + if (checkMe) + tableRow.addElement(new Integer(value.intValue())); + else + tableRow.addElement(value); + + // m_columnClasses.addElement(Integer.class); + + } catch (Exception e) { + + StringBuffer number = new StringBuffer(); + String value = resultSet.getString(i); + System.out.println(value); + for (int c = 0; c < value.length(); ++c) { + if (Character.isDigit(value.charAt(c))) { + number.append(value.charAt(c)); + } + } + if (number.length() > 0) { + tableRow.addElement(null); + // m_columnClasses.addElement(Integer.class); + } else + tableRow.addElement(null); + } + } else { + // all other field values are retrieved as strings and + // added to the tableRow Vector + // System.out.println("row "+resultSet.getString(i)); + try { + byte[] b = null; + if (metaData instanceof ResultSetMetaDataExt) + b = resultSet.getBytes(i); + /* + * if (b != null) { java.io.ByteArrayInputStream stream = + * (java.io.ByteArrayInputStream) + * resultSet.getBinaryStream(i); // System.out.println(" + * stream "+resultSet.getBinaryStream(i)); byte[] c = new + * byte[stream.available()]; int length = stream.read(c, 0, + * c.length); int count = 0; b = new byte[c.length]; for + * (int n = 0; n < length; ++n) { + * + * if (c[n] != 0) { // System.out.println(c[n]+" + * "+(int)'?'+" "+(char)c[n]+" "+count+" "+b.length); + * b[count++] = c[n]; } } byte[] bCopy = new byte[count]; + * System.arraycopy(b, 0, bCopy, 0, count); b = bCopy; } + */ + String utf8 = null; + utf8 = (b == null) ? null : new String(b); + if (metaData instanceof ResultSetMetaDataExt) { + String rowElement = ""; + if (b != null) { + rowElement = resultSet.getString(i); + if (useNormanToUnicodeMapper) + rowElement = Convert + .normanToUnicode(rowElement); + tableRow.addElement(rowElement); + + } else + tableRow.addElement(null); + } else { + if (url.toLowerCase().indexOf("odbc") >= 0) { + byte[] val = resultSet.getBytes(i); + for (int j = 0; j < val.length; ++j) + System.out.println(Integer.toHexString(val[j])); + tableRow.addElement((val == null) ? null + : new String(val)); + + } else { + tableRow.add(resultSet.getString(i)); + //byte[] val = resultSet.getBytes(i); + //System.out.println("string data:"+resultSet.getString(i)); + /*if (val != null) { + tableRow.add(new String(val,"UTF-8")); + } else { + tableRow.add(null); + }*/ + } + } + } catch (Exception e) { + System.out.println("Hey I got an error" + e); + e.printStackTrace(); + } + // m_columnClasses.addElement(java.lang.String.class); + } + } + // tableData.addElement(tableRow); if (check) return tableRow; else