Annotation of FM2SQL/src/DBBean.java, revision 1.1
1.1 ! rogo 1: /*
! 2: * DBBean.java -- Class that ecapsulates all database actions
! 3: * Filemake to SQL Converter
! 4: * Copyright (C) 2004 Robert Gordesch (rogo@mpiwg-berlin.mpg.de)
! 5: * This program is free software; you can redistribute it and/or modify it
! 6: * under the terms of the GNU General Public License as published by the Free
! 7: * Software Foundation; either version 2 of the License, or (at your option)
! 8: * any later version. Please read license.txt for the full details. A copy of
! 9: * the GPL may be found at http://www.gnu.org/copyleft/lgpl.html You should
! 10: * have received a copy of the GNU General Public License along with this
! 11: * program; if not, write to the Free Software Foundation, Inc., 59 Temple
! 12: * Place, Suite 330, Boston, MA 02111-1307 USA Created on 15.09.2003 by
! 13: * rogo
! 14: */
! 15:
! 16: import java.sql.*;
! 17: import java.text.DateFormat;
! 18: import java.text.ParseException;
! 19: import java.util.*;
! 20:
! 21: import com.fmi.jdbc.*;
! 22:
! 23: /**
! 24: *
! 25: *
! 26: * DBBean - Database bean
! 27: *
! 28: *<p> a Javabean to perform queries on a JDBC Database,
! 29: * or excute any other SQL statement
! 30: * </p>
! 31: * <p>
! 32: * Usage:
! 33: * <pre>
! 34: * DBBean bean = new DBBean();
! 35: * // setting user and passwd
! 36: * bean.setUserAndPasswd("bla","bla");
! 37: * try
! 38: * {
! 39: * bean.setConnection("jdbc:fmpro:http://localhost");
! 40: * Vector names=bean.getTableNames();
! 41: * Vector[] result=bean.getQueryData(names.get(0).toString());
! 42: * // print results to screen
! 43: * for(int i=0;i<result[1].size();++i)
! 44: * {
! 45: * //print Header
! 46: * System.out.print(" "+result[1].get(i));
! 47: * }
! 48: * System.out.println();
! 49: * for(int j=0;j<result[0].size();++j)
! 50: * {
! 51: * Vector row=(Vector)result[0].get(j);
! 52: * //print rows
! 53: * for(int k=0;k<row.size();++k)
! 54: * System.out.print(" "+row.get(k));
! 55: * System.out.println();
! 56: * }
! 57: * } catch(Exception e)
! 58: * {
! 59: * System.out.println("Error while connecting to database"+ e);
! 60: * }
! 61: * </pre>
! 62: *
! 63: * </p>
! 64: * @author rogo
! 65: */
! 66: public class DBBean
! 67: {
! 68: private boolean useNormanToUnicodeMapper = false;
! 69: Connection connection;
! 70: String url = "";
! 71: DatabaseMetaData dbMetaData;
! 72: Vector columnNames;
! 73: Vector ids = new Vector();
! 74: String user = (System.getProperty("user.name") == null) ? "" : System.getProperty("user.name"); //"postgres";
! 75: String passwd = ""; //"3333";//"rogo";
! 76: public int maxHits = 10;
! 77: ResultSet result;
! 78: String quoteChar = "";
! 79: Hashtable connectionPool = new Hashtable();
! 80: public ResultSetMetaData metaData;
! 81: // register DataBase Drivers
! 82: static {
! 83: try
! 84: {
! 85: DriverManager.registerDriver(new com.fmi.jdbc.JdbcDriver());
! 86: DriverManager.registerDriver((Driver) Class.forName("org.postgresql.Driver").newInstance());
! 87: DriverManager.registerDriver((Driver) Class.forName("com.mysql.jdbc.Driver").newInstance());
! 88: DriverManager.registerDriver((Driver) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance());
! 89: DriverManager.registerDriver((Driver) Class.forName("com.ddtek.jdbc.sequelink.SequeLinkDriver").newInstance());
! 90: DriverManager.registerDriver((Driver) Class.forName("acs.jdbc.Driver").newInstance());
! 91:
! 92: // wait a maximum of 10 seconds when attempting to establish a connection
! 93: DriverManager.setLoginTimeout(10);
! 94: } catch (Exception e)
! 95: {
! 96: System.out.println(e);
! 97: }
! 98: }
! 99: /**
! 100: * Constructs a database bean
! 101: */
! 102: public DBBean()
! 103: {
! 104:
! 105: }
! 106: /**
! 107: *Constructs a database bean
! 108: * and tries to connect to database
! 109: *specified in the jdbcConnectionURL
! 110: * @param jdbcConnectionURL url to connect to database
! 111: */
! 112:
! 113: public DBBean(String jdbcConnectionURL) throws Exception
! 114: {
! 115:
! 116: this.url = jdbcConnectionURL;
! 117:
! 118: connection = getConnection();
! 119: if (connection == null)
! 120: return;
! 121: // get the meta data for the current connection
! 122: DatabaseMetaData dbMetaData = (DatabaseMetaData) connection.getMetaData();
! 123: quoteChar = dbMetaData.getIdentifierQuoteString();
! 124: if (quoteChar == null)
! 125: quoteChar = "\""; // needed for postgres
! 126:
! 127: // create the root node of the tree
! 128: // get the open tables from the current connection; the FileMaker Pro
! 129: // JDBC driver ignores all of the parameters to this method
! 130:
! 131: // iterate over the table names and add them to the root node of the tree
! 132:
! 133: }
! 134: /**
! 135: * sets the maximum number of hits
! 136: */
! 137: public void setMaxHits(int maxHits)
! 138: {
! 139: this.maxHits = maxHits;
! 140: }
! 141: /**
! 142: * gets the maximum number of hits
! 143: */
! 144: public int getMaxHits()
! 145: {
! 146: return maxHits;
! 147: }
! 148:
! 149: /**
! 150: * returns the Connection if null creates a new one from the url property.
! 151: *
! 152: */
! 153: public Connection getConnection() throws Exception
! 154: {
! 155: ConnectionPool conPool = (ConnectionPool) connectionPool.get(url);
! 156: if (conPool == null)
! 157: {
! 158: createConnection();
! 159:
! 160: } else
! 161: {
! 162: if (!conPool.user.equals(user) || !conPool.passwd.equals(passwd))
! 163: {
! 164: conPool.con.close();
! 165: conPool.user = user;
! 166: conPool.passwd = passwd;
! 167:
! 168: }
! 169: connection = conPool.con;
! 170: if (connection.isClosed())
! 171: {
! 172: System.out.println("Made new connection!!!");
! 173: createConnection();
! 174:
! 175: // connection = DriverManager.getConnection(conPool.url, conPool.user, conPool.passwd);
! 176: conPool.con = connection;
! 177: }
! 178: }
! 179: if (url != "" && connection == null)
! 180: createConnection();
! 181: //connection = DriverManager.getConnection(url, user, passwd);
! 182: dbMetaData = connection.getMetaData();
! 183: quoteChar = dbMetaData.getIdentifierQuoteString();
! 184: if (quoteChar == null)
! 185: quoteChar = "\""; // needed for postgres
! 186:
! 187: return connection;
! 188: }
! 189: private void createConnection() throws SQLException
! 190: {
! 191: // setup the properties
! 192: java.util.Properties prop = new java.util.Properties();
! 193: // prop.put("charSet", "MacCentralEurope");
! 194: prop.put("user", user);
! 195: prop.put("password", passwd);
! 196: System.out.println("url " + url);
! 197: if (url.indexOf("fmpro") >= 0)
! 198: {
! 199: // Connect to the database
! 200: connection = DriverManager.getConnection(url, prop);
! 201: System.out.println("odbc with properties inited");
! 202: } else
! 203: connection = DriverManager.getConnection(url, user, passwd);
! 204: connectionPool.put(url, new ConnectionPool(url, user, passwd, connection));
! 205:
! 206: }
! 207: /**
! 208: * sets the connection of this DBBean to the database specified in the url
! 209: * property
! 210: */
! 211: public void setConnection(String url) throws Exception
! 212: {
! 213: this.url = url;
! 214: if (url != "")
! 215: //connection = DriverManager.getConnection(url, user, passwd);
! 216: createConnection();
! 217: dbMetaData = connection.getMetaData();
! 218: quoteChar = dbMetaData.getIdentifierQuoteString();
! 219: if (quoteChar == null)
! 220: quoteChar = "\""; // needed for postgres
! 221: }
! 222: /**
! 223: * sets the connection of this DBBean to the database specified in the url
! 224: * and the url,user and passwd property of this DBBean instance
! 225: */
! 226: public void setConnection(String url, String user, String passwd) throws Exception
! 227: {
! 228: this.user = user;
! 229: this.passwd = passwd;
! 230: this.url = url;
! 231: if (url != "")
! 232: createConnection();
! 233: // connection = DriverManager.getConnection(url, user, passwd);
! 234: dbMetaData = connection.getMetaData();
! 235: quoteChar = dbMetaData.getIdentifierQuoteString();
! 236: if (quoteChar == null)
! 237: quoteChar = "\""; // needed for postgres
! 238: }
! 239:
! 240: public void setIDVector(Vector ids)
! 241: {
! 242: this.ids = ids;
! 243: }
! 244:
! 245: /**
! 246: * returns a Vector containing the ID Row Name
! 247: **/
! 248: public Vector getIDVector()
! 249: {
! 250: return ids;
! 251: }
! 252: /**
! 253: * returns a Vector containing the Tablenames or an error message in the Vector
! 254: */
! 255: public Vector getTableNames()
! 256: {
! 257: Vector tableNameVec = new Vector();
! 258: try
! 259: {
! 260: if (connection == null)
! 261: {
! 262: Vector vec = new Vector();
! 263: vec.add("no database connection");
! 264: return vec;
! 265: }
! 266: if (dbMetaData == null)
! 267: dbMetaData = connection.getMetaData();
! 268: ResultSet tableNames = dbMetaData.getTables(null, null, null, null);
! 269: // System.out.println(dbMetaData.supportsAlterTableWithAddColumn());
! 270: // iterate over the table names and add them to the root node of the tree
! 271:
! 272: while (tableNames.next())
! 273: {
! 274: String tableName = tableNames.getString("TABLE_NAME");
! 275: tableNameVec.add(tableName);
! 276:
! 277: }
! 278: } catch (Exception e)
! 279: {
! 280: e.printStackTrace();
! 281: }
! 282: return tableNameVec;
! 283: }
! 284: /**
! 285: * returns a Vector containing the Tablenames or an error message in the Vector
! 286: */
! 287: public Vector getTableNames(String catalog)
! 288: {
! 289: Vector tableNameVec = new Vector();
! 290: try
! 291: {
! 292: if (connection == null)
! 293: {
! 294: Vector vec = new Vector();
! 295: vec.add("no database connection");
! 296: return vec;
! 297: }
! 298: setConnection(url.substring(0, url.lastIndexOf("/") + 1) + catalog);
! 299: if (dbMetaData == null)
! 300: dbMetaData = connection.getMetaData();
! 301: System.out.println("catalog " + catalog + " " + dbMetaData.getCatalogSeparator() + " " + url.substring(0, url.lastIndexOf("/") + 1));
! 302: ResultSet tableNames = dbMetaData.getTables(null, null, null, null);
! 303: // System.out.println(dbMetaData.supportsAlterTableWithAddColumn());
! 304: // iterate over the table names and add them to the root node of the tree
! 305:
! 306: while (tableNames.next())
! 307: {
! 308: String tableName = tableNames.getString("TABLE_NAME");
! 309: tableNameVec.add(tableName);
! 310:
! 311: }
! 312: } catch (Exception e)
! 313: {
! 314: e.printStackTrace();
! 315: }
! 316: return tableNameVec;
! 317: }
! 318:
! 319: /**
! 320: * returns a Vector containing the Catalog or an error message in the Vector
! 321: */
! 322: public Vector getCatalogs()
! 323: {
! 324: Vector tableNameVec = new Vector();
! 325: try
! 326: {
! 327: if (connection == null)
! 328: {
! 329: Vector vec = new Vector();
! 330: vec.add("no database connection");
! 331: return vec;
! 332: }
! 333: if (dbMetaData == null)
! 334: dbMetaData = connection.getMetaData();
! 335: ResultSet tableNames = dbMetaData.getCatalogs();
! 336: // System.out.println(dbMetaData.supportsAlterTableWithAddColumn());
! 337: // iterate over the table names and add them to the root node of the tree
! 338: System.out.println(tableNames.getMetaData().getColumnName(1));
! 339: while (tableNames.next())
! 340: {
! 341: String tableName = tableNames.getString(1);
! 342: tableNameVec.add(tableName);
! 343: //tableName = tableNames.getString(1);
! 344: //tableNameVec.add(tableName);
! 345:
! 346: }
! 347: } catch (Exception e)
! 348: {
! 349: e.printStackTrace();
! 350: }
! 351: return tableNameVec;
! 352: }
! 353:
! 354: /**
! 355: * returns a Vector containing the layoutNames for the specified Table
! 356: * if the database supports this otherwise Vector containing an empty String
! 357: */
! 358:
! 359: public Vector getLayoutNames(String tableName) throws SQLException
! 360: {
! 361: Vector layouts = new Vector();
! 362: if (dbMetaData instanceof DatabaseMetaDataExt)
! 363: layouts.add("");
! 364: if (dbMetaData == null)
! 365: dbMetaData = connection.getMetaData();
! 366:
! 367: if (dbMetaData instanceof DatabaseMetaDataExt)
! 368: {
! 369: ResultSet layoutNames = ((DatabaseMetaDataExt) dbMetaData).getLayouts(null, null, tableName, null);
! 370:
! 371: // iterate over the layout names and add them to the "Layouts" node
! 372: while (layoutNames.next())
! 373: layouts.add(layoutNames.getString("LAYOUT_NAME"));
! 374: }
! 375: return layouts;
! 376: }
! 377: /**
! 378: * Returns the result for select * from table
! 379: * with maxHits = 500 default value
! 380: */
! 381: public Vector[] getQueryData(String table) throws SQLException, ParseException,Exception
! 382: {
! 383:
! 384: return getQueryData("SELECT * from " + quoteChar + table + quoteChar, maxHits);
! 385:
! 386: }
! 387:
! 388: /**
! 389: * Returns the result of the query
! 390: * or an Vector array of Vectors containing error messages
! 391: */
! 392: public Vector[] getQueryData(String query, FM2SQL.ProgressDialog dialog, int maxHits) throws SQLException,Exception
! 393: {
! 394: long timeStart = System.currentTimeMillis();
! 395: ResultSet resultSet = null;
! 396: if (connection == null)
! 397: {
! 398: Vector[] noData = new Vector[2];
! 399: //System.out.println("Exception occured");
! 400: noData[1] = new Vector();
! 401: Vector vec2 = new Vector();
! 402: noData[0] = new Vector();
! 403: vec2.add("no Connection available");
! 404: noData[0].add(vec2);
! 405: noData[1].add("Exception occured! No results available");
! 406: //noData[1].add("no Results were produced");
! 407:
! 408: return noData;
! 409: }
! 410: if (dialog != null)
! 411: dialog.progress.setValue(0);
! 412:
! 413: resultSet = makeQuery(query, maxHits);
! 414:
! 415: metaData = resultSet.getMetaData();
! 416: int columnCount = metaData.getColumnCount();
! 417: int rowCount = 0;
! 418: if (maxHits == 0)
! 419: rowCount = (metaData instanceof ResultSetMetaDataExt) ? 1000 : getRowCount(query);
! 420: else
! 421: rowCount = maxHits;
! 422: int counter = 0;
! 423: Vector tableData = new Vector();
! 424: Vector tableRow = new Vector();
! 425: // System.out.println("rowCount "+rowCount+" "+maxHits);
! 426: try
! 427: {
! 428: while ((tableRow = getNextRow()) != null)
! 429: {
! 430: counter++;
! 431: if (dialog != null)
! 432: dialog.progress.setValue((int) ((double) counter / (double) rowCount * 100.0));
! 433:
! 434: tableData.add(tableRow);
! 435:
! 436: }
! 437: } catch (Exception e)
! 438: {
! 439: // TODO Auto-generated catch block
! 440: e.printStackTrace();
! 441: }
! 442:
! 443: // retrieve the column names from the result set; the column names
! 444: // are used for the table header
! 445: columnNames = new Vector();
! 446:
! 447: for (int i = 1; i <= columnCount; i++)
! 448: columnNames.addElement(metaData.getColumnName(i));
! 449: Vector data[] = new Vector[2];
! 450: data[0] = tableData;
! 451: data[1] = columnNames;
! 452: System.out.println("Rows " + tableData.size() + " " + ((Vector) tableData.get(0)).size());
! 453: long timeEnd = System.currentTimeMillis();
! 454: System.out.println("Time needed for query and data retrieval " + (timeEnd - timeStart) + " ms");
! 455: return data;
! 456: }
! 457: /**
! 458: * Returns the result of the query
! 459: * or an Vector array of Vectors containing error messages
! 460: */
! 461: public Vector[] getQueryData(String query, int maxHits) throws SQLException, ParseException,Exception
! 462: {
! 463: long timeStart = System.currentTimeMillis();
! 464: ResultSet resultSet = null;
! 465: if (connection == null)
! 466: {
! 467: Vector[] noData = new Vector[2];
! 468: //System.out.println("Exception occured");
! 469: noData[1] = new Vector();
! 470: Vector vec2 = new Vector();
! 471: noData[0] = new Vector();
! 472: vec2.add("no Connection available");
! 473: noData[0].add(vec2);
! 474: noData[1].add("Exception occured! No results available");
! 475: //noData[1].add("no Results were produced");
! 476:
! 477: return noData;
! 478: }
! 479: resultSet = makeQuery(query, maxHits);
! 480: metaData = resultSet.getMetaData();
! 481: int columnCount = metaData.getColumnCount();
! 482:
! 483: Vector tableData = new Vector();
! 484: while (resultSet.next())
! 485: {
! 486: //System.out.println("datatype "+(Types.LONGVARCHAR ==metaData.getColumnType(3)));
! 487: Vector tableRow = new Vector(), m_columnClasses = new Vector();
! 488: for (int i = 1; i <= columnCount; i++)
! 489: {
! 490: // repeating fields and fields from related databases may contain
! 491: // multliple data values; the data values are stored using
! 492: // a Vector which is then added to the tableRow
! 493: // if (metaData instanceof ResultSetMetaDataExt)
! 494: if ((metaData instanceof ResultSetMetaDataExt) && (((ResultSetMetaDataExt) metaData).isRelated(i) || ((ResultSetMetaDataExt) metaData).isRepeating(i)))
! 495: {
! 496: //System.out.println("Related fields");
! 497: // retrieve the repeating or related field contents as a
! 498: // com.fmi.jdbc.Array via the ResultSet.getObject method
! 499: com.fmi.jdbc.Array array = (com.fmi.jdbc.Array) resultSet.getObject(i);
! 500: // create a Vector for storing all of the data values
! 501: ArrayList columnData = new ArrayList();
! 502:
! 503: try
! 504: {
! 505:
! 506: // call the Array.getStringArray method since the data will
! 507: // only be displayed
! 508: Object[] fieldData = (Object[]) array.getArray();
! 509:
! 510: if (fieldData != null)
! 511: {
! 512: // add each value to the Vector
! 513: for (int j = 0; j < fieldData.length; j++)
! 514: {
! 515: if (fieldData[j] != null)
! 516: columnData.add(fieldData[j]);
! 517: }
! 518:
! 519: }
! 520: } catch (Exception e)
! 521: {
! 522: //System.out.println(e);
! 523: }
! 524: if (columnData.isEmpty())
! 525: tableRow.add(null);
! 526: else
! 527: tableRow.addElement(columnData);
! 528: //System.out.println(columnData);
! 529: //System.out.println("Related fields"+columnData.size()+" "+tableRow.size());
! 530:
! 531: m_columnClasses.addElement(java.util.Vector.class);
! 532: } else if (metaData.getColumnType(i) == Types.LONGVARBINARY)
! 533: {
! 534: // use the ResultSet.getObject method for retrieving images
! 535: // from FileMaker Pro container fields; the ResultSet.getObject
! 536: // method returns a java.awt.Image object for FileMaker Pro
! 537: // container fields
! 538: try
! 539: {
! 540:
! 541: tableRow.addElement(resultSet.getObject(i));
! 542: } catch (Exception e)
! 543: {
! 544: // TODO Auto-generated catch block
! 545: //e.printStackTrace();
! 546: tableRow.addElement(null);
! 547: }
! 548: //tableRow.addElement("Picture ignored");
! 549: m_columnClasses.addElement(java.awt.Image.class);
! 550: } else if (metaData.getColumnType(i) == Types.TIME)
! 551: {
! 552: // use the ResultSet.getObject method for retieving images
! 553: // from FileMaker Pro container fields; the ResultSet.getObject
! 554: // method returns a java.awt.Image object for FileMaker Pro
! 555: // container fields
! 556: try
! 557: {
! 558: tableRow.addElement(resultSet.getTime(i).toString());
! 559: m_columnClasses.addElement(java.sql.Time.class);
! 560: } catch (Exception e)
! 561: {
! 562:
! 563: String value = resultSet.getString(i);
! 564: if (value != null)
! 565: {
! 566: //System.out.println("SQLTime new "+Time.valueOf("17:00:00").toString());
! 567: int index = 0;
! 568: for (int j = 0; j < value.length(); ++j)
! 569: {
! 570: if (!Character.isLetter(value.charAt(j)))
! 571: index = j + 1;
! 572: else
! 573: break;
! 574: }
! 575:
! 576: tableRow.addElement(value.substring(0, index));
! 577: //m_columnClasses.addElement(java.sql.Time.class);
! 578: } else
! 579: tableRow.add(null);
! 580: m_columnClasses.addElement(String.class);
! 581: } // to catch
! 582:
! 583: } else if (metaData.getColumnType(i) == Types.DATE)
! 584: {
! 585: // use the ResultSet.getObject method for retieving images
! 586: // from FileMaker Pro container fields; the ResultSet.getObject
! 587: // method returns a java.awt.Image object for FileMaker Pro
! 588: // container fields
! 589:
! 590: try
! 591: {
! 592: tableRow.addElement(resultSet.getDate(i));
! 593:
! 594: } catch (Exception e)
! 595: {
! 596: // work around for parse bug in FM JDBC Driver
! 597: // for dates of format dd-mm-yyyy
! 598: String date = resultSet.getString(i);
! 599: date = date.replace('-', '.');
! 600: java.text.DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.GERMAN);
! 601: java.util.Date d = dateFormat.parse(date);
! 602: // Calendar cal=Calendar.getInstance(Locale.GERMAN);
! 603: // cal.setTime(d);
! 604: // date=(cal.get(Calendar.YEAR))+"-"+(cal.get(Calendar.MONTH)+1)+"-"+cal.get(Calendar.DATE);
! 605: tableRow.addElement(new java.sql.Date(d.getTime()));
! 606: System.out.println("Date " + date);
! 607: }
! 608: } else if (metaData.getColumnTypeName(i) == "NUMBER")
! 609: {
! 610: // use the ResultSet.getObject method for retieving images
! 611: // from FileMaker Pro container fields; the ResultSet.getObject
! 612: // method returns a java.awt.Image object for FileMaker Pro
! 613: // container fields
! 614: try
! 615: {
! 616: Double value =new Double(resultSet.getDouble(i));
! 617:
! 618:
! 619: // tableRow.addElement(new Double(resultSet.getDouble(i)));
! 620: String tVal =value.toString();
! 621: tVal = tVal.substring(tVal.indexOf('.')+1);
! 622: boolean checkMe = tVal.length()==1&&tVal.equals("0");
! 623: // System.out.println("check was"+checkMe+" "+tVal);
! 624: if(checkMe)
! 625: tableRow.addElement(new Integer(value.intValue()));
! 626: else
! 627: tableRow.addElement(value);
! 628:
! 629: } catch (Exception e)
! 630: {
! 631:
! 632: StringBuffer number = new StringBuffer();
! 633: String value = resultSet.getString(i);
! 634: System.out.println(value);
! 635: for (int c = 0; c < value.length(); ++c)
! 636: {
! 637: if (Character.isDigit(value.charAt(c)))
! 638: {
! 639: number.append(value.charAt(c));
! 640: }
! 641: }
! 642: if (number.length() > 0)
! 643: {
! 644: tableRow.addElement(null);
! 645: m_columnClasses.addElement(Double.class);
! 646: } else
! 647: tableRow.addElement(null);
! 648: }
! 649: } else
! 650: {
! 651: // all other field values are retrieved as strings and
! 652: // added to the tableRow Vector
! 653: // if(resultSet.getObject(i)!=null) System.out.println(resultSet.getObject(i));
! 654: try
! 655: {
! 656: String utf8 = null;
! 657: if (metaData instanceof ResultSetMetaDataExt)
! 658: {
! 659: byte[] b = resultSet.getBytes(i);
! 660:
! 661: if (metaData instanceof ResultSetMetaDataExt)
! 662: utf8 = (b == null) ? null : new String(b);
! 663: else
! 664: utf8 = (b == null) ? null : new String(b, "UTF-8");
! 665: }
! 666: else
! 667: utf8=resultSet.getString(i);
! 668:
! 669: // utf8 = (utf8 == null) ? null : new String(utf8.getBytes("UTF-8"), "UTF-8");
! 670: tableRow.addElement(utf8);
! 671:
! 672: } catch (Exception e)
! 673: {
! 674: System.out.println("Hey I Got an error" + e);
! 675: e.printStackTrace();
! 676: }
! 677: m_columnClasses.addElement(java.lang.String.class);
! 678: }
! 679: }
! 680:
! 681: // add the tableRow Vector to the tableData Vector
! 682: tableData.addElement(tableRow);
! 683: }
! 684:
! 685: // retrieve the column names from the result set; the column names
! 686: // are used for the table header
! 687: columnNames = new Vector();
! 688:
! 689: for (int i = 1; i <= columnCount; i++)
! 690: columnNames.addElement(metaData.getColumnName(i));
! 691: Vector data[] = new Vector[2];
! 692: data[0] = tableData;
! 693: data[1] = columnNames;
! 694: System.out.println("Rows " + tableData.size() + " " + ((Vector) tableData.get(0)).size());
! 695: long timeEnd = System.currentTimeMillis();
! 696: System.out.println("Time needed for query and data retrieval " + (timeEnd - timeStart) + " ms");
! 697: return data;
! 698: }
! 699:
! 700: public Vector getColumnNames()
! 701: {
! 702: if (result == null)
! 703: return null;
! 704: try
! 705: {
! 706: ResultSetMetaData metaData = result.getMetaData();
! 707: int columnCount = metaData.getColumnCount();
! 708: columnNames = new Vector();
! 709:
! 710: for (int i = 1; i <= columnCount; i++)
! 711: columnNames.addElement(metaData.getColumnName(i));
! 712: } catch (Exception e)
! 713: {
! 714: }
! 715: return columnNames;
! 716: }
! 717: /**
! 718: * makes the database Query
! 719: * with the numberOfHits as maximum
! 720: * @return the result as an ResultSet object
! 721: */
! 722: public ResultSet makeQuery(String query, int numberOfHits) throws SQLException,Exception
! 723: {
! 724: result = null;
! 725: Statement stm = null;
! 726:
! 727: // System.out.println("Query " + query);
! 728:
! 729: if (!connection.isClosed())
! 730: stm = connection.createStatement();
! 731: else
! 732: {
! 733:
! 734: try
! 735: {
! 736: connection = getConnection();
! 737: stm = connection.createStatement();
! 738: } catch (Exception e)
! 739: {
! 740: // TODO Auto-generated catch block
! 741: e.printStackTrace();
! 742: }
! 743: }
! 744: stm.setMaxRows(numberOfHits);
! 745: long time = System.currentTimeMillis();
! 746: try
! 747: {
! 748: stm.execute(query);
! 749: long time2 = System.currentTimeMillis();
! 750:
! 751: System.out.println("time to execute " + (time2 - time));
! 752: // stm.setMaxRows(numberOfHits);
! 753:
! 754: result = stm.getResultSet();
! 755: // System.out.println(result+" "+stm.getUpdateCount());
! 756: metaData = result.getMetaData();
! 757: } catch (Exception e)
! 758: {
! 759: // TODO remove
! 760: if (Convert.isGUI&&Convert.debug)
! 761: FM2SQL.showErrorDialog("Error caught!! \n Query was " + query + " \n", "Debug Info");
! 762: e.printStackTrace();
! 763: throw e;
! 764: }
! 765:
! 766: return result;
! 767: }
! 768: /**
! 769: * sets the database user
! 770: */
! 771: public void setUser(String user)
! 772: {
! 773: this.user = user;
! 774: }
! 775: /**
! 776: * sets the database passwd
! 777: */
! 778: public void setPasswd(String passwd)
! 779: {
! 780: this.passwd = passwd;
! 781: }
! 782:
! 783: /**
! 784: * sets the database user and passwd
! 785: */
! 786: public void setUserAndPasswd(String user, String passwd)
! 787: {
! 788: this.user = user;
! 789: this.passwd = passwd;
! 790:
! 791: }
! 792: /**
! 793: * just sets the connection URL
! 794: */
! 795: public void setURL(String url)
! 796: {
! 797: this.url = url;
! 798: }
! 799:
! 800: /**
! 801: * Test the database drivers features given by the DatabaseMetaData object
! 802: */
! 803: public Vector[] TestDB(DatabaseMetaData d) throws SQLException
! 804: {
! 805:
! 806: Vector data[] = new Vector[2];
! 807: Vector[] rows = new Vector[120];
! 808: for (int i = 0; i < rows.length; ++i)
! 809: rows[i] = new Vector();
! 810: Vector columnNames = new Vector();
! 811: columnNames.add("Feature");
! 812: columnNames.add("Supported");
! 813:
! 814: Vector cols = new Vector();
! 815: rows[0].add("allProceduresAreCallable");
! 816: rows[0].add(new Boolean(d.allProceduresAreCallable()));
! 817: //boolean allProceduresAreCallable() throws SQLException;
! 818: rows[1].add("allTablesAreSelectable");
! 819: rows[1].add(new Boolean(d.allTablesAreSelectable()));
! 820: // boolean allTablesAreSelectable() throws SQLException;
! 821: rows[2].add("isReadOnly");
! 822: rows[2].add(new Boolean(d.isReadOnly()));
! 823: // boolean isReadOnly() throws SQLException;
! 824: rows[3].add("nullsAreSortedHigh");
! 825: rows[3].add(new Boolean(d.nullsAreSortedHigh()));
! 826: // boolean nullsAreSortedHigh() throws SQLException;
! 827: rows[4].add("nullsAreSortedLow");
! 828: rows[4].add(new Boolean(d.nullsAreSortedLow()));
! 829: // boolean nullsAreSortedLow() throws SQLException;
! 830: rows[5].add("nullsAreSortedAtStart");
! 831: rows[5].add(new Boolean(d.nullsAreSortedAtStart()));
! 832: // boolean nullsAreSortedAtStart() throws SQLException;
! 833: rows[6].add("nullsAreSortedAtEnd");
! 834: rows[6].add(new Boolean(d.nullsAreSortedAtEnd()));
! 835: // boolean nullsAreSortedAtEnd() throws SQLException;
! 836: rows[7].add("usesLocalFiles");
! 837: rows[7].add(new Boolean(d.usesLocalFiles()));
! 838: // boolean usesLocalFiles() throws SQLException;
! 839: rows[8].add("usesLocalFilePerTable");
! 840: rows[8].add(new Boolean(d.usesLocalFilePerTable()));
! 841: // boolean usesLocalFilePerTable() throws SQLException;
! 842: rows[9].add("supportsMixedCaseIdentifiers");
! 843: rows[9].add(new Boolean(d.supportsMixedCaseIdentifiers()));
! 844: //boolean supportsMixedCaseIdentifiers() throws SQLException;
! 845: rows[10].add("storesUpperCaseIdentifiers");
! 846: rows[10].add(new Boolean(d.storesUpperCaseIdentifiers()));
! 847: // boolean storesUpperCaseIdentifiers() throws SQLException;
! 848: rows[11].add("storesLowerCaseIdentifiers");
! 849: rows[11].add(new Boolean(d.storesLowerCaseIdentifiers()));
! 850: // boolean storesLowerCaseIdentifiers() throws SQLException;
! 851: rows[12].add("storesMixedCaseIdentifiers");
! 852: rows[12].add(new Boolean(d.storesMixedCaseIdentifiers()));
! 853: // boolean storesMixedCaseIdentifiers() throws SQLException;
! 854: rows[13].add("supportsMixedCaseQuotedIdentifiers");
! 855: rows[13].add(new Boolean(d.supportsMixedCaseQuotedIdentifiers()));
! 856: // boolean supportsMixedCaseQuotedIdentifiers() throws SQLException;
! 857: rows[14].add("storesUpperCaseQuotedIdentifiers");
! 858: rows[14].add(new Boolean(d.storesUpperCaseQuotedIdentifiers()));
! 859: // boolean storesUpperCaseQuotedIdentifiers() throws SQLException;
! 860: rows[15].add("storesLowerCaseQuotedIdentifiers");
! 861: rows[15].add(new Boolean(d.storesLowerCaseQuotedIdentifiers()));
! 862: //boolean storesLowerCaseQuotedIdentifiers() throws SQLException;
! 863: rows[16].add("storesMixedCaseQuotedIdentifiers");
! 864: rows[16].add(new Boolean(d.storesMixedCaseQuotedIdentifiers()));
! 865: // boolean storesMixedCaseQuotedIdentifiers() throws SQLException;
! 866: rows[17].add("supportsAlterTableWithAddColumn");
! 867: rows[17].add(new Boolean(d.supportsAlterTableWithAddColumn()));
! 868: // boolean supportsAlterTableWithAddColumn() throws SQLException;
! 869: rows[18].add("supportsAlterTableWithDropColumn");
! 870: rows[18].add(new Boolean(d.supportsAlterTableWithDropColumn()));
! 871: // boolean supportsAlterTableWithDropColumn() throws SQLException;
! 872: rows[19].add("nullPlusNonNullIsNull");
! 873: rows[19].add(new Boolean(d.nullPlusNonNullIsNull()));
! 874: // boolean nullPlusNonNullIsNull() throws SQLException;
! 875: rows[20].add("supportsConvert");
! 876: rows[20].add(new Boolean(d.supportsConvert()));
! 877: // boolean supportsConvert() throws SQLException;
! 878:
! 879: // boolean supportsConvert(int fromType, int toType) throws SQLException;
! 880: rows[21].add("supportsTableCorrelationNames");
! 881: rows[21].add(new Boolean(d.supportsTableCorrelationNames()));
! 882: // boolean supportsTableCorrelationNames() throws SQLException;
! 883: rows[22].add("supportsDifferentTableCorrelationNames");
! 884: rows[22].add(new Boolean(d.supportsDifferentTableCorrelationNames()));
! 885: // boolean supportsDifferentTableCorrelationNames() throws SQLException;
! 886: rows[23].add("supportsExpressionsInOrderBy");
! 887: rows[23].add(new Boolean(d.supportsExpressionsInOrderBy()));
! 888: // boolean supportsExpressionsInOrderBy() throws SQLException;
! 889: rows[24].add("supportsOrderByUnrelated");
! 890: rows[24].add(new Boolean(d.supportsOrderByUnrelated()));
! 891: // boolean supportsOrderByUnrelated() throws SQLException;
! 892: rows[25].add("supportsGroupBy");
! 893: rows[25].add(new Boolean(d.supportsGroupBy()));
! 894: // boolean supportsGroupBy() throws SQLException;
! 895: rows[26].add("supportsGroupByUnrelated");
! 896: rows[26].add(new Boolean(d.supportsGroupByUnrelated()));
! 897: // boolean supportsGroupByUnrelated() throws SQLException;
! 898: rows[27].add("supportsGroupByBeyondSelect");
! 899: rows[27].add(new Boolean(d.supportsGroupByBeyondSelect()));
! 900: // boolean supportsGroupByBeyondSelect() throws SQLException;
! 901: rows[28].add("supportsLikeEscapeClause");
! 902: rows[28].add(new Boolean(d.supportsLikeEscapeClause()));
! 903: // boolean supportsLikeEscapeClause() throws SQLException;
! 904: rows[29].add("supportsMultipleResultSets");
! 905: rows[29].add(new Boolean(d.supportsMultipleResultSets()));
! 906: // boolean supportsMultipleResultSets() throws SQLException;
! 907: rows[30].add("supportsMultipleTransactions");
! 908: rows[30].add(new Boolean(d.supportsMultipleTransactions()));
! 909: // boolean supportsMultipleTransactions() throws SQLException;
! 910: rows[31].add("supportsNonNullableColumns");
! 911: rows[31].add(new Boolean(d.supportsNonNullableColumns()));
! 912: // boolean supportsNonNullableColumns() throws SQLException;
! 913: rows[32].add("supportsMinimumSQLGrammar");
! 914: rows[32].add(new Boolean(d.supportsMinimumSQLGrammar()));
! 915: // boolean supportsMinimumSQLGrammar() throws SQLException;
! 916: rows[33].add("supportsCoreSQLGrammar");
! 917: rows[33].add(new Boolean(d.supportsCoreSQLGrammar()));
! 918: // boolean supportsCoreSQLGrammar() throws SQLException;
! 919: rows[34].add("supportsExtendedSQLGrammar");
! 920: rows[34].add(new Boolean(d.supportsExtendedSQLGrammar()));
! 921: // boolean supportsExtendedSQLGrammar() throws SQLException;
! 922: rows[35].add("supportsANSI92EntryLevelSQL");
! 923: rows[35].add(new Boolean(d.supportsANSI92EntryLevelSQL()));
! 924: // boolean supportsANSI92EntryLevelSQL() throws SQLException;
! 925: rows[36].add("supportsANSI92IntermediateSQL");
! 926: rows[36].add(new Boolean(d.supportsANSI92IntermediateSQL()));
! 927: //boolean supportsANSI92IntermediateSQL() throws SQLException;
! 928: rows[37].add("supportsANSI92FullSQL");
! 929: rows[37].add(new Boolean(d.supportsANSI92FullSQL()));
! 930: //boolean supportsANSI92FullSQL() throws SQLException;
! 931: rows[38].add("supportsIntegrityEnhancementFacility");
! 932: rows[38].add(new Boolean(d.supportsIntegrityEnhancementFacility()));
! 933: //boolean supportsIntegrityEnhancementFacility() throws SQLException;
! 934: rows[39].add("supportsOuterJoins");
! 935: rows[39].add(new Boolean(d.supportsOuterJoins()));
! 936: //boolean supportsOuterJoins() throws SQLException;
! 937: rows[40].add("supportsFullOuterJoins");
! 938: rows[40].add(new Boolean(d.supportsFullOuterJoins()));
! 939: //boolean supportsFullOuterJoins() throws SQLException;
! 940: rows[41].add("supportsLimitedOuterJoins");
! 941: rows[41].add(new Boolean(d.supportsLimitedOuterJoins()));
! 942: //boolean supportsLimitedOuterJoins() throws SQLException;
! 943: rows[42].add("isCatalogAtStart");
! 944: rows[42].add(new Boolean(d.isCatalogAtStart()));
! 945: //boolean isCatalogAtStart() throws SQLException;
! 946: rows[43].add("supportsSchemasInDataManipulation");
! 947: rows[43].add(new Boolean(d.supportsSchemasInDataManipulation()));
! 948: //boolean supportsSchemasInDataManipulation() throws SQLException;
! 949: rows[44].add("supportsSchemasInProcedureCalls");
! 950: rows[44].add(new Boolean(d.supportsSchemasInProcedureCalls()));
! 951: //boolean supportsSchemasInProcedureCalls() throws SQLException;
! 952: rows[45].add("supportsSchemasInTableDefinitions");
! 953: rows[45].add(new Boolean(d.supportsSchemasInTableDefinitions()));
! 954: //boolean supportsSchemasInTableDefinitions() throws SQLException;
! 955: rows[46].add("supportsSchemasInIndexDefinitions");
! 956: rows[46].add(new Boolean(d.supportsSchemasInIndexDefinitions()));
! 957: //boolean supportsSchemasInIndexDefinitions() throws SQLException;
! 958: rows[47].add("supportsSchemasInPrivilegeDefinitions");
! 959: rows[47].add(new Boolean(d.supportsSchemasInPrivilegeDefinitions()));
! 960: //boolean supportsSchemasInPrivilegeDefinitions() throws SQLException;
! 961: rows[48].add("supportsCatalogsInDataManipulation");
! 962: rows[48].add(new Boolean(d.supportsCatalogsInDataManipulation()));
! 963: //boolean supportsCatalogsInDataManipulation() throws SQLException;
! 964: rows[49].add("supportsCatalogsInProcedureCalls");
! 965: rows[49].add(new Boolean(d.supportsCatalogsInProcedureCalls()));
! 966: //boolean supportsCatalogsInProcedureCalls() throws SQLException;
! 967: rows[50].add("supportsCatalogsInTableDefinitions");
! 968: rows[50].add(new Boolean(d.supportsCatalogsInTableDefinitions()));
! 969: //boolean supportsCatalogsInTableDefinitions() throws SQLException;
! 970: rows[51].add("supportsCatalogsInIndexDefinitions");
! 971: rows[51].add(new Boolean(d.supportsCatalogsInIndexDefinitions()));
! 972: //boolean supportsCatalogsInIndexDefinitions() throws SQLException;
! 973: rows[52].add("supportsCatalogsInPrivilegeDefinitions");
! 974: rows[52].add(new Boolean(d.supportsCatalogsInPrivilegeDefinitions()));
! 975: //boolean supportsCatalogsInPrivilegeDefinitions() throws SQLException;
! 976: rows[53].add("supportsPositionedDelete");
! 977: rows[53].add(new Boolean(d.supportsPositionedDelete()));
! 978: //boolean supportsPositionedDelete() throws SQLException;
! 979: rows[54].add("supportsPositionedUpdate");
! 980: rows[54].add(new Boolean(d.supportsPositionedUpdate()));
! 981: //boolean supportsPositionedUpdate() throws SQLException;
! 982: rows[55].add("supportsSelectForUpdate");
! 983: rows[55].add(new Boolean(d.supportsSelectForUpdate()));
! 984: //boolean supportsSelectForUpdate() throws SQLException;
! 985: rows[56].add("supportsStoredProcedures");
! 986: rows[56].add(new Boolean(d.supportsStoredProcedures()));
! 987: //boolean supportsStoredProcedures() throws SQLException;
! 988: rows[57].add("supportsSubqueriesInComparisons");
! 989: rows[57].add(new Boolean(d.supportsSubqueriesInComparisons()));
! 990: //boolean supportsSubqueriesInComparisons() throws SQLException;
! 991: rows[58].add("supportsSubqueriesInExists");
! 992: rows[58].add(new Boolean(d.supportsSubqueriesInExists()));
! 993: //boolean supportsSubqueriesInExists() throws SQLException;
! 994: rows[59].add("supportsSubqueriesInIns");
! 995: rows[59].add(new Boolean(d.supportsSubqueriesInIns()));
! 996: //boolean supportsSubqueriesInIns() throws SQLException;
! 997: rows[60].add("supportsSubqueriesInQuantifieds");
! 998: rows[60].add(new Boolean(d.supportsSubqueriesInQuantifieds()));
! 999: //boolean supportsSubqueriesInQuantifieds() throws SQLException;
! 1000: rows[61].add("supportsCorrelatedSubqueries");
! 1001: rows[61].add(new Boolean(d.supportsCorrelatedSubqueries()));
! 1002: //boolean supportsCorrelatedSubqueries() throws SQLException;
! 1003: rows[62].add("supportsUnion");
! 1004: rows[62].add(new Boolean(d.supportsUnion()));
! 1005: //boolean supportsUnion() throws SQLException;
! 1006: rows[63].add("supportsUnionAll");
! 1007: rows[63].add(new Boolean(d.supportsUnionAll()));
! 1008: //boolean supportsUnionAll() throws SQLException;
! 1009: rows[64].add("supportsOpenCursorsAcrossCommit");
! 1010: rows[64].add(new Boolean(d.supportsOpenCursorsAcrossCommit()));
! 1011: //boolean supportsOpenCursorsAcrossCommit() throws SQLException;
! 1012: rows[65].add("supportsOpenCursorsAcrossRollback");
! 1013: rows[65].add(new Boolean(d.supportsOpenCursorsAcrossRollback()));
! 1014: //boolean supportsOpenCursorsAcrossRollback() throws SQLException;
! 1015: rows[66].add("supportsOpenStatementsAcrossCommit");
! 1016: rows[66].add(new Boolean(d.supportsOpenStatementsAcrossCommit()));
! 1017: //boolean supportsOpenStatementsAcrossCommit() throws SQLException;
! 1018: rows[67].add("supportsOpenStatementsAcrossRollback");
! 1019: rows[67].add(new Boolean(d.supportsOpenStatementsAcrossRollback()));
! 1020: //boolean supportsOpenStatementsAcrossRollback() throws SQLException;
! 1021: rows[68].add("doesMaxRowSizeIncludeBlobs");
! 1022: rows[68].add(new Boolean(d.doesMaxRowSizeIncludeBlobs()));
! 1023: //boolean doesMaxRowSizeIncludeBlobs() throws SQLException;
! 1024: rows[69].add("supportsTransactions");
! 1025: rows[69].add(new Boolean(d.supportsTransactions()));
! 1026: //boolean supportsTransactions() throws SQLException;
! 1027: rows[70].add("supportsTransactionIsolationLevel");
! 1028: rows[70].add(new Boolean(d.supportsTransactionIsolationLevel(1)));
! 1029: //boolean supportsTransactionIsolationLevel(int level) throws SQLException;
! 1030: rows[71].add("supportsDataDefinitionAndDataManipulationTransactions");
! 1031: rows[71].add(new Boolean(d.supportsDataDefinitionAndDataManipulationTransactions()));
! 1032: //boolean supportsDataDefinitionAndDataManipulationTransactions() throws SQLException;
! 1033: rows[72].add("supportsDataManipulationTransactionsOnly");
! 1034: rows[72].add(new Boolean(d.supportsDataManipulationTransactionsOnly()));
! 1035: //boolean supportsDataManipulationTransactionsOnly() throws SQLException;
! 1036: rows[73].add("dataDefinitionCausesTransactionCommit");
! 1037: rows[73].add(new Boolean(d.dataDefinitionCausesTransactionCommit()));
! 1038: //boolean dataDefinitionCausesTransactionCommit() throws SQLException;
! 1039: rows[74].add("dataDefinitionIgnoredInTransactions");
! 1040: rows[74].add(new Boolean(d.dataDefinitionIgnoredInTransactions()));
! 1041: //boolean dataDefinitionIgnoredInTransactions() throws SQLException;
! 1042: rows[75].add("getMaxBinaryLiteralLength");
! 1043: rows[75].add(new Integer(d.getMaxBinaryLiteralLength()));
! 1044: // int getMaxBinaryLiteralLength() throws SQLException;
! 1045: rows[76].add("getMaxCharLiteralLength");
! 1046: rows[76].add(new Integer(d.getMaxCharLiteralLength()));
! 1047: //int getMaxCharLiteralLength() throws SQLException;
! 1048: rows[77].add("getMaxColumnNameLength");
! 1049: rows[77].add(new Integer(d.getMaxColumnNameLength()));
! 1050: // int getMaxColumnNameLength() throws SQLException;
! 1051: rows[78].add("getMaxColumnsInGroupBy");
! 1052: rows[78].add(new Integer(d.getMaxColumnsInGroupBy()));
! 1053: //int getMaxColumnsInGroupBy() throws SQLException;
! 1054: rows[79].add("getMaxColumnsInIndex");
! 1055: rows[79].add(new Integer(d.getMaxColumnsInIndex()));
! 1056: //int getMaxColumnsInIndex() throws SQLException;
! 1057: rows[80].add("getMaxColumnsInOrderBy");
! 1058: rows[80].add(new Integer(d.getMaxColumnsInOrderBy()));
! 1059: //int getMaxColumnsInOrderBy() throws SQLException;
! 1060: rows[81].add("getMaxColumnsInSelect");
! 1061: rows[81].add(new Integer(d.getMaxColumnsInSelect()));
! 1062: //int getMaxColumnsInSelect() throws SQLException;
! 1063: rows[82].add("getMaxColumnsInTable");
! 1064: rows[82].add(new Integer(d.getMaxColumnsInTable()));
! 1065: //int getMaxColumnsInTable() throws SQLException;
! 1066: rows[83].add("getMaxConnections");
! 1067: rows[83].add(new Integer(d.getMaxConnections()));
! 1068: //int getMaxConnections() throws SQLException;
! 1069: rows[84].add("getMaxCursorNameLength");
! 1070: rows[84].add(new Integer(d.getMaxCursorNameLength()));
! 1071: // int getMaxCursorNameLength() throws SQLException;
! 1072: rows[85].add("getMaxIndexLength");
! 1073: rows[85].add(new Integer(d.getMaxIndexLength()));
! 1074: //int getMaxIndexLength() throws SQLException;
! 1075: rows[86].add("getMaxSchemaNameLength");
! 1076: rows[86].add(new Integer(d.getMaxSchemaNameLength()));
! 1077: //int getMaxSchemaNameLength() throws SQLException;
! 1078: rows[87].add("getMaxProcedureNameLength");
! 1079: rows[87].add(new Integer(d.getMaxProcedureNameLength()));
! 1080: //int getMaxProcedureNameLength() throws SQLException;
! 1081: rows[88].add("getMaxCatalogNameLength");
! 1082: rows[88].add(new Integer(d.getMaxCatalogNameLength()));
! 1083: //int getMaxCatalogNameLength() throws SQLException;
! 1084: rows[89].add("getMaxRowSize");
! 1085: rows[89].add(new Integer(d.getMaxRowSize()));
! 1086: //int getMaxRowSize() throws SQLException;
! 1087: rows[90].add("getMaxStatementLength");
! 1088: rows[90].add(new Integer(d.getMaxStatementLength()));
! 1089: //int getMaxStatementLength() throws SQLException;
! 1090: rows[91].add("getMaxStatements");
! 1091: rows[91].add(new Integer(d.getMaxStatements()));
! 1092: //int getMaxStatements() throws SQLException;
! 1093: rows[92].add("getMaxTableNameLength");
! 1094: rows[92].add(new Integer(d.getMaxTableNameLength()));
! 1095: //int getMaxTableNameLength() throws SQLException;
! 1096: rows[93].add("getMaxTablesInSelect");
! 1097: rows[93].add(new Integer(d.getMaxTablesInSelect()));
! 1098: //int getMaxTablesInSelect() throws SQLException;
! 1099: rows[94].add("getMaxUserNameLength");
! 1100: rows[94].add(new Integer(d.getMaxUserNameLength()));
! 1101: // int getMaxUserNameLength() throws SQLException;
! 1102: rows[95].add("getDefaultTransactionIsolation");
! 1103: rows[95].add(new Integer(d.getDefaultTransactionIsolation()));
! 1104: //int getDefaultTransactionIsolation() throws SQLException;
! 1105:
! 1106: rows[96].add("getDatabaseProductName");
! 1107: rows[96].add(d.getDatabaseProductName());
! 1108: // String getDatabaseProductName() throws SQLException;
! 1109: rows[97].add("getDatabaseProductVersion");
! 1110: rows[97].add(d.getDatabaseProductVersion());
! 1111: //String getDatabaseProductVersion() throws SQLException;
! 1112:
! 1113: rows[98].add("getURL");
! 1114: rows[98].add(d.getURL());
! 1115: //String getURL() throws SQLException;
! 1116: rows[99].add("getUserName");
! 1117: rows[99].add(d.getUserName());
! 1118: //String getUserName() throws SQLException;
! 1119: rows[100].add("getDriverName");
! 1120: rows[100].add(d.getDriverName());
! 1121: // String getDriverName() throws SQLException;
! 1122: rows[101].add("getIdentifierQuoteString");
! 1123: rows[101].add(d.getIdentifierQuoteString());
! 1124: //String getIdentifierQuoteString() throws SQLException;
! 1125:
! 1126: rows[102].add("getDriverVersion");
! 1127: rows[102].add(d.getDriverVersion());
! 1128: //String getDriverVersion() throws SQLException;
! 1129: rows[103].add("getDriverMajorVersion");
! 1130: rows[103].add(new Integer(d.getDriverMajorVersion()));
! 1131: //int getDriverMajorVersion();
! 1132: rows[104].add("getDriverMinorVersion");
! 1133: rows[104].add(new Integer(d.getDriverMinorVersion()));
! 1134: //int getDriverMinorVersion();
! 1135: rows[105].add("getSQLKeywords");
! 1136: rows[105].add(d.getSQLKeywords());
! 1137: //String getSQLKeywords() throws SQLException;
! 1138: rows[106].add("getNumericFunctions");
! 1139: rows[106].add(d.getNumericFunctions());
! 1140: //String getNumericFunctions() throws SQLException;
! 1141: rows[107].add("getStringFunctions");
! 1142: rows[107].add(d.getStringFunctions());
! 1143: // String getStringFunctions() throws SQLException;
! 1144: rows[108].add("getSystemFunctions");
! 1145: rows[108].add(d.getSystemFunctions());
! 1146: //String getSystemFunctions() throws SQLException;
! 1147: rows[109].add("getTimeDateFunctions");
! 1148: rows[109].add(d.getTimeDateFunctions());
! 1149: //String getTimeDateFunctions() throws SQLException;
! 1150: rows[110].add("getSearchStringEscape");
! 1151: rows[110].add(d.getSearchStringEscape());
! 1152: //String getSearchStringEscape() throws SQLException;
! 1153: rows[111].add("getExtraNameCharacters");
! 1154: rows[111].add(d.getExtraNameCharacters());
! 1155: //String getExtraNameCharacters() throws SQLException;
! 1156: rows[112].add("getSchemaTerm");
! 1157: rows[112].add(d.getSchemaTerm());
! 1158: //String getSchemaTerm() throws SQLException;
! 1159: rows[113].add("getProcedureTerm");
! 1160: rows[113].add(d.getProcedureTerm());
! 1161: //String getProcedureTerm() throws SQLException;
! 1162: rows[114].add("getCatalogTerm");
! 1163: rows[114].add(d.getCatalogTerm());
! 1164: // String getCatalogTerm() throws SQLException;
! 1165: rows[115].add("getCatalogSeparator");
! 1166: rows[115].add(d.getCatalogSeparator());
! 1167: //String getCatalogSeparator() throws SQLException;
! 1168:
! 1169: /*
! 1170: boolean supportsResultSetType(int type) throws SQLException;
! 1171:
! 1172: boolean supportsResultSetConcurrency(int type, int concurrency) throws SQLException;
! 1173:
! 1174: boolean ownUpdatesAreVisible(int type) throws SQLException;
! 1175:
! 1176: boolean ownDeletesAreVisible(int type) throws SQLException;
! 1177:
! 1178: boolean ownInsertsAreVisible(int type) throws SQLException;
! 1179:
! 1180: boolean othersUpdatesAreVisible(int type) throws SQLException;
! 1181:
! 1182: boolean othersDeletesAreVisible(int type) throws SQLException;
! 1183:
! 1184: boolean othersInsertsAreVisible(int type) throws SQLException;
! 1185: boolean updatesAreDetected(int type) throws SQLException;
! 1186: boolean deletesAreDetected(int type) throws SQLException;
! 1187:
! 1188: boolean insertsAreDetected(int type) throws SQLException;
! 1189: */
! 1190: // not in filemaker
! 1191: // rows[96].add("supportsBatchUpdates");
! 1192: // rows[96].add(new Boolean(d.supportsBatchUpdates()));
! 1193: //boolean supportsBatchUpdates() throws SQLException;
! 1194:
! 1195: /*
! 1196: ResultSet getProcedures(String catalog, String schemaPattern, String procedureNamePattern) throws SQLException;
! 1197:
! 1198: ResultSet getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern) throws SQLException;
! 1199: ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String types[]) throws SQLException;
! 1200: ResultSet getSchemas() throws SQLException;
! 1201: ResultSet getCatalogs() throws SQLException;
! 1202: ResultSet getTableTypes() throws SQLException;
! 1203: ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException;
! 1204: ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException;
! 1205: ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException;
! 1206: ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException;
! 1207: ResultSet getCrossReference(String primaryCatalog, String primarySchema, String primaryTable, String foreignCatalog, String foreignSchema, String foreignTable) throws SQLException;
! 1208: ResultSet getTypeInfo() throws SQLException;
! 1209: ResultSet getIndexInfo(String catalog, String schema, String table, boolean unique, boolean approximate) throws SQLException;
! 1210:
! 1211: ResultSet getUDTs(String catalog, String schemaPattern, String typeNamePattern, int[] types) throws SQLException;
! 1212:
! 1213: Connection getConnection() throws SQLException;
! 1214:
! 1215: */
! 1216: for (int i = 0; i < rows.length; ++i)
! 1217: cols.add(rows[i]);
! 1218: data[0] = cols;
! 1219: data[1] = columnNames;
! 1220: return data;
! 1221: }
! 1222: public Vector getNextRow() throws Exception
! 1223: {
! 1224:
! 1225: if (result == null)
! 1226: return null;
! 1227: boolean check = false;
! 1228: ResultSet resultSet = result;
! 1229: ResultSetMetaData metaData = resultSet.getMetaData();
! 1230: int columnCount = metaData.getColumnCount();
! 1231: Vector tableData = new Vector();
! 1232: check = resultSet.next();
! 1233: // System.out.println("hallo check "+check);
! 1234: if (!check)
! 1235: return null;
! 1236: Vector tableRow = new Vector(), m_columnClasses = new Vector();
! 1237: for (int i = 1; i <= columnCount; i++)
! 1238: {
! 1239: // repeating fields and fields from related databases may contain
! 1240: // multliple data values; the data values are stored using
! 1241: // a Vector which is then added to the tableRow
! 1242: // if (metaData instanceof ResultSetMetaDataExt)
! 1243: if ((metaData instanceof ResultSetMetaDataExt) && (((ResultSetMetaDataExt) metaData).isRelated(i) || ((ResultSetMetaDataExt) metaData).isRepeating(i)))
! 1244: {
! 1245: //System.out.println("Related fields");
! 1246: // retrieve the repeating or related field contents as a
! 1247: // com.fmi.jdbc.Array via the ResultSet.getObject method
! 1248: com.fmi.jdbc.Array array = (com.fmi.jdbc.Array) resultSet.getObject(i);
! 1249: // create a Vector for storing all of the data values
! 1250: ArrayList columnData = new ArrayList();
! 1251: try
! 1252: {
! 1253:
! 1254: // call the Array.getStringArray method since the data will
! 1255: // only be displayed
! 1256: Object[] fieldData = (Object[]) array.getArray();
! 1257:
! 1258: if (fieldData != null)
! 1259: {
! 1260: // add each value to the Vector
! 1261: for (int j = 0; j < fieldData.length; j++)
! 1262: {
! 1263: if (fieldData[j] != null)
! 1264: columnData.add(fieldData[j]);
! 1265: }
! 1266: }
! 1267: } catch (Exception e)
! 1268: {
! 1269: //System.out.println(e);
! 1270: }
! 1271:
! 1272: if (columnData.isEmpty())
! 1273: tableRow.add(null);
! 1274: else
! 1275: tableRow.addElement(columnData);
! 1276: //System.out.println(columnData);
! 1277: //System.out.println("Related fields"+columnData.size()+" "+tableRow.size());
! 1278:
! 1279: // m_columnClasses.addElement(java.util.Vector.class);
! 1280: } else if (metaData.getColumnType(i) == Types.LONGVARBINARY)
! 1281: {
! 1282: // use the ResultSet.getObject method for retrieving images
! 1283: // from FileMaker Pro container fields; the ResultSet.getObject
! 1284: // method returns a java.awt.Image object for FileMaker Pro
! 1285: // container fields
! 1286:
! 1287: try
! 1288: {
! 1289: tableRow.addElement(resultSet.getObject(i));
! 1290: } catch (Exception e)
! 1291: {
! 1292: // TODO Auto-generated catch block
! 1293: // e.printStackTrace();
! 1294: tableRow.addElement(null);
! 1295: }
! 1296: // m_columnClasses.addElement(java.awt.Image.class);
! 1297: } else if (metaData.getColumnType(i) == Types.TIME)
! 1298: {
! 1299: // use the ResultSet.getObject method for retieving images
! 1300: // from FileMaker Pro container fields; the ResultSet.getObject
! 1301: // method returns a java.awt.Image object for FileMaker Pro
! 1302: // container fields
! 1303: try
! 1304: {
! 1305: tableRow.addElement(resultSet.getTime(i).toString());
! 1306: // m_columnClasses.addElement(java.sql.Time.class);
! 1307: } catch (Exception e)
! 1308: {
! 1309:
! 1310: String value = resultSet.getString(i);
! 1311: if (value != null)
! 1312: {
! 1313: //System.out.println("SQLTime new "+Time.valueOf("17:00:00").toString());
! 1314: int index = 0;
! 1315: for (int j = 0; j < value.length(); ++j)
! 1316: {
! 1317: if (!Character.isLetter(value.charAt(j)))
! 1318: index = j + 1;
! 1319: else
! 1320: break;
! 1321: }
! 1322:
! 1323: tableRow.addElement(value.substring(0, index));
! 1324: //m_columnClasses.addElement(java.sql.Time.class);
! 1325: } else
! 1326: tableRow.add(null);
! 1327: // m_columnClasses.addElement(String.class);
! 1328: } // to catch
! 1329:
! 1330: } else if (metaData.getColumnType(i) == Types.INTEGER)
! 1331: {
! 1332: // use the ResultSet.getObject method for retieving images
! 1333: // from FileMaker Pro container fields; the ResultSet.getObject
! 1334: // method returns a java.awt.Image object for FileMaker Pro
! 1335: // container fields
! 1336:
! 1337: tableRow.addElement(new Integer(resultSet.getInt(i)));
! 1338: // m_columnClasses.addElement(java.sql.Date.class);
! 1339: } else if (metaData.getColumnType(i) == Types.DATE)
! 1340: {
! 1341: // use the ResultSet.getObject method for retieving images
! 1342: // from FileMaker Pro container fields; the ResultSet.getObject
! 1343: // method returns a java.awt.Image object for FileMaker Pro
! 1344: // container fields
! 1345: try
! 1346: {
! 1347: tableRow.addElement(resultSet.getDate(i));
! 1348:
! 1349: } catch (Exception e)
! 1350: {
! 1351: // work around for parse bug in FM JDBC Driver
! 1352: // for dates of format dd-mm-yyyy
! 1353: String date = resultSet.getString(i);
! 1354: date = date.replace('-', '.');
! 1355: java.text.DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.GERMAN);
! 1356: java.util.Date d = dateFormat.parse(date);
! 1357: // Calendar cal=Calendar.getInstance(Locale.GERMAN);
! 1358: // cal.setTime(d);
! 1359: // date=(cal.get(Calendar.YEAR))+"-"+(cal.get(Calendar.MONTH)+1)+"-"+cal.get(Calendar.DATE);
! 1360: tableRow.addElement(new java.sql.Date(d.getTime()));
! 1361: System.out.println("Date " + date);
! 1362: }
! 1363: // m_columnClasses.addElement(java.sql.Date.class);
! 1364: } else if (metaData.getColumnTypeName(i) == "NUMBER")
! 1365: {
! 1366: // use the ResultSet.getObject method for retieving images
! 1367: // from FileMaker Pro container fields; the ResultSet.getObject
! 1368: // method returns a java.awt.Image object for FileMaker Pro
! 1369: // container fields
! 1370: try
! 1371: {
! 1372: Double value =new Double(resultSet.getDouble(i));
! 1373:
! 1374:
! 1375: // tableRow.addElement(new Double(resultSet.getDouble(i)));
! 1376: String tVal =value.toString();
! 1377: tVal = tVal.substring(tVal.indexOf('.')+1);
! 1378: boolean checkMe = tVal.length()==1&&tVal.equals("0");
! 1379: // System.out.println("check was"+checkMe+" "+tVal);
! 1380: if(checkMe)
! 1381: tableRow.addElement(new Integer(value.intValue()));
! 1382: else
! 1383: tableRow.addElement(value);
! 1384:
! 1385: // m_columnClasses.addElement(Integer.class);
! 1386:
! 1387: } catch (Exception e)
! 1388: {
! 1389:
! 1390: StringBuffer number = new StringBuffer();
! 1391: String value = resultSet.getString(i);
! 1392: System.out.println(value);
! 1393: for (int c = 0; c < value.length(); ++c)
! 1394: {
! 1395: if (Character.isDigit(value.charAt(c)))
! 1396: {
! 1397: number.append(value.charAt(c));
! 1398: }
! 1399: }
! 1400: if (number.length() > 0)
! 1401: {
! 1402: tableRow.addElement(null);
! 1403: // m_columnClasses.addElement(Integer.class);
! 1404: } else
! 1405: tableRow.addElement(null);
! 1406: }
! 1407: } else
! 1408: {
! 1409: // all other field values are retrieved as strings and
! 1410: // added to the tableRow Vector
! 1411: // System.out.println("row "+resultSet.getString(i));
! 1412: try
! 1413: {
! 1414: byte[] b = null;
! 1415: if (metaData instanceof ResultSetMetaDataExt)
! 1416: b = resultSet.getBytes(i);
! 1417: /* if (b != null)
! 1418: {
! 1419: java.io.ByteArrayInputStream stream = (java.io.ByteArrayInputStream) resultSet.getBinaryStream(i);
! 1420: // System.out.println(" stream "+resultSet.getBinaryStream(i));
! 1421: byte[] c = new byte[stream.available()];
! 1422: int length = stream.read(c, 0, c.length);
! 1423: int count = 0;
! 1424: b = new byte[c.length];
! 1425: for (int n = 0; n < length; ++n)
! 1426: {
! 1427:
! 1428: if (c[n] != 0)
! 1429: {
! 1430: // System.out.println(c[n]+" "+(int)'?'+" "+(char)c[n]+" "+count+" "+b.length);
! 1431: b[count++] = c[n];
! 1432: }
! 1433: }
! 1434: byte[] bCopy = new byte[count];
! 1435: System.arraycopy(b, 0, bCopy, 0, count);
! 1436: b = bCopy;
! 1437: }*/
! 1438: String utf8 = null;
! 1439: utf8 = (b == null) ? null : new String(b);
! 1440: if (metaData instanceof ResultSetMetaDataExt)
! 1441: {
! 1442: String rowElement = "";
! 1443: if (b != null)
! 1444: {
! 1445: rowElement = resultSet.getString(i);
! 1446: if (useNormanToUnicodeMapper)
! 1447: rowElement = Convert.normanToUnicode(rowElement);
! 1448: tableRow.addElement(rowElement);
! 1449:
! 1450: } else
! 1451: tableRow.addElement(null);
! 1452: } else
! 1453: {
! 1454: if (url.toLowerCase().indexOf("odbc") >= 0)
! 1455: {
! 1456: byte[] val = resultSet.getBytes(i);
! 1457: for (int j = 0; j < val.length; ++j)
! 1458: System.out.println(Integer.toHexString(val[j]));
! 1459: tableRow.addElement((val == null) ? null : new String(val));
! 1460:
! 1461: } else
! 1462: // byte[] val = resultSet.getBytes(i);
! 1463: tableRow.add(resultSet.getString(i));
! 1464: //tableRow.addElement((val==null) ? null:new String(val,"UTF-8"));
! 1465: }
! 1466: } catch (Exception e)
! 1467: {
! 1468: System.out.println("Hey I got an error" + e);
! 1469: e.printStackTrace();
! 1470: }
! 1471: // m_columnClasses.addElement(java.lang.String.class);
! 1472: }
! 1473: }
! 1474: // tableData.addElement(tableRow);
! 1475: if (check)
! 1476: return tableRow;
! 1477: else
! 1478: return null;
! 1479: }
! 1480: class ConnectionPool
! 1481: {
! 1482: String user = "", passwd = "", url = "";
! 1483: Connection con;
! 1484: public ConnectionPool(String url, String user, String passwd, Connection con)
! 1485: {
! 1486: this.con = con;
! 1487: this.user = user;
! 1488: this.passwd = passwd;
! 1489: this.url = url;
! 1490: }
! 1491:
! 1492: }
! 1493: public String getQC()
! 1494: {
! 1495: // if (connection == null)
! 1496: // return "";
! 1497:
! 1498: // check if connection null if null try to get one
! 1499: if (connection == null)
! 1500: try
! 1501: {
! 1502: getConnection();
! 1503: } catch (Exception e)
! 1504: {
! 1505: if (FM2SQL.debug)
! 1506: System.out.println("cannot get a connection");
! 1507: }
! 1508: if (connection == null)
! 1509: {
! 1510: if (url.toLowerCase().indexOf("fmpro") >= 0 || url.toLowerCase().indexOf("postgres") >= 0)
! 1511: quoteChar = "\"";
! 1512: else if (url.toLowerCase().indexOf("mysql") >= 0)
! 1513: quoteChar = "`";
! 1514: }
! 1515: if (quoteChar == null)
! 1516: quoteChar = "\""; // needed for postgres
! 1517: return quoteChar;
! 1518: }
! 1519: public int getRowCount(String query) throws SQLException
! 1520: {
! 1521: String table = query.substring(query.indexOf("from") + 4).trim();
! 1522: int index = table.indexOf(" ");
! 1523: table = table.substring(0, (index >= 0) ? index : table.length());
! 1524: System.out.println(table);
! 1525: Statement stm = null;
! 1526:
! 1527: if (metaData instanceof ResultSetMetaDataExt)
! 1528: return 1000;
! 1529: if (!connection.isClosed())
! 1530: stm = connection.createStatement();
! 1531: stm.setMaxRows(1);
! 1532: ResultSet resultSet = stm.executeQuery("select count(*) from " + table);
! 1533: resultSet.next();
! 1534: return resultSet.getInt(1);
! 1535: }
! 1536: public TreeSet getIDVector(String id, String table, String query, int numHits) throws Exception
! 1537: {
! 1538: TreeSet t = new TreeSet();
! 1539: getConnection();
! 1540: ResultSet result = this.result;
! 1541: String subQuery = query.substring(query.lastIndexOf(table) + table.length() + 1);
! 1542: System.out.println("subQuery " + subQuery);
! 1543: makeQuery("select " + getQC()+id+getQC() + " from " + getQC() + table + getQC() + subQuery, numHits);
! 1544: while (true)
! 1545: {
! 1546: Vector vec = getNextRow();
! 1547: if (vec == null)
! 1548: break;
! 1549: t.add(vec.get(0));
! 1550: }
! 1551: this.result = result;
! 1552: metaData = (this.result == null) ? null : this.result.getMetaData();
! 1553: return t;
! 1554: }
! 1555: /**
! 1556: * @return
! 1557: */
! 1558: public boolean isUseNormanToUnicodeMapper()
! 1559: {
! 1560: return useNormanToUnicodeMapper;
! 1561: }
! 1562:
! 1563: /**
! 1564: * @param b
! 1565: */
! 1566: public void setUseNormanToUnicodeMapper(boolean b)
! 1567: {
! 1568: useNormanToUnicodeMapper = b;
! 1569: }
! 1570: /**
! 1571: *
! 1572: */
! 1573: protected void closeAllConnections()
! 1574: {
! 1575: Enumeration enumeration = connectionPool.elements();
! 1576: while(enumeration.hasMoreElements())
! 1577: {
! 1578: ConnectionPool conPol =(ConnectionPool)enumeration.nextElement();
! 1579: try
! 1580: {
! 1581: System.out.println(conPol);
! 1582: conPol.con.close();
! 1583: } catch (SQLException e)
! 1584: {
! 1585: // TODO Auto-generated catch block
! 1586: e.printStackTrace();
! 1587: }
! 1588: }
! 1589:
! 1590: }
! 1591: /**
! 1592: * @param indexField
! 1593: */
! 1594: public String getColumnType(String indexField) throws SQLException
! 1595: {
! 1596: Vector names=getColumnNames();
! 1597: for (int i = 0; i < names.size(); i++)
! 1598: {
! 1599: if(names.get(i).toString().equals(indexField))
! 1600: {
! 1601: System .out.println("found field "+names.get(i)+" "+metaData.getColumnTypeName(i+1));
! 1602: return metaData.getColumnTypeName(i+1);
! 1603:
! 1604: }
! 1605: }
! 1606: return "";
! 1607: }
! 1608:
! 1609: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>