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;
+ }
}