introduced IConstant.DEBUG flag
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.sql / src / net / sourceforge / phpdt / sql / sql / MultiSQLServer.java
index f67f0f9..1a97c9f 100644 (file)
@@ -20,488 +20,513 @@ import java.util.Hashtable;
 import java.util.Properties;
 import java.util.Vector;
 
+import net.sourceforge.phpdt.sql.IConstants;
 import net.sourceforge.phpdt.sql.adapters.AdapterFactory;
 import net.sourceforge.phpdt.sql.adapters.DatabaseAdapter;
 import net.sourceforge.phpdt.sql.adapters.NoSuchAdapterException;
 import net.sourceforge.phpdt.sql.bookmarks.Bookmark;
+import net.sourceforge.phpdt.sql.view.LogConstants;
 import net.sourceforge.phpdt.sql.view.LogProxy;
 
-public class MultiSQLServer extends Thread {
-       private static final int STREAM = 1024 * 2;
-       public static final String USERNAME = "user";
-       public static final String PASSWORD = "password";
-       private static MultiSQLServer instance = null;
-       private Hashtable classLoaderCache = new Hashtable();
-       private Connection con = null;
-       boolean running = true;
-       private Bookmark current = null;
-       private MultiSQLServer() {
-               //start();
-       }
-       public synchronized static MultiSQLServer getInstance() {
-               if (instance == null) {
-                       instance = new MultiSQLServer();
-               }
-               return instance;
-       }
-       public Bookmark getConnected() {
-               return current;
-       }
-       
-       public void commit() {
-               LogProxy log = LogProxy.getInstance();
-               try {
-                       con.commit();
-               } catch (SQLException e) {
-                       log.addText(log.ERROR, "Error commiting: " + e);
-                       StringWriter writer = new StringWriter();
-                       e.printStackTrace(new PrintWriter(writer));
-                       log.addText(
-                               log.ERROR,
-                               writer.toString());
-               }
-       }
-       
-       public void rollback() {
-               LogProxy log = LogProxy.getInstance();
-               try {
-                       con.rollback();
-               } catch (SQLException e) {
-                       log.addText(log.ERROR, "Error rolling back: " + e);
-                       StringWriter writer = new StringWriter();
-                       e.printStackTrace(new PrintWriter(writer));
-                       log.addText(
-                               log.ERROR,
-                               writer.toString());
-               }
-       }
+public class MultiSQLServer extends Thread implements IConstants, LogConstants {
+  private static final int STREAM = 1024 * 2;
+  public static final String USERNAME = "user";
+  public static final String PASSWORD = "password";
+  private static MultiSQLServer instance = null;
+  private Hashtable classLoaderCache = new Hashtable();
+  private Connection con = null;
+  boolean running = true;
+  private Bookmark current = null;
+  private MultiSQLServer() {
+    //start();
+  }
+  public synchronized static MultiSQLServer getInstance() {
+    if (instance == null) {
+      instance = new MultiSQLServer();
+    }
+    return instance;
+  }
+  
+  public Bookmark getConnected() {
+    return current;
+  }
 
-       public void setAutoCommit(boolean enabled) {
-               LogProxy log = LogProxy.getInstance();
-               try {
-                       if (con != null) {
-                               con.setAutoCommit(enabled);
-                       } else {
-                               log.addText(log.ERROR, "Please connect before setting autocommit");
-                       }
-               } catch (SQLException e) {
-                       log.addText(log.ERROR, "Error setting autocommit: " + e);
-                       StringWriter writer = new StringWriter();
-                       e.printStackTrace(new PrintWriter(writer));
-                       log.addText(
-                               log.ERROR,
-                               writer.toString());
-               }
-       }
-       
-       public DatabaseAdapter getCurrentAdapter() {
-               LogProxy log = LogProxy.getInstance();
-               try {
-                       AdapterFactory factory = AdapterFactory.getInstance();
-                       return factory.getAdapter(current.getType());
-               } catch (NoSuchAdapterException e) {
-                       log.addText(log.ERROR, "Invalid database type: ->" + current.getType() + "<-");
-               }
-               return null;
-       }
-       public void disconnect(Bookmark b) {
-               current = null;
-               LogProxy log = LogProxy.getInstance();
+  public void commit() {
+    LogProxy log = LogProxy.getInstance();
+    try {
+      con.commit();
+    } catch (SQLException e) {
+      log.addText(ERROR, "Error commiting: " + e);
+      StringWriter writer = new StringWriter();
+      e.printStackTrace(new PrintWriter(writer));
+      log.addText(ERROR, writer.toString());
+    }
+  }
 
-               try {
-                       con.close();
-                       con = null;
-                       log.addText(log.RESULTS, "Disconnected from: " + b.getName());
-               } catch (Exception e) {
-                       log.addText(
-                               log.ERROR,
-                               "Error Disonnecting to: " + b.getName() + ":" + e.toString());
-                       StringWriter writer = new StringWriter();
-                       e.printStackTrace(new PrintWriter(writer));
-                       log.addText(
-                               log.ERROR,
-                               writer.toString());
-                       
-               }
-       }
-       public void shutdown() {
-               LogProxy log = LogProxy.getInstance();
-               try {
-                       if (con != null) {
-                               con.close();
-                       }
-                       con = null;
-               } catch (SQLException e) {
-                       StringWriter writer = new StringWriter();
-                       e.printStackTrace(new PrintWriter(writer));
-                       log.addText(
-                               log.ERROR,
-                               writer.toString());
-               }
-       }
-       
-       public void dumpDatabaseData() {
-               LogProxy log = LogProxy.getInstance();
-               try {
-                       DatabaseMetaData metadata = con.getMetaData();
-                       log.addText(log.WARNING, "[METADATA] Database type: " + metadata.getDatabaseProductName());
-                       if (metadata.supportsCatalogsInDataManipulation()) {
-                               log.addText(log.WARNING, "[METADATA] Database does support catalog in data manipulation");
-                       } else {
-                               log.addText(log.WARNING, "[METADATA] Database does not support catalog in data manipulation");
-                       }
-                       if (metadata.supportsSchemasInDataManipulation()) {
-                               log.addText(log.WARNING, "[METADATA] Database does support schema in data manipulation");
-                       } else {
-                               log.addText(log.WARNING, "[METADATA] Database does not support schema in data manipulation");
-                       }
-                       if (metadata.supportsCatalogsInTableDefinitions()) {
-                               log.addText(log.WARNING, "[METADATA] Database does support catalogs in table definitions");
-                       } else {
-                               log.addText(log.WARNING, "[METADATA] Database does not support catalogs in table definitions");
-                       }
-                       log.addText(log.WARNING, "[METADATA] Catalog Separator: " + metadata.getCatalogSeparator());
-                       log.addText(log.WARNING, "[METADATA] Catalog Term: " + metadata.getCatalogTerm());
-                       ResultSet set = metadata.getCatalogs();
-                       ArrayList catalogList = new ArrayList();
-                       catalogList.add(null);
-                       while (set.next()) {
-                               catalogList.add(set.getString(1));
-                       }
-                       set.close();
-                       StringBuffer catalogOutput = new StringBuffer();
-                       catalogOutput.append("[CATALOG LIST] [");
-                       for (int i = 0; i < catalogList.size(); i++) {
-                               String name = (String) catalogList.get(i);
-                               catalogOutput.append(name + ", ");
-                       }
-                       catalogOutput.append("]");
-                       log.addText(log.WARNING, catalogOutput.toString());
-                       
-                       set = metadata.getSchemas();
-                       ArrayList schemaList = new ArrayList();
-                       schemaList.add("");
-                       while (set.next()) {
-                               schemaList.add(set.getString(1));
-                       }
-                       set.close();
-                       StringBuffer schemaOutput = new StringBuffer();
-                       schemaOutput.append("[SCHEMA LIST] [");
-                       for (int i = 0; i < schemaList.size(); i++) {
-                               String name = (String) schemaList.get(i);
-                               schemaOutput.append(name + ", ");
-                       }
-                       schemaOutput.append("]");
-                       log.addText(log.WARNING, schemaOutput.toString());
+  public void rollback() {
+    LogProxy log = LogProxy.getInstance();
+    try {
+      con.rollback();
+    } catch (SQLException e) {
+      log.addText(ERROR, "Error rolling back: " + e);
+      StringWriter writer = new StringWriter();
+      e.printStackTrace(new PrintWriter(writer));
+      log.addText(ERROR, writer.toString());
+    }
+  }
 
-                       ArrayList tableTypes = new ArrayList();
-                       set = metadata.getTableTypes();
-                       while (set.next()) {
-                               tableTypes.add(set.getString(1));
-                       }
-                       set.close();
-                       
-                       StringBuffer tableListOutput = new StringBuffer();
-                       tableListOutput.append("[TABLE LIST] [");
-                       for (int i = 0; i < tableTypes.size(); i++) {
-                               String name = (String) tableTypes.get(i);
-                               tableListOutput.append(name + ", ");
-                       }
-                       tableListOutput.append("]");
-                       log.addText(log.WARNING, tableListOutput.toString());
-                       
-                       
-               } catch (Exception e) {
-                       log.addText(log.ERROR, "Error occured: " + e);
-                       StringWriter writer = new StringWriter();
-                       e.printStackTrace(new PrintWriter(writer));
-                       log.addText(
-                               log.ERROR,
-                               writer.toString());
-               }
-       }
-       /**
-        * type = "TABLE" "VIEW" "SEQUENCE"
-        */
-       public Vector listTables(String schema, String type) {
-               LogProxy log = LogProxy.getInstance();
-               Vector retVal = new Vector();
-               log.addText(log.QUERY, "Retrieving list [" + type + "]");
-               try {
-                       DatabaseMetaData meta = con.getMetaData();
-                       ResultSet set = meta.getTableTypes();
-                       int columnCount = set.getMetaData().getColumnCount();
-                       for (int i = 1; i <= columnCount; i++) {
-                               System.out.print(set.getMetaData().getColumnName(i) + "\t");
-                       }
-                       System.out.println();
-                       while (set.next()) {
-                               for (int i = 1; i <= columnCount; i++) {
-                                       System.out.print(set.getString(i) + "\t");
-                               }
-                               System.out.println();
-                       }
-                       Vector types = new Vector();
-                       set = meta.getTableTypes();
-                       while (set.next()) {
-                               types.add(set.getString(1));
-                       }
-                       set.close();
-                       if (types.contains(type)) {
-                               set = meta.getTables(null, schema, "%", new String[] {type});
-                               while (set.next()) {
-                                       String name = set.getString("TABLE_NAME");
-                                       String tableType = set.getString("TABLE_TYPE");
-                                       //System.out.println(name + ":" + tableType);
-                                       retVal.addElement(name);
-                               }
-                               set.close();
-                       }
-                       log.addText(log.RESULTS, "Success");
-               } catch (SQLException e) {
-                       log.addText(log.ERROR, "Error occured: " + e);
-                       StringWriter writer = new StringWriter();
-                       e.printStackTrace(new PrintWriter(writer));
-                       log.addText(
-                               log.ERROR,
-                               writer.toString());
-               }
-               return retVal;
-       }
-       public boolean connect(Bookmark b) {
-               LogProxy log = LogProxy.getInstance();
-               log.addText(log.QUERY, "Connecting to: " + b.getName());
-               URL urls[] = new URL[1];
-               try {
-                       String driverFile = b.getDriverFile();
-                       URLClassLoader loader = (URLClassLoader) classLoaderCache.get(driverFile);
-                       if (loader == null) {
-                               urls[0] = new File(driverFile).toURL();
-                               loader = new URLClassLoader(urls);
-                               classLoaderCache.put(driverFile, loader);
-                               System.out.println("Creating new classloader");
-                       } else {
-                               System.out.println("Using classloader in cache");
-                       }
-                       Class driverClass = loader.loadClass(b.getDriver());
-                       Driver driver = (Driver) driverClass.newInstance();
-                       Properties props = new Properties();
-                       props.put(USERNAME, b.getUsername());
-                       props.put(PASSWORD, b.getPassword());
-                       con = driver.connect(b.getConnect(), props);
-                       if (con == null) {
-                               throw new Exception("Error: Driver returned a null connection: " + b.toString());
-                       }
-                       current = b;
-                       log.addText(log.RESULTS, "Connected to: " + b.getName());
-                       System.out.println("Connected");
-                       return true;
-               } catch (Exception e) {
-                       log.addText(
-                               log.ERROR,
-                               "Error Connecting to: " + b.getName() + ":" + e.toString());
-                       StringWriter writer = new StringWriter();
-                       e.printStackTrace(new PrintWriter(writer));
-                       log.addText(
-                               log.ERROR,
-                               writer.toString());
-               }
-               return false;
-       }
-       public SQLResults execute(String s) {
-               return execute(s, -1, -1);
-       }
-       public SQLResults execute(String s, int startRow, int endRow) {
-               return execute(s, -1, -1, Integer.MAX_VALUE);
-       }
-       public SQLResults execute(String s, int startRow, int endRow, int maxLength) {
-               return execute(s, startRow, endRow, maxLength, "");
-       }
-       public SQLResults execute(String s, int startRow, int endRow, int maxLength, String encoding) {
-               SQLResults results = new SQLResults();
+  public void setAutoCommit(boolean enabled) {
+    LogProxy log = LogProxy.getInstance();
+    try {
+      if (con != null) {
+        con.setAutoCommit(enabled);
+      } else {
+        log.addText(ERROR, "Please connect before setting autocommit");
+      }
+    } catch (SQLException e) {
+      log.addText(ERROR, "Error setting autocommit: " + e);
+      StringWriter writer = new StringWriter();
+      e.printStackTrace(new PrintWriter(writer));
+      log.addText(ERROR, writer.toString());
+    }
+  }
 
-               System.out.println("Executing");
-               LogProxy log = LogProxy.getInstance();
-               log.addText(log.QUERY, "Executing Request [" + s + "]");
-               boolean metadata = false;
-               if (s.startsWith("METADATA")) {
-                       metadata = true;
-               }
-               if (metadata) {
-                       results.setQuery(s);
-                       String table = s.substring(s.indexOf(':') + 1);
-                       String schema = current.getSchema();
-                       String query = "SELECT * FROM " + schema + "." + table;
-                       if (schema.equals("")) {
-                               query = "SELECT * FROM " + table;
-                       }
-                       s = query;
-                       log.addText(log.QUERY, "Metadata Request [" + s + "]");
-       } else {
-                       results.setQuery(s);
-               }
-               try {
-                       Statement stmt = con.createStatement();
-                       boolean flag = stmt.execute(s);
-                       results.setResultSet(flag);
-                       if (!flag) {
-                               int updates = stmt.getUpdateCount();
-                               results.setUpdateCount(updates);
-                               log.addText(
-                                       log.RESULTS,
-                                       "Success: " + updates + " records updated");
+  public DatabaseAdapter getCurrentAdapter() {
+    LogProxy log = LogProxy.getInstance();
+    try {
+      AdapterFactory factory = AdapterFactory.getInstance();
+      return factory.getAdapter(current.getType());
+    } catch (NoSuchAdapterException e) {
+      log.addText(
+        ERROR,
+        "Invalid database type: ->" + current.getType() + "<-");
+    }
+    return null;
+  }
+  public void disconnect(Bookmark b) {
+    current = null;
+    LogProxy log = LogProxy.getInstance();
 
-                       } else {
-                               if (metadata) {
-                                       ResultSet set = stmt.getResultSet();
-                                       ResultSetMetaData metaData = set.getMetaData();
-                                       int columnCount = metaData.getColumnCount();
-                                       Vector columnNames = new Vector();
-                                       columnNames.addElement("ColumnName");
-                                       columnNames.addElement("Type");
-                                       columnNames.addElement("Size");
-                                       columnNames.addElement("Nullable");
-                                       columnNames.addElement("AutoIncrement");
-                                       results.setColumnNames(columnNames);
-                                       for (int i = 1; i <= columnCount; i++) {
-                                               Vector row = new Vector();
-                                               row.addElement(metaData.getColumnName(i));
-                                               row.addElement(metaData.getColumnTypeName(i));
-                                               int textSize = metaData.getColumnDisplaySize(i);
-                                               int precision = metaData.getPrecision(i);
-                                               int scale = metaData.getScale(i);
-                                               if (scale == 0 && precision == 0) {
-                                                       row.addElement(Integer.toString(precision));
-                                               } else {
-                                                       row.addElement(textSize + ", " + precision + ", " + scale);
-                                               }
-                                               int nullable = metaData.isNullable(i);
-                                               if (nullable == metaData.columnNoNulls) {
-                                                       row.addElement("Not Null");
-                                               } else if (nullable == metaData.columnNullable) {
-                                                       row.addElement("Nullable");
-                                               } else if (nullable == metaData.columnNullableUnknown) {
-                                                       row.addElement("Nullable");
-                                               } else {
-                                                       row.addElement("<Error>");
-                                               }
-                                               row.addElement(new Boolean(metaData.isAutoIncrement(i)).toString());
-                                               results.addRow(row);
-                                       }
-                                       results.setHasMore(false);
-                               } else {
-                                       ResultSet set = stmt.getResultSet();
-                                       ResultSetMetaData metaData = set.getMetaData();
-                                       int columnCount = metaData.getColumnCount();
-                                       Vector columnNames = new Vector();
-                                       for (int i = 1; i <= columnCount; i++) {
-                                               columnNames.addElement(metaData.getColumnName(i));
-                                       }
-                                       results.setColumnNames(columnNames);
-                                       Vector columnTypes = new Vector();
-                                       for (int i = 1; i <= columnCount; i++) {
-                                               columnTypes.addElement(metaData.getColumnTypeName(i));
-                                       }
-                                       results.setColumnsTypes(columnTypes);
-                                       int columnSizes[] = new int[columnCount];
-                                       for (int i = 1; i <= columnCount; i++) {
-                                               columnSizes[i - 1] = metaData.getColumnDisplaySize(i);
-                                       }
-                                       int rowCount = 1;
-                                       boolean exitEarly = false;
-                                       while (set.next()) {
-                                               boolean disable = startRow < 1 || endRow < 1;
-                                               boolean start = rowCount >= startRow;
-                                               boolean end = rowCount <= endRow;
-                                               if (disable || (start && end)) {
-                                                       Vector row = new Vector();
-                                                       for (int i = 1; i <= columnCount; i++) {
-                                                               String value;
-                                                               if (columnSizes[i - 1] < STREAM && columnSizes[i - 1] < maxLength) {
-                                                                       if (encoding.equals("")) {
-                                                                               value = set.getString(i);
-                                                                       } else {
-                                                                               value = new String(set.getBytes(i), encoding);
-                                                                       }
-                                                               } else {
-                                                                       try {
-                                                                               if (encoding.equals("")) {
-                                                                                       Reader reader = set.getCharacterStream(i);
-                                                                                       StringBuffer buffer = new StringBuffer();
-                                                                                       if (reader != null) {
-                                                                                               int retVal = reader.read();
-                                                                                               int count = 0;
-                                                                                               while (retVal >= 0) {
-                                                                                                       buffer.append((char) retVal);
-                                                                                                       retVal = reader.read();
-                                                                                                       count++;
-                                                                                                       if (count > maxLength) {
-                                                                                                               buffer.append("...>>>");
-                                                                                                               break;
-                                                                                                       }
-                                                                                               }
-                                                                                               reader.close();
-                                                                                       }
-                                                                                       value = buffer.toString();
-                                                                               } else {
-                                                                                       InputStream binaryStream = set.getBinaryStream(i);
-                                                                                       ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                                                                                       if (binaryStream != null) {
-                                                                                               int retVal = binaryStream.read();
-                                                                                               int count = 0;
-                                                                                               while (retVal >= 0) {
-                                                                                                       baos.write(retVal);
-                                                                                                       retVal = binaryStream.read();
-                                                                                                       count++;
-                                                                                                       if (count > maxLength) {
-                                                                                                               break;
-                                                                                                       }
-                                                                                               }
-                                                                                               binaryStream.close();
-                                                                                       }
-                                                                                       value = new String(baos.toByteArray(), encoding);
-                                                                               }
-                                                                       } catch (Throwable e) {
-                                                                               // hack for mysql which doesn't implement
-                                                                               // character streams
-                                                                               value = set.getString(i);
-                                                                       }
-                                                               }
-                                                               if (set.wasNull()) {
-                                                                       row.addElement("<NULL>");
-                                                               } else {
-                                                                       row.addElement(value);
-                                                               }
-                                                       }
-                                                       results.addRow(row);
-                                               }
-                                               rowCount++;
-                                               if (!disable && (rowCount > endRow)) {
-                                                       exitEarly = true;
-                                                       break;
-                                               }
-                                       }
-                                       if (exitEarly) {
-                                               results.setHasMore(set.next());
-                                       } else {
-                                               results.setMaxSize(rowCount);
-                                               results.setHasMore(false);
-                                       }
-                               }
-                               log.addText(log.RESULTS, "Success: result set displayed");
-                       }
-                       stmt.close();
-                       System.out.println("Executed");
-                       System.out.println();
-               } catch (Exception e) {
-                       results.setIsError(true);
-                       log.addText(log.ERROR, "Error occured: " + e);
-                       StringWriter writer = new StringWriter();
-                       e.printStackTrace(new PrintWriter(writer));
-                       log.addText(
-                               log.ERROR,
-                               writer.toString());
-               }
-               return results;
-       }
+    try {
+      con.close();
+      con = null;
+      log.addText(RESULTS, "Disconnected from: " + b.getName());
+    } catch (Exception e) {
+      log.addText(
+        ERROR,
+        "Error Disonnecting to: " + b.getName() + ":" + e.toString());
+      StringWriter writer = new StringWriter();
+      e.printStackTrace(new PrintWriter(writer));
+      log.addText(ERROR, writer.toString());
+
+    }
+  }
+  public void shutdown() {
+    LogProxy log = LogProxy.getInstance();
+    try {
+      if (con != null) {
+        con.close();
+      }
+      con = null;
+    } catch (SQLException e) {
+      StringWriter writer = new StringWriter();
+      e.printStackTrace(new PrintWriter(writer));
+      log.addText(ERROR, writer.toString());
+    }
+  }
+
+  public void dumpDatabaseData() {
+    LogProxy log = LogProxy.getInstance();
+    try {
+      DatabaseMetaData metadata = con.getMetaData();
+      log.addText(
+        WARNING,
+        "[METADATA] Database type: " + metadata.getDatabaseProductName());
+      if (metadata.supportsCatalogsInDataManipulation()) {
+        log.addText(
+          WARNING,
+          "[METADATA] Database does support catalog in data manipulation");
+      } else {
+        log.addText(
+          WARNING,
+          "[METADATA] Database does not support catalog in data manipulation");
+      }
+      if (metadata.supportsSchemasInDataManipulation()) {
+        log.addText(
+          WARNING,
+          "[METADATA] Database does support schema in data manipulation");
+      } else {
+        log.addText(
+          WARNING,
+          "[METADATA] Database does not support schema in data manipulation");
+      }
+      if (metadata.supportsCatalogsInTableDefinitions()) {
+        log.addText(
+          WARNING,
+          "[METADATA] Database does support catalogs in table definitions");
+      } else {
+        log.addText(
+          WARNING,
+          "[METADATA] Database does not support catalogs in table definitions");
+      }
+      log.addText(
+        WARNING,
+        "[METADATA] Catalog Separator: " + metadata.getCatalogSeparator());
+      log.addText(
+        WARNING,
+        "[METADATA] Catalog Term: " + metadata.getCatalogTerm());
+      ResultSet set = metadata.getCatalogs();
+      ArrayList catalogList = new ArrayList();
+      catalogList.add(null);
+      while (set.next()) {
+        catalogList.add(set.getString(1));
+      }
+      set.close();
+      StringBuffer catalogOutput = new StringBuffer();
+      catalogOutput.append("[CATALOG LIST] [");
+      for (int i = 0; i < catalogList.size(); i++) {
+        String name = (String) catalogList.get(i);
+        catalogOutput.append(name + ", ");
+      }
+      catalogOutput.append("]");
+      log.addText(WARNING, catalogOutput.toString());
+
+      set = metadata.getSchemas();
+      ArrayList schemaList = new ArrayList();
+      schemaList.add("");
+      while (set.next()) {
+        schemaList.add(set.getString(1));
+      }
+      set.close();
+      StringBuffer schemaOutput = new StringBuffer();
+      schemaOutput.append("[SCHEMA LIST] [");
+      for (int i = 0; i < schemaList.size(); i++) {
+        String name = (String) schemaList.get(i);
+        schemaOutput.append(name + ", ");
+      }
+      schemaOutput.append("]");
+      log.addText(WARNING, schemaOutput.toString());
+
+      ArrayList tableTypes = new ArrayList();
+      set = metadata.getTableTypes();
+      while (set.next()) {
+        tableTypes.add(set.getString(1));
+      }
+      set.close();
+
+      StringBuffer tableListOutput = new StringBuffer();
+      tableListOutput.append("[TABLE LIST] [");
+      for (int i = 0; i < tableTypes.size(); i++) {
+        String name = (String) tableTypes.get(i);
+        tableListOutput.append(name + ", ");
+      }
+      tableListOutput.append("]");
+      log.addText(WARNING, tableListOutput.toString());
+
+    } catch (Exception e) {
+      log.addText(ERROR, "Error occured: " + e);
+      StringWriter writer = new StringWriter();
+      e.printStackTrace(new PrintWriter(writer));
+      log.addText(ERROR, writer.toString());
+    }
+  }
+  /**
+   * type = "TABLE" "VIEW" "SEQUENCE"
+   */
+  public Vector listTables(String schema, String type) {
+    LogProxy log = LogProxy.getInstance();
+    Vector retVal = new Vector();
+    log.addText(QUERY, "Retrieving list [" + type + "]");
+    try {
+      DatabaseMetaData meta = con.getMetaData();
+      ResultSet set = meta.getTableTypes();
+      int columnCount = set.getMetaData().getColumnCount();
+      if (DEBUG) {
+        for (int i = 1; i <= columnCount; i++) {
+          System.out.print(set.getMetaData().getColumnName(i) + "\t");
+        }
+        System.out.println();
+        while (set.next()) {
+          for (int i = 1; i <= columnCount; i++) {
+            System.out.print(set.getString(i) + "\t");
+          }
+          System.out.println();
+        }
+      }
+      Vector types = new Vector();
+      set = meta.getTableTypes();
+      while (set.next()) {
+        types.add(set.getString(1));
+      }
+      set.close();
+      if (types.contains(type)) {
+        set = meta.getTables(null, schema, "%", new String[] { type });
+        while (set.next()) {
+          String name = set.getString("TABLE_NAME");
+          String tableType = set.getString("TABLE_TYPE");
+          //System.out.println(name + ":" + tableType);
+          retVal.addElement(name);
+        }
+        set.close();
+      }
+      log.addText(RESULTS, "Success");
+    } catch (SQLException e) {
+      log.addText(ERROR, "Error occured: " + e);
+      StringWriter writer = new StringWriter();
+      e.printStackTrace(new PrintWriter(writer));
+      log.addText(ERROR, writer.toString());
+    }
+    return retVal;
+  }
+  public boolean connect(Bookmark b) {
+    LogProxy log = LogProxy.getInstance();
+    log.addText(QUERY, "Connecting to: " + b.getName());
+    URL urls[] = new URL[1];
+    try {
+      String driverFile = b.getDriverFile();
+      URLClassLoader loader = (URLClassLoader) classLoaderCache.get(driverFile);
+      if (loader == null) {
+        urls[0] = new File(driverFile).toURL();
+        loader = new URLClassLoader(urls);
+        classLoaderCache.put(driverFile, loader);
+        if (DEBUG) {
+          System.out.println("Creating new classloader");
+        }
+      } else {
+        if (DEBUG) {
+          System.out.println("Using classloader in cache");
+        }
+      }
+      Class driverClass = loader.loadClass(b.getDriver());
+      Driver driver = (Driver) driverClass.newInstance();
+      Properties props = new Properties();
+      props.put(USERNAME, b.getUsername());
+      props.put(PASSWORD, b.getPassword());
+      con = driver.connect(b.getConnect(), props);
+      if (con == null) {
+        throw new Exception(
+          "Error: Driver returned a null connection: " + b.toString());
+      }
+      current = b;
+      log.addText(RESULTS, "Connected to: " + b.getName());
+      if (DEBUG) {
+        System.out.println("Connected");
+      }
+      return true;
+    } catch (Exception e) {
+      log.addText(
+        ERROR,
+        "Error Connecting to: " + b.getName() + ":" + e.toString());
+      StringWriter writer = new StringWriter();
+      e.printStackTrace(new PrintWriter(writer));
+      log.addText(ERROR, writer.toString());
+    }
+    return false;
+  }
+  public SQLResults execute(String s) {
+    return execute(s, -1, -1);
+  }
+  public SQLResults execute(String s, int startRow, int endRow) {
+    return execute(s, -1, -1, Integer.MAX_VALUE);
+  }
+  public SQLResults execute(
+    String s,
+    int startRow,
+    int endRow,
+    int maxLength) {
+    return execute(s, startRow, endRow, maxLength, "");
+  }
+  public SQLResults execute(
+    String s,
+    int startRow,
+    int endRow,
+    int maxLength,
+    String encoding) {
+    SQLResults results = new SQLResults();
+
+    if (DEBUG) {
+      System.out.println("Executing");
+    }
+    LogProxy log = LogProxy.getInstance();
+    log.addText(QUERY, "Executing Request [" + s + "]");
+    boolean metadata = false;
+    if (s.startsWith("METADATA")) {
+      metadata = true;
+    }
+    if (metadata) {
+      results.setQuery(s);
+      String table = s.substring(s.indexOf(':') + 1);
+      String schema = current.getSchema();
+      String query = "SELECT * FROM " + schema + "." + table;
+      if (schema.equals("")) {
+        query = "SELECT * FROM " + table;
+      }
+      s = query;
+      log.addText(QUERY, "Metadata Request [" + s + "]");
+    } else {
+      results.setQuery(s);
+    }
+    try {
+      Statement stmt = con.createStatement();
+      boolean flag = stmt.execute(s);
+      results.setResultSet(flag);
+      if (!flag) {
+        int updates = stmt.getUpdateCount();
+        results.setUpdateCount(updates);
+        log.addText(RESULTS, "Success: " + updates + " records updated");
+
+      } else {
+        if (metadata) {
+          ResultSet set = stmt.getResultSet();
+          ResultSetMetaData metaData = set.getMetaData();
+          int columnCount = metaData.getColumnCount();
+          Vector columnNames = new Vector();
+          columnNames.addElement("ColumnName");
+          columnNames.addElement("Type");
+          columnNames.addElement("Size");
+          columnNames.addElement("Nullable");
+          columnNames.addElement("AutoIncrement");
+          results.setColumnNames(columnNames);
+          for (int i = 1; i <= columnCount; i++) {
+            Vector row = new Vector();
+            row.addElement(metaData.getColumnName(i));
+            row.addElement(metaData.getColumnTypeName(i));
+            int textSize = metaData.getColumnDisplaySize(i);
+            int precision = metaData.getPrecision(i);
+            int scale = metaData.getScale(i);
+            if (scale == 0 && precision == 0) {
+              row.addElement(Integer.toString(precision));
+            } else {
+              row.addElement(textSize + ", " + precision + ", " + scale);
+            }
+            int nullable = metaData.isNullable(i);
+            if (nullable == metaData.columnNoNulls) {
+              row.addElement("Not Null");
+            } else if (nullable == metaData.columnNullable) {
+              row.addElement("Nullable");
+            } else if (nullable == metaData.columnNullableUnknown) {
+              row.addElement("Nullable");
+            } else {
+              row.addElement("<Error>");
+            }
+            row.addElement(new Boolean(metaData.isAutoIncrement(i)).toString());
+            results.addRow(row);
+          }
+          results.setHasMore(false);
+        } else {
+          ResultSet set = stmt.getResultSet();
+          ResultSetMetaData metaData = set.getMetaData();
+          int columnCount = metaData.getColumnCount();
+          Vector columnNames = new Vector();
+          for (int i = 1; i <= columnCount; i++) {
+            columnNames.addElement(metaData.getColumnName(i));
+          }
+          results.setColumnNames(columnNames);
+          Vector columnTypes = new Vector();
+          for (int i = 1; i <= columnCount; i++) {
+            columnTypes.addElement(metaData.getColumnTypeName(i));
+          }
+          results.setColumnsTypes(columnTypes);
+          int columnSizes[] = new int[columnCount];
+          for (int i = 1; i <= columnCount; i++) {
+            columnSizes[i - 1] = metaData.getColumnDisplaySize(i);
+          }
+          int rowCount = 1;
+          boolean exitEarly = false;
+          while (set.next()) {
+            boolean disable = startRow < 1 || endRow < 1;
+            boolean start = rowCount >= startRow;
+            boolean end = rowCount <= endRow;
+            if (disable || (start && end)) {
+              Vector row = new Vector();
+              for (int i = 1; i <= columnCount; i++) {
+                String value;
+                if (columnSizes[i - 1] < STREAM
+                  && columnSizes[i - 1] < maxLength) {
+                  if (encoding.equals("")) {
+                    value = set.getString(i);
+                  } else {
+                    value = new String(set.getBytes(i), encoding);
+                  }
+                } else {
+                  try {
+                    if (encoding.equals("")) {
+                      Reader reader = set.getCharacterStream(i);
+                      StringBuffer buffer = new StringBuffer();
+                      if (reader != null) {
+                        int retVal = reader.read();
+                        int count = 0;
+                        while (retVal >= 0) {
+                          buffer.append((char) retVal);
+                          retVal = reader.read();
+                          count++;
+                          if (count > maxLength) {
+                            buffer.append("...>>>");
+                            break;
+                          }
+                        }
+                        reader.close();
+                      }
+                      value = buffer.toString();
+                    } else {
+                      InputStream binaryStream = set.getBinaryStream(i);
+                      ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                      if (binaryStream != null) {
+                        int retVal = binaryStream.read();
+                        int count = 0;
+                        while (retVal >= 0) {
+                          baos.write(retVal);
+                          retVal = binaryStream.read();
+                          count++;
+                          if (count > maxLength) {
+                            break;
+                          }
+                        }
+                        binaryStream.close();
+                      }
+                      value = new String(baos.toByteArray(), encoding);
+                    }
+                  } catch (Throwable e) {
+                    // hack for mysql which doesn't implement
+                    // character streams
+                    value = set.getString(i);
+                  }
+                }
+                if (set.wasNull()) {
+                  row.addElement("<NULL>");
+                } else {
+                  row.addElement(value);
+                }
+              }
+              results.addRow(row);
+            }
+            rowCount++;
+            if (!disable && (rowCount > endRow)) {
+              exitEarly = true;
+              break;
+            }
+          }
+          if (exitEarly) {
+            results.setHasMore(set.next());
+          } else {
+            results.setMaxSize(rowCount);
+            results.setHasMore(false);
+          }
+        }
+        log.addText(RESULTS, "Success: result set displayed");
+      }
+      stmt.close();
+      if (DEBUG) {
+        System.out.println("Executed");
+        System.out.println();
+      }
+    } catch (Exception e) {
+      results.setIsError(true);
+      log.addText(ERROR, "Error occured: " + e);
+      StringWriter writer = new StringWriter();
+      e.printStackTrace(new PrintWriter(writer));
+      log.addText(ERROR, writer.toString());
+    }
+    return results;
+  }
 }