--- FM2SQL/Attic/DBBean.java 2003/12/05 11:46:39 1.1 +++ FM2SQL/Attic/DBBean.java 2004/10/29 10:28:10 1.37 @@ -1,7 +1,23 @@ -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; +/* + * DBBean.java -- Class that ecapsulates all database actions + * Filemake to SQL Converter + * Copyright (C) 2004 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.sql.*; +import java.text.DateFormat; +import java.text.ParseException; import java.util.*; + import com.fmi.jdbc.*; /** @@ -49,10 +65,12 @@ import com.fmi.jdbc.*; */ public class DBBean { + private boolean useNormanToUnicodeMapper = false; Connection connection; String url = ""; DatabaseMetaData dbMetaData; Vector columnNames; + Vector ids = new Vector(); String user = (System.getProperty("user.name") == null) ? "" : System.getProperty("user.name"); //"postgres"; String passwd = ""; //"3333";//"rogo"; public int maxHits = 10; @@ -66,9 +84,11 @@ public class DBBean { DriverManager.registerDriver(new com.fmi.jdbc.JdbcDriver()); DriverManager.registerDriver((Driver) Class.forName("org.postgresql.Driver").newInstance()); - DriverManager.registerDriver((Driver) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").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()); + // wait a maximum of 10 seconds when attempting to establish a connection DriverManager.setLoginTimeout(10); } catch (Exception e) @@ -135,8 +155,8 @@ public class DBBean ConnectionPool conPool = (ConnectionPool) connectionPool.get(url); if (conPool == null) { - connection = DriverManager.getConnection(url, user, passwd); - connectionPool.put(url, new ConnectionPool(url, user, passwd, connection)); + createConnection(); + } else { if (!conPool.user.equals(user) || !conPool.passwd.equals(passwd)) @@ -150,12 +170,15 @@ public class DBBean if (connection.isClosed()) { System.out.println("Made new connection!!!"); - connection = DriverManager.getConnection(conPool.url, conPool.user, conPool.passwd); + createConnection(); + + // connection = DriverManager.getConnection(conPool.url, conPool.user, conPool.passwd); conPool.con = connection; } } if (url != "" && connection == null) - connection = DriverManager.getConnection(url, user, passwd); + createConnection(); + //connection = DriverManager.getConnection(url, user, passwd); dbMetaData = connection.getMetaData(); quoteChar = dbMetaData.getIdentifierQuoteString(); if (quoteChar == null) @@ -163,6 +186,24 @@ public class DBBean return connection; } + private void createConnection() throws SQLException + { + // setup the properties + java.util.Properties prop = new java.util.Properties(); + // prop.put("charSet", "MacCentralEurope"); + prop.put("user", user); + prop.put("password", passwd); + System.out.println("url " + url); + if (url.indexOf("fmpro") >= 0) + { + // Connect to the database + connection = DriverManager.getConnection(url, prop); + System.out.println("odbc with properties inited"); + } else + connection = DriverManager.getConnection(url, user, passwd); + connectionPool.put(url, new ConnectionPool(url, user, passwd, connection)); + + } /** * sets the connection of this DBBean to the database specified in the url * property @@ -171,7 +212,8 @@ public class DBBean { this.url = url; if (url != "") - connection = DriverManager.getConnection(url, user, passwd); + //connection = DriverManager.getConnection(url, user, passwd); + createConnection(); dbMetaData = connection.getMetaData(); quoteChar = dbMetaData.getIdentifierQuoteString(); if (quoteChar == null) @@ -187,13 +229,26 @@ public class DBBean this.passwd = passwd; this.url = url; if (url != "") - connection = DriverManager.getConnection(url, user, passwd); + createConnection(); + // connection = DriverManager.getConnection(url, user, passwd); dbMetaData = connection.getMetaData(); quoteChar = dbMetaData.getIdentifierQuoteString(); if (quoteChar == null) quoteChar = "\""; // needed for postgres } + public void setIDVector(Vector ids) + { + this.ids = ids; + } + + /** + * returns a Vector containing the ID Row Name + **/ + public Vector getIDVector() + { + return ids; + } /** * returns a Vector containing the Tablenames or an error message in the Vector */ @@ -323,7 +378,7 @@ public class DBBean * Returns the result for select * from table * with maxHits = 500 default value */ - public Vector[] getQueryData(String table) throws SQLException + public Vector[] getQueryData(String table) throws SQLException, ParseException,Exception { return getQueryData("SELECT * from " + quoteChar + table + quoteChar, maxHits); @@ -334,7 +389,7 @@ public class DBBean * Returns the result of the query * or an Vector array of Vectors containing error messages */ - public Vector[] getQueryData(String query, FM2SQL.ProgressDialog dialog, int maxHits) throws SQLException + public Vector[] getQueryData(String query, FM2SQL.ProgressDialog dialog, int maxHits) throws SQLException,Exception { long timeStart = System.currentTimeMillis(); ResultSet resultSet = null; @@ -403,7 +458,7 @@ public class DBBean * Returns the result of the query * or an Vector array of Vectors containing error messages */ - public Vector[] getQueryData(String query, int maxHits) throws SQLException + public Vector[] getQueryData(String query, int maxHits) throws SQLException, ParseException,Exception { long timeStart = System.currentTimeMillis(); ResultSet resultSet = null; @@ -532,8 +587,24 @@ public class DBBean // method returns a java.awt.Image object for FileMaker Pro // container fields - tableRow.addElement(resultSet.getDate(i)); - m_columnClasses.addElement(java.sql.Date.class); + 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 @@ -542,8 +613,18 @@ public class DBBean // container fields try { - tableRow.addElement(new Integer(resultSet.getInt(i))); - m_columnClasses.addElement(Integer.class); + 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) { @@ -561,7 +642,7 @@ public class DBBean if (number.length() > 0) { tableRow.addElement(null); - m_columnClasses.addElement(Integer.class); + m_columnClasses.addElement(Double.class); } else tableRow.addElement(null); } @@ -572,17 +653,26 @@ public class DBBean // if(resultSet.getObject(i)!=null) System.out.println(resultSet.getObject(i)); try { + String utf8 = null; + if (metaData instanceof ResultSetMetaDataExt) + { byte[] b = resultSet.getBytes(i); - String utf8 = null; + if (metaData instanceof ResultSetMetaDataExt) utf8 = (b == null) ? null : new String(b); else utf8 = (b == null) ? null : new String(b, "UTF-8"); - utf8 = (utf8 == null) ? null : new String(utf8.getBytes("UTF-8"), "UTF-8"); - tableRow.addElement(utf8); + } + 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); } @@ -629,18 +719,50 @@ public class DBBean * with the numberOfHits as maximum * @return the result as an ResultSet object */ - public ResultSet makeQuery(String query, int numberOfHits) throws SQLException + public ResultSet makeQuery(String query, int numberOfHits) throws SQLException,Exception { result = null; Statement stm = null; + // System.out.println("Query " + query); if (!connection.isClosed()) stm = connection.createStatement(); + else + { + + try + { + connection = getConnection(); + stm = connection.createStatement(); + } catch (Exception e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } stm.setMaxRows(numberOfHits); - result = stm.executeQuery(query); - // System.out.println(result+" "+stm.getMoreResults()); - metaData = result.getMetaData(); + long time = System.currentTimeMillis(); + try + { + stm.execute(query); + long time2 = System.currentTimeMillis(); + + System.out.println("time to execute " + (time2 - time)); + // stm.setMaxRows(numberOfHits); + + result = stm.getResultSet(); + // System.out.println(result+" "+stm.getUpdateCount()); + metaData = result.getMetaData(); + } catch (Exception e) + { + // TODO remove + if (Convert.isGUI&&Convert.debug) + FM2SQL.showErrorDialog("Error caught!! \n Query was " + query + " \n", "Debug Info"); + e.printStackTrace(); + throw e; + } + return result; } /** @@ -1205,14 +1327,39 @@ public class DBBean // 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)); - 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") { @@ -1222,7 +1369,19 @@ public class DBBean // container fields try { - tableRow.addElement(new Integer(resultSet.getInt(i))); + 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) @@ -1255,19 +1414,58 @@ public class DBBean 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) - tableRow.addElement((b != null) ? new String(utf8.getBytes()) : null); - else { - // byte[] val = resultSet.getBytes(i); - tableRow.add(resultSet.getString(i)); + 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); + System.out.println("Hey I got an error" + e); e.printStackTrace(); } // m_columnClasses.addElement(java.lang.String.class); @@ -1335,5 +1533,77 @@ public class DBBean resultSet.next(); return resultSet.getInt(1); } + public TreeSet getIDVector(String id, String table, String query, int numHits) throws Exception + { + TreeSet t = new TreeSet(); + getConnection(); + ResultSet result = this.result; + String subQuery = query.substring(query.lastIndexOf(table) + table.length() + 1); + System.out.println("subQuery " + subQuery); + makeQuery("select " + getQC()+id+getQC() + " from " + getQC() + table + getQC() + subQuery, numHits); + while (true) + { + Vector vec = getNextRow(); + if (vec == null) + break; + t.add(vec.get(0)); + } + this.result = result; + metaData = (this.result == null) ? null : this.result.getMetaData(); + return t; + } + /** + * @return + */ + public boolean isUseNormanToUnicodeMapper() + { + return useNormanToUnicodeMapper; + } + + /** + * @param b + */ + public void setUseNormanToUnicodeMapper(boolean b) + { + useNormanToUnicodeMapper = b; + } + /** + * + */ + protected void closeAllConnections() + { + Enumeration enumeration = connectionPool.elements(); + while(enumeration.hasMoreElements()) + { + ConnectionPool conPol =(ConnectionPool)enumeration.nextElement(); + try + { + System.out.println(conPol); + conPol.con.close(); + } catch (SQLException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + /** + * @param indexField + */ + public String getColumnType(String indexField) throws SQLException + { + Vector names=getColumnNames(); + for (int i = 0; i < names.size(); i++) + { + if(names.get(i).toString().equals(indexField)) + { + System .out.println("found field "+names.get(i)+" "+metaData.getColumnTypeName(i+1)); + return metaData.getColumnTypeName(i+1); + + } + } + return ""; + } -} +} \ No newline at end of file