--- FM2SQL/Attic/DBBean.java 2004/03/23 11:57:06 1.11 +++ FM2SQL/Attic/DBBean.java 2004/06/14 12:12:31 1.22 @@ -15,7 +15,10 @@ import java.sql.*; +import java.text.DateFormat; +import java.text.ParseException; import java.util.*; + import com.fmi.jdbc.*; /** @@ -83,6 +86,7 @@ public class DBBean 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("acs.jdbc.Driver").newInstance()); // wait a maximum of 10 seconds when attempting to establish a connection DriverManager.setLoginTimeout(10); @@ -150,8 +154,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)) @@ -165,12 +169,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) @@ -178,6 +185,25 @@ public class DBBean return connection; } + private void createConnection() throws SQLException + { + // setup the properties + java.util.Properties prop = new java.util.Properties(); + prop.put("charSet", "MacRoman"); + 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 @@ -186,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) @@ -202,7 +229,8 @@ 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) @@ -350,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 { return getQueryData("SELECT * from " + quoteChar + table + quoteChar, maxHits); @@ -430,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 { long timeStart = System.currentTimeMillis(); ResultSet resultSet = null; @@ -559,9 +587,25 @@ 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); - } else if (metaData.getColumnTypeName(i) == "NUMBER") + 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 @@ -569,8 +613,8 @@ public class DBBean // container fields try { - tableRow.addElement(new Integer(resultSet.getInt(i))); - m_columnClasses.addElement(Integer.class); + tableRow.addElement(new Double(resultSet.getDouble(i))); + m_columnClasses.addElement(Double.class); } catch (Exception e) { @@ -588,7 +632,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); } @@ -665,8 +709,22 @@ public class DBBean 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); long time = System.currentTimeMillis(); + try { stm.execute(query); long time2 = System.currentTimeMillis(); @@ -676,6 +734,12 @@ public class DBBean result = stm.getResultSet(); // System.out.println(result+" "+stm.getUpdateCount()); metaData = result.getMetaData(); + } catch(Exception e) { + // TODO remove + if(FM2SQL.fmInstance!=null) + FM2SQL.showErrorDialog("Error caught!! \n Query was "+query+" \n","Debug Info"); + } + return result; } /** @@ -1255,8 +1319,24 @@ public class DBBean // 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") { @@ -1266,7 +1346,7 @@ public class DBBean // container fields try { - tableRow.addElement(new Integer(resultSet.getInt(i))); + tableRow.addElement(new Double(resultSet.getDouble(i))); // m_columnClasses.addElement(Integer.class); } catch (Exception e) @@ -1299,12 +1379,41 @@ 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); + utf8 = (b == null) ? null : new String(b,"MacRoman"); if (metaData instanceof ResultSetMetaDataExt) - tableRow.addElement((b != null) ? new String(utf8.getBytes()) : null); + tableRow.addElement((b != null) ? Convert.normanToUnicode(resultSet.getString(i)) : null); else { + if(url.toLowerCase().indexOf("odbc")>=0) + { + byte[] val = resultSet.getBytes(i); + for(int j=0;j