Revision: 6622
http://squirrel-sql.svn.sourceforge.net/squirrel-sql/?rev=6622&view=rev
Author: umlawren
Date: 2012-05-16 05:00:49 +0000 (Wed, 16 May 2012)
Log Message:
-----------
Updated MultiSource Plugin by cleaning/documenting code, converting documentation to HTML, and including unityjdbc.jar.
Modified Paths:
--------------
trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiAddSourceAction.java
trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiAliasChooser.java
trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiExportAction.java
trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRemoveFieldAction.java
trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRemoveSourceAction.java
trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRemoveTableAction.java
trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRenameFieldAction.java
trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRenameSourceAction.java
trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRenameTableAction.java
trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiSourcePlugin.java
Added Paths:
-----------
trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiSqlExecutionListener.java
trunk/sql12/plugins/multisource/src/main/resources/doc/img/
trunk/sql12/plugins/multisource/src/main/resources/doc/img/add_alias_prompt.png
trunk/sql12/plugins/multisource/src/main/resources/doc/img/add_mssql.png
trunk/sql12/plugins/multisource/src/main/resources/doc/img/add_mysql.png
trunk/sql12/plugins/multisource/src/main/resources/doc/img/add_oracle.png
trunk/sql12/plugins/multisource/src/main/resources/doc/img/add_oracle_with_schema.png
trunk/sql12/plugins/multisource/src/main/resources/doc/img/add_postgres.png
trunk/sql12/plugins/multisource/src/main/resources/doc/img/after_add_mssql.png
trunk/sql12/plugins/multisource/src/main/resources/doc/img/before_add_mssql.png
trunk/sql12/plugins/multisource/src/main/resources/doc/img/create_unity.png
trunk/sql12/plugins/multisource/src/main/resources/doc/img/example_four_sources.png
trunk/sql12/plugins/multisource/src/main/resources/doc/img/install_after_unzip.png
trunk/sql12/plugins/multisource/src/main/resources/doc/img/install_before_unzip.png
trunk/sql12/plugins/multisource/src/main/resources/doc/img/register_driver.png
trunk/sql12/plugins/multisource/src/main/resources/doc/img/trim_translation_example.png
trunk/sql12/plugins/multisource/src/main/resources/doc/img/two_source_join.png
trunk/sql12/plugins/multisource/src/main/resources/doc/readme.html
trunk/sql12/plugins/multisource/src/main/resources/doc/unityjdbc.jar
Removed Paths:
-------------
trunk/sql12/plugins/multisource/src/main/resources/doc/MultipleSourcePlugin_for_SQuirreL_UserManual.pdf
Property Changed:
----------------
trunk/sql12/plugins/multisource/
Property changes on: trunk/sql12/plugins/multisource
___________________________________________________________________
Added: svn:ignore
+ target
.classpath
.project
.settings
Modified: trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiAddSourceAction.java
===================================================================
--- trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiAddSourceAction.java 2012-05-15 20:38:11 UTC (rev 6621)
+++ trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiAddSourceAction.java 2012-05-16 05:00:49 UTC (rev 6622)
@@ -11,7 +11,7 @@
import net.sourceforge.squirrel_sql.fw.util.Resources;
/**
- * Menu item that allows user to add a source to the integrated, global view.
+ * Menu item that allows the user to add a source to the integrated, global view.
*/
public class MultiAddSourceAction extends SquirrelAction {
private static final long serialVersionUID = 1L;
@@ -24,37 +24,35 @@
}
/**
- * The add source action retrieves a list of all existing aliases that are not virtual (have unity in the URL) then
- * allows the user to select one of them in a dialog. If a source is selected, it is added to the virtual view
- * and the object tree is updated.
+ * The add source action retrieves a list of all existing aliases that are
+ * not virtual (have unity in the URL) then allows the user to select one of
+ * them in a dialog. If a source is selected, it is added to the virtual
+ * view and the object tree is updated.
*/
public void actionPerformed(ActionEvent evt) {
- try {
+ try {
// List all the aliases in the system (then have user pick one).
- Iterator<ISQLAlias> iterator = _session.getApplication().getDataCache().aliases();
+ Iterator<ISQLAlias> iterator = _session.getApplication().getDataCache().aliases();
ArrayList<ISQLAlias> aliasList = new ArrayList<ISQLAlias>();
- while (iterator.hasNext())
- { ISQLAlias alias = iterator.next();
- if (alias.getUrl().toLowerCase().indexOf("jdbc:unity") < 0)
- {
+ while (iterator.hasNext()) {
+ ISQLAlias alias = iterator.next();
+ if (alias.getUrl().toLowerCase().indexOf("jdbc:unity") < 0) {
aliasList.add(alias);
}
}
- if (aliasList.size() > 0)
- { // Must have at least one alias source defined
+ if (aliasList.size() > 0) {
+ // Must have at least one alias source defined
// Put up window to select an alias
MultiAliasChooser dialog = new MultiAliasChooser(this._app, _session, aliasList);
ISQLAlias selected = dialog.showDialog();
- if (selected != null)
- { // Added a source
- // Update object tree information
+ if (selected != null) {
+ // Added a source. Update object tree information
MultiSourcePlugin.updateSession(_session);
}
- }
+ }
} catch (Exception e) {
throw new RuntimeException(e);
}
}
-
}
Modified: trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiAliasChooser.java
===================================================================
--- trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiAliasChooser.java 2012-05-15 20:38:11 UTC (rev 6621)
+++ trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiAliasChooser.java 2012-05-16 05:00:49 UTC (rev 6622)
@@ -17,10 +17,7 @@
import javax.swing.JTextField;
import net.sourceforge.squirrel_sql.client.IApplication;
-import net.sourceforge.squirrel_sql.client.gui.session.SessionInternalFrame;
-import net.sourceforge.squirrel_sql.client.session.IObjectTreeAPI;
import net.sourceforge.squirrel_sql.client.session.ISession;
-import net.sourceforge.squirrel_sql.client.session.action.RefreshObjectTreeCommand;
import net.sourceforge.squirrel_sql.fw.gui.Dialogs;
import net.sourceforge.squirrel_sql.fw.gui.GUIUtils;
import net.sourceforge.squirrel_sql.fw.id.IIdentifier;
@@ -33,10 +30,10 @@
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
/**
- * A dialog that allows a user to select an existing alias to add to the virtualization.
+ * A dialog that allows a user to select an existing alias to add to the
+ * virtualization.
*/
-public class MultiAliasChooser extends JDialog
-{
+public class MultiAliasChooser extends JDialog {
private static final long serialVersionUID = 1L;
/** Internationalized strings for this class. */
@@ -51,8 +48,7 @@
private IApplication _app;
private ISession _session;
- public MultiAliasChooser(IApplication app, ISession session, ArrayList<ISQLAlias> aliasList)
- {
+ public MultiAliasChooser(IApplication app, ISession session, ArrayList<ISQLAlias> aliasList) {
super((Frame) null, s_stringMgr.getString("MultiAliasChooser.title"), true);
setSize(300, 200);
_aliasList = aliasList;
@@ -64,8 +60,7 @@
/**
* Show dialog.
*/
- public ISQLAlias showDialog()
- {
+ public ISQLAlias showDialog() {
setVisible(true);
return _selectedAlias;
}
@@ -73,18 +68,18 @@
/**
* Builds the components of the dialog.
*/
- private void createUserInterface()
- {
+ private void createUserInterface() {
Container contentPane = getContentPane();
- JPanel content = new JPanel(new GridLayout(4,1));
+ JPanel content = new JPanel(new GridLayout(4, 1));
+ // Alias combobox and label
content.add(new JLabel(s_stringMgr.getString("MultiAliasChooser.prompt"), JLabel.LEFT));
-
_aliasCbx = new JComboBox(_aliasList.toArray());
- _aliasCbx.setMaximumRowCount(5); // Display up to 5 rows without a scrollbar
-
+ _aliasCbx.setMaximumRowCount(5); // Display up to 5 rows without a scrollbar
content.add(_aliasCbx);
+
+ // Name textbox and label
JPanel namePanel = new JPanel();
namePanel.add(new JLabel(s_stringMgr.getString("MultiAliasChooser.name"), JLabel.LEFT));
_nameTxt = new JTextField(15);
@@ -92,19 +87,19 @@
namePanel.add(_nameTxt);
content.add(namePanel);
+ // Schema textbox and label
JPanel schemaPanel = new JPanel();
schemaPanel.add(new JLabel(s_stringMgr.getString("MultiAliasChooser.schema"), JLabel.LEFT));
_schemaTxt = new JTextField(15);
schemaPanel.add(_schemaTxt);
content.add(schemaPanel);
-
contentPane.add(content, "Center");
+ // Buttons
contentPane.add(createButtonsPanel(), "South");
- _aliasCbx.addActionListener(new ActionListener(){
- public void actionPerformed(ActionEvent evt)
- {
+ _aliasCbx.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent evt) {
_sourceName = ((ISQLAlias) _aliasCbx.getSelectedItem()).getName();
_nameTxt.setText(_sourceName);
}
@@ -114,77 +109,27 @@
setResizable(false);
}
- private JPanel createButtonsPanel()
- {
+ /**
+ * Creates OK and Cancel buttons with action events.
+ * @return
+ */
+ private JPanel createButtonsPanel() {
JPanel pnl = new JPanel();
+ // OK button
JButton okBtn = new JButton(s_stringMgr.getString("MultiAliasChooser.ok"));
- okBtn.addActionListener(new ActionListener()
- {
- public void actionPerformed(ActionEvent evt)
- {
- // Do positive action
- ISQLAlias alias = (ISQLAlias) _aliasCbx.getSelectedItem();
- MultiAliasChooser.this._selectedAlias = alias;
- _sourceName = _nameTxt.getText();
- if (_sourceName.contains(" "))
- { Dialogs.showOk(_nameTxt.getParent().getParent(), "Source name cannot contain spaces.");
+ okBtn.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent evt) {
+ if (!executeAddSource())
return;
- }
- String schemaName = _schemaTxt.getText();
- if (schemaName.trim().equals(""))
- schemaName = null;
-
- try
- {
- // Verify that source name is not a duplicate
- Object schema = MultiSourcePlugin.getSchema(_session.getSQLConnection().getConnection());
- Method getDBMethod = schema.getClass().getMethod("getDB", new Class[]{java.lang.String.class});
- Object result = getDBMethod.invoke(schema, new Object[]{_sourceName});
-
- if (result != null)
- { Dialogs.showOk(_nameTxt.getParent().getParent(), "Source name already exists in virtualization. Select a different name.");
- return;
- }
-
- // Now actually do extract with this information
- ClassLoader loader = _session.getSQLConnection().getConnection().getClass().getClassLoader();
- Object extractor = Class.forName("com.unityjdbc.sourcebuilder.AnnotatedExtractor", true, loader).newInstance();
-
- // Create connection
- SQLDriverManager dm = _app.getSQLDriverManager();
- IIdentifier driverID = alias.getDriverIdentifier();
- ISQLDriver driver = _app.getDataCache().getDriver(driverID);
- ISQLConnection con = dm.getConnection(driver, alias, alias.getUserName(), alias.getPassword(), alias.getDriverPropertiesClone());
-
- ClassLoader newSourceLoader = new SQLDriverClassLoader(driver);
-
- Method meth = extractor.getClass().getMethod("extract", new Class[]{java.lang.String.class, java.lang.String.class, java.lang.String.class,
- java.lang.String.class, java.util.Properties.class, java.lang.String.class, java.lang.String.class, java.sql.Connection.class, java.lang.ClassLoader.class});
-
- Connection c = con.getConnection();
- Object asd = meth.invoke(extractor, new Object[]{driver.getDriverClassName(), alias.getUrl(), alias.getUserName(), alias.getPassword(), null,
- _sourceName, schemaName, c, newSourceLoader});
-
- // Add new database to schema
- Method addSourceMethod = schema.getClass().getMethod("addDatabase", new Class[]{asd.getClass()});
- addSourceMethod.invoke(schema, new Object[]{asd});
-
- MultiSourcePlugin.refreshTree(_session);
- }
- catch (Exception e)
- {
- Dialogs.showOk(_nameTxt.getParent().getParent(), "Error during extraction: "+e);
- return;
- }
dispose();
}
});
+
+ // Cancel button
JButton cancelBtn = new JButton(s_stringMgr.getString("MultiAliasChooser.cancel"));
- cancelBtn.addActionListener(new ActionListener()
- {
- public void actionPerformed(ActionEvent evt)
- {
+ cancelBtn.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent evt) {
MultiAliasChooser.this._selectedAlias = null;
dispose();
}
@@ -198,4 +143,69 @@
return pnl;
}
+
+ /**
+ * Adds the selected source to the virtualization.
+ * Uses reflection to call methods of the UnityJDBC driver.
+ */
+ private boolean executeAddSource() {
+ ISQLAlias alias = (ISQLAlias) _aliasCbx.getSelectedItem();
+ MultiAliasChooser.this._selectedAlias = alias;
+
+ // Verify correct format of source name (no spaces, etc.)
+ _sourceName = _nameTxt.getText();
+ if (_sourceName.contains(" ")) {
+ Dialogs.showOk(_nameTxt.getParent().getParent(), "Source name cannot contain spaces.");
+ return false;
+ }
+
+ // Retrieve schema name if it exists
+ String schemaName = _schemaTxt.getText();
+ if (schemaName.trim().equals(""))
+ schemaName = null;
+
+ try {
+ // Verify that source name is not a duplicate
+ Object schema = MultiSourcePlugin.getSchema(_session.getSQLConnection().getConnection());
+ Method getDBMethod = schema.getClass().getMethod("getDB", new Class[] { java.lang.String.class });
+ Object result = getDBMethod.invoke(schema, new Object[] { _sourceName });
+
+ if (result != null) {
+ Dialogs.showOk(_nameTxt.getParent().getParent(), "Source name already exists in virtualization. Select a different name.");
+ return false;
+ }
+
+ // Now actually do extract with this information
+ ClassLoader loader = _session.getSQLConnection().getConnection().getClass().getClassLoader();
+ Object extractor = Class.forName("com.unityjdbc.sourcebuilder.AnnotatedExtractor", true, loader).newInstance();
+
+ // Create connection
+ SQLDriverManager dm = _app.getSQLDriverManager();
+ IIdentifier driverID = alias.getDriverIdentifier();
+ ISQLDriver driver = _app.getDataCache().getDriver(driverID);
+ ISQLConnection con = dm.getConnection(driver, alias, alias.getUserName(), alias.getPassword(), alias.getDriverPropertiesClone());
+
+ ClassLoader newSourceLoader = new SQLDriverClassLoader(driver);
+
+ Method meth = extractor.getClass().getMethod("extract", new Class[] { java.lang.String.class, java.lang.String.class,
+ java.lang.String.class, java.lang.String.class,
+ java.util.Properties.class, java.lang.String.class,
+ java.lang.String.class, java.sql.Connection.class,
+ java.lang.ClassLoader.class });
+
+ Connection c = con.getConnection();
+ Object asd = meth.invoke(extractor, new Object[] { driver.getDriverClassName(), alias.getUrl(), alias.getUserName(), alias.getPassword(), null,
+ _sourceName, schemaName, c, newSourceLoader });
+
+ // Add new database to schema
+ Method addSourceMethod = schema.getClass().getMethod("addDatabase", new Class[] { asd.getClass() });
+ addSourceMethod.invoke(schema, new Object[] { asd });
+
+ MultiSourcePlugin.refreshTree(_session);
+ } catch (Exception e) {
+ Dialogs.showOk(_nameTxt.getParent().getParent(), "Error during extraction: "+ e);
+ return false;
+ }
+ return true;
+ }
}
Modified: trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiExportAction.java
===================================================================
--- trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiExportAction.java 2012-05-15 20:38:11 UTC (rev 6621)
+++ trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiExportAction.java 2012-05-16 05:00:49 UTC (rev 6622)
@@ -31,14 +31,12 @@
chooser.setFileFilter(filter);
chooser.setDialogTitle("Select location to save virtualization configuration file");
int returnVal = chooser.showSaveDialog(_session.getApplication().getMainFrame());
- if(returnVal == JFileChooser.APPROVE_OPTION) {
+ if (returnVal == JFileChooser.APPROVE_OPTION) {
String sourcesFileName = chooser.getSelectedFile().getName();
MultiSourcePlugin.export(sourcesFileName, _session);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
- }
-
-
+ }
}
Modified: trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRemoveFieldAction.java
===================================================================
--- trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRemoveFieldAction.java 2012-05-15 20:38:11 UTC (rev 6621)
+++ trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRemoveFieldAction.java 2012-05-16 05:00:49 UTC (rev 6622)
@@ -8,9 +8,7 @@
import net.sourceforge.squirrel_sql.fw.util.Resources;
/**
- * Menu item that allows user to add source to integrated, global view.
- * @author rlawrenc
- *
+ * Menu item that allows user to add source to integrated, virtual view.
*/
public class MultiRemoveFieldAction extends SquirrelAction {
private static final long serialVersionUID = 1L;
@@ -28,6 +26,5 @@
} catch (Exception e) {
throw new RuntimeException(e);
}
- }
-
+ }
}
Modified: trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRemoveSourceAction.java
===================================================================
--- trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRemoveSourceAction.java 2012-05-15 20:38:11 UTC (rev 6621)
+++ trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRemoveSourceAction.java 2012-05-16 05:00:49 UTC (rev 6622)
@@ -15,7 +15,7 @@
import net.sourceforge.squirrel_sql.fw.util.Resources;
/**
- * Menu item that allows user to remove a source from the integrated view.
+ * Menu item that allows user to remove a source from the virtual view.
*/
public class MultiRemoveSourceAction extends SquirrelAction {
private static final long serialVersionUID = 1L;
@@ -27,6 +27,9 @@
_session = session;
}
+ /**
+ * Removes a source from the virtual view.
+ */
public void actionPerformed(ActionEvent evt) {
try {
SessionInternalFrame sessMainFrm = _session.getSessionInternalFrame();
Modified: trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRemoveTableAction.java
===================================================================
--- trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRemoveTableAction.java 2012-05-15 20:38:11 UTC (rev 6621)
+++ trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRemoveTableAction.java 2012-05-16 05:00:49 UTC (rev 6622)
@@ -15,7 +15,7 @@
import net.sourceforge.squirrel_sql.fw.util.Resources;
/**
- * Menu item that allows user to remove a table from the integrated view.
+ * Menu item that allows user to remove a table from the virtual view.
*/
public class MultiRemoveTableAction extends SquirrelAction {
private static final long serialVersionUID = 1L;
@@ -34,8 +34,7 @@
List<ITableInfo> tables = otree.getSelectedTables();
// Only allow delete of one table regardless of how many are selected
- if (tables.size() > 0)
- {
+ if (tables.size() > 0) {
ITableInfo ti = (ITableInfo) tables.get(0);
String sourceName = ti.getSchemaName();
String tableName = ti.getSimpleName();
@@ -44,8 +43,7 @@
Object gs = MultiSourcePlugin.getSchema(con); // Invoke Get Global Schema Method using Reflection
removeTable(sourceName, tableName, gs);
otree.removeNodes(otree.getSelectedNodes());
- MultiSourcePlugin.updateSession(_session);
-
+ MultiSourcePlugin.updateSession(_session);
}
} catch (Exception e) {
throw new RuntimeException(e);
Modified: trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRenameFieldAction.java
===================================================================
--- trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRenameFieldAction.java 2012-05-15 20:38:11 UTC (rev 6621)
+++ trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRenameFieldAction.java 2012-05-16 05:00:49 UTC (rev 6622)
@@ -9,9 +9,7 @@
import net.sourceforge.squirrel_sql.fw.util.Resources;
/**
- * Menu item that allows user to add source to integrated, global view.
- * @author rlawrenc
- *
+ * Menu item that allows user to rename a field in the virtual view.
*/
public class MultiRenameFieldAction extends SquirrelAction {
private static final long serialVersionUID = 1L;
@@ -27,10 +25,7 @@
try {
// TODO: Not implemented yet.
- SessionInternalFrame sessMainFrm = _session.getSessionInternalFrame();
-
- sessMainFrm.getSQLPanelAPI().appendSQLScript("RENAME FIELD!");
- sessMainFrm.getSessionPanel().selectMainTab(ISession.IMainPanelTabIndexes.SQL_TAB);
+ SessionInternalFrame sessMainFrm = _session.getSessionInternalFrame();
} catch (Exception e) {
throw new RuntimeException(e);
}
Modified: trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRenameSourceAction.java
===================================================================
--- trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRenameSourceAction.java 2012-05-15 20:38:11 UTC (rev 6621)
+++ trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRenameSourceAction.java 2012-05-16 05:00:49 UTC (rev 6622)
@@ -13,9 +13,7 @@
import net.sourceforge.squirrel_sql.fw.util.Resources;
/**
- * Menu item that allows user to rename a source in the integrated view.
- * @author rlawrenc
- *
+ * Menu item that allows user to rename a source in the virtual view.
*/
public class MultiRenameSourceAction extends SquirrelAction {
private static final long serialVersionUID = 1L;
@@ -34,8 +32,7 @@
IDatabaseObjectInfo[] dbObjs = otree.getSelectedDatabaseObjects();
// Only allow renaming of one source regardless how many are selected
- if (dbObjs.length > 0)
- {
+ if (dbObjs.length > 0) {
DatabaseObjectInfo di = (DatabaseObjectInfo) dbObjs[0];
String sourceName = di.getSimpleName();
@@ -56,6 +53,5 @@
public void renameSource(String sourceName, Object gs)
{
// TODO: Not implemented yet.
- }
-
+ }
}
Modified: trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRenameTableAction.java
===================================================================
--- trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRenameTableAction.java 2012-05-15 20:38:11 UTC (rev 6621)
+++ trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiRenameTableAction.java 2012-05-16 05:00:49 UTC (rev 6622)
@@ -11,7 +11,7 @@
import net.sourceforge.squirrel_sql.fw.util.Resources;
/**
- * Menu item that allows user to rename a table in the integrated view.
+ * Menu item that allows user to rename a table in the virtual view.
*/
public class MultiRenameTableAction extends SquirrelAction {
private static final long serialVersionUID = 1L;
Modified: trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiSourcePlugin.java
===================================================================
--- trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiSourcePlugin.java 2012-05-15 20:38:11 UTC (rev 6621)
+++ trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiSourcePlugin.java 2012-05-16 05:00:49 UTC (rev 6622)
@@ -25,7 +25,9 @@
import net.sourceforge.squirrel_sql.fw.sql.DatabaseObjectType;
import net.sourceforge.squirrel_sql.fw.sql.ISQLAlias;
import net.sourceforge.squirrel_sql.fw.util.FileWrapper;
+import net.sourceforge.squirrel_sql.fw.util.IMessageHandler;
+
/**
* MultiSourcePlugin allows a user to query multiple databases with one query.
*/
@@ -33,7 +35,8 @@
{
private PluginResources _resources;
private static FileWrapper _userSettingsFolder;
-
+ private static boolean isTrial;
+
/**
* Return the internal name of this plugin.
*
@@ -51,7 +54,7 @@
*/
public String getDescriptiveName()
{
- return "MultiSource Plugin";
+ return "MultiSource Virtualization Plugin";
}
/**
@@ -93,7 +96,7 @@
*/
public String getHelpFileName()
{
- return "readme.txt";
+ return "readme.html";
}
/**
@@ -131,8 +134,7 @@
public synchronized void initialize() throws PluginException
{
_resources = new PluginResources("net.sourceforge.squirrel_sql.plugins.multisource.multisource", this);
- try
- {
+ try {
_userSettingsFolder = getPluginUserSettingsFolder(); // Retrieve the folder for user settings for storing connection info.
}
catch (Exception e)
@@ -160,32 +162,33 @@
if (dbName != null && dbName.contains("unity"))
{ // Add new popup menu options for a Unity session
- addTreeNodeMenuActions(session);
-
+ addTreeNodeMenuActions(session);
+
+ IMessageHandler messageHandler = session.getApplication().getMessageHandler();
+ MultiSqlExecutionListener sqlExecutionListener = new MultiSqlExecutionListener(messageHandler);
+
+ session.getSessionSheet().getSQLPaneAPI().addSQLExecutionListener(sqlExecutionListener);
+
// Load session configuration information if URL says virtual
- if (session.getAlias() != null)
- {
+ if (session.getAlias() != null) {
+ isTrial = MultiSourcePlugin.isTrial(session.getSQLConnection().getConnection());
String url = session.getAlias().getUrl();
- if (url.toLowerCase().indexOf("/virtual") > 0)
- { // Try to load based on session name
+ if (url.toLowerCase().indexOf("/virtual") > 0) {
+ // Try to load based on session name
+
Object schema = MultiSourcePlugin.getSchema(session.getSQLConnection().getConnection()); // Retrieve schema
- if (schema != null)
- {
- try
- {
- Method parseSourcesMethod = schema.getClass().getMethod("parseSourcesFile", new Class[]{java.io.BufferedReader.class, java.lang.String.class});
- String filePath = getSourceFilePath(session);
- System.out.println("LOad file: "+filePath);
- System.out.println("ID: "+session.getAlias().getIdentifier());
- BufferedReader reader = new BufferedReader(new FileReader(filePath));
- parseSourcesMethod.invoke(schema, new Object[]{reader, "jdbc:unity://"+filePath});
- // TODO: Not sure why these two lines below do not work.
- // IObjectTreeAPI otree = session.getSessionInternalFrame().getObjectTreeAPI();
- // otree.refreshTree();
- new UpdateThread(session).run(); // A poor solution to force the object tree to update after a slight delay
+ if (schema != null) {
+ try {
+ Method parseSourcesMethod = schema.getClass().getMethod("parseSourcesFile", new Class[]{java.io.BufferedReader.class, java.lang.String.class});
+ String filePath = getSourceFilePath(session);
+ BufferedReader reader = new BufferedReader(new FileReader(filePath));
+ parseSourcesMethod.invoke(schema, new Object[]{reader, "jdbc:unity://"+filePath});
+ // TODO: Not sure why these two lines below do not work.
+ // IObjectTreeAPI otree = session.getSessionInternalFrame().getObjectTreeAPI();
+ // otree.refreshTree();
+ new UpdateThread(session).run(); // A poor solution to force the object tree to update after a slight delay
}
- catch (Exception e)
- {
+ catch (Exception e) {
System.out.println(e);
}
}
@@ -281,6 +284,36 @@
}
/**
+ * Returns true if virtualization driver is run in trial mode.
+ * @param con
+ * @return
+ */
+ public static boolean isTrial(Connection con)
+ {
+ Class<? extends Connection> cls = con.getClass();
+
+ Object retobj;
+ try {
+ Method meth = cls.getMethod("isTrial", (Class[]) null);
+ retobj = meth.invoke(con, (Object[]) null);
+ return ((Boolean) retobj).booleanValue();
+ } catch (IllegalArgumentException e) {
+ throw new RuntimeException(e);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ } catch (InvocationTargetException e) {
+ throw new RuntimeException(e);
+ } catch (SecurityException e) {
+ throw new RuntimeException(e);
+ } catch (NoSuchMethodException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static boolean isTrial()
+ { return isTrial; }
+
+ /**
* Updates any session information including virtualization configuration files.
* @param session
*/
@@ -306,47 +339,45 @@
* @param sourcesFileName
* @param session
*/
- public static void export(String sourcesFileName, ISession session)
- {
+ public static void export(String sourcesFileName, ISession session) {
File f = new File(sourcesFileName);
- String path = f.getParent()+File.separator;
- // Make sure directory exists
- if (!f.getParentFile().exists())
- {
- f.getParentFile().mkdir();
- }
+ String path = f.getParent() + File.separator;
+ // Make sure directory exists
+ if (!f.getParentFile().exists()) {
+ f.getParentFile().mkdir();
+ }
- sourcesFileName = f.getName();
- String sourcesNoExt=sourcesFileName;
- int idx = sourcesFileName.indexOf(".xml");
- if (idx > 0)
- sourcesNoExt = sourcesFileName.substring(0, sourcesFileName.length()-4);
-
- Object schema = MultiSourcePlugin.getSchema(session.getSQLConnection().getConnection()); // Retrieve schema
+ sourcesFileName = f.getName();
+ String sourcesNoExt = sourcesFileName;
+ int idx = sourcesFileName.indexOf(".xml");
+ if (idx > 0)
+ sourcesNoExt = sourcesFileName.substring(0, sourcesFileName.length() - 4);
- try {
- // Each source schema file is prefixed with sources file name (no extension) plus source name.
- // Export schema files of each source first as each file location is needed in the sources file listing all sources.
- Method exportSourceMethod = schema.getClass().getMethod("exportSchema", new Class[]{java.lang.String.class});
- Method getDBsMethod = schema.getClass().getMethod("getAnnotatedDatabases", (Class[]) null);
- @SuppressWarnings("unchecked")
- ArrayList<Object> dbs = (ArrayList<Object>) getDBsMethod.invoke(schema, (Object[]) null);
- for (int i=0; i < dbs.size(); i++)
- { Object db = dbs.get(i);
- Method getDBNameMethod = db.getClass().getMethod("getDatabaseName", (Class[]) null);
- Method setDBSchemaMethod = db.getClass().getMethod("setSchemaFile", new Class[]{java.lang.String.class});
- String dbName = (String) getDBNameMethod.invoke(db, (Object[]) null);
- String fileName = sourcesNoExt+"_"+dbName+".xml";
- setDBSchemaMethod.invoke(db, new Object[]{fileName});
- String source = (String) exportSourceMethod.invoke(schema, new Object[]{dbName});
- writeToFile(path+fileName, source);
- }
+ Object schema = MultiSourcePlugin.getSchema(session.getSQLConnection().getConnection()); // Retrieve schema
- // Write out sources file
- Method exportSourcesMethod = schema.getClass().getMethod("exportSources", (Class[]) null);
- String sources = (String) exportSourcesMethod.invoke(schema, (Object[]) null);
- writeToFile(path+sourcesFileName, sources);
- } catch (Exception e) {
+ try {
+ // Each source schema file is prefixed with sources file name (no extension) plus source name.
+ // Export schema files of each source first as each file location is needed in the sources file listing all sources.
+ Method exportSourceMethod = schema.getClass().getMethod("exportSchema", new Class[] { java.lang.String.class });
+ Method getDBsMethod = schema.getClass().getMethod("getAnnotatedDatabases", (Class[]) null);
+ @SuppressWarnings("unchecked")
+ ArrayList<Object> dbs = (ArrayList<Object>) getDBsMethod.invoke(schema, (Object[]) null);
+ for (int i = 0; i < dbs.size(); i++) {
+ Object db = dbs.get(i);
+ Method getDBNameMethod = db.getClass().getMethod("getDatabaseName", (Class[]) null);
+ Method setDBSchemaMethod = db.getClass().getMethod("setSchemaFile", new Class[] { java.lang.String.class });
+ String dbName = (String) getDBNameMethod.invoke(db, (Object[]) null);
+ String fileName = sourcesNoExt + "_" + dbName + ".xml";
+ setDBSchemaMethod.invoke(db, new Object[] { fileName });
+ String source = (String) exportSourceMethod.invoke(schema, new Object[] { dbName });
+ writeToFile(path + fileName, source);
+ }
+
+ // Write out sources file
+ Method exportSourcesMethod = schema.getClass().getMethod("exportSources", (Class[]) null);
+ String sources = (String) exportSourcesMethod.invoke(schema, (Object[]) null);
+ writeToFile(path + sourcesFileName, sources);
+ } catch (Exception e) {
throw new RuntimeException(e);
}
}
Added: trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiSqlExecutionListener.java
===================================================================
--- trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiSqlExecutionListener.java (rev 0)
+++ trunk/sql12/plugins/multisource/src/main/java/net/sourceforge/squirrel_sql/plugins/multisource/MultiSqlExecutionListener.java 2012-05-16 05:00:49 UTC (rev 6622)
@@ -0,0 +1,50 @@
+package net.sourceforge.squirrel_sql.plugins.multisource;
+
+import net.sourceforge.squirrel_sql.client.session.event.SQLExecutionAdapter;
+import net.sourceforge.squirrel_sql.fw.util.IMessageHandler;
+
+/*
+ * Copyright (C) 2010 Rob Manning
+ * man...@us...
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/**
+ * A ISQLExecutionListener that displays the SQL that will display a notification if the virtualization is run in trial mode.
+ */
+public class MultiSqlExecutionListener extends SQLExecutionAdapter
+{
+ /** This is what gives the ability to print a message to the message panel */
+ private final IMessageHandler _messageHandler;
+
+ public MultiSqlExecutionListener(IMessageHandler messageHandler) {
+ _messageHandler = messageHandler;
+ }
+
+ @Override
+ public void statementExecuted(String sql) {
+ }
+
+ @Override
+ public String statementExecuting(String sql) {
+ return sql;
+ }
+
+ public void executionFinished() {
+ if (MultiSourcePlugin.isTrial())
+ _messageHandler.showMessage("UnityJDBC Virtualization Driver is running in trial mode. Results are limited to 100. More info at: www.unityjdbc.com.");
+ }
+}
Deleted: trunk/sql12/plugins/multisource/src/main/resources/doc/MultipleSourcePlugin_for_SQuirreL_UserManual.pdf
===================================================================
(Binary files differ)
Added: trunk/sql12/plugins/multisource/src/main/resources/doc/img/add_alias_prompt.png
===================================================================
(Binary files differ)
Property changes on: trunk/sql12/plugins/multisource/src/main/resources/doc/img/add_alias_prompt.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/sql12/plugins/multisource/src/main/resources/doc/img/add_mssql.png
===================================================================
(Binary files differ)
Property changes on: trunk/sql12/plugins/multisource/src/main/resources/doc/img/add_mssql.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/sql12/plugins/multisource/src/main/resources/doc/img/add_mysql.png
===================================================================
(Binary files differ)
Property changes on: trunk/sql12/plugins/multisource/src/main/resources/doc/img/add_mysql.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/sql12/plugins/multisource/src/main/resources/doc/img/add_oracle.png
===================================================================
(Binary files differ)
Property changes on: trunk/sql12/plugins/multisource/src/main/resources/doc/img/add_oracle.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/sql12/plugins/multisource/src/main/resources/doc/img/add_oracle_with_schema.png
===================================================================
(Binary files differ)
Property changes on: trunk/sql12/plugins/multisource/src/main/resources/doc/img/add_oracle_with_schema.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/sql12/plugins/multisource/src/main/resources/doc/img/add_postgres.png
===================================================================
(Binary files differ)
Property changes on: trunk/sql12/plugins/multisource/src/main/resources/doc/img/add_postgres.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/sql12/plugins/multisource/src/main/resources/doc/img/after_add_mssql.png
===================================================================
(Binary files differ)
Property changes on: trunk/sql12/plugins/multisource/src/main/resources/doc/img/after_add_mssql.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/sql12/plugins/multisource/src/main/resources/doc/img/before_add_mssql.png
===================================================================
(Binary files differ)
Property changes on: trunk/sql12/plugins/multisource/src/main/resources/doc/img/before_add_mssql.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/sql12/plugins/multisource/src/main/resources/doc/img/create_unity.png
===================================================================
(Binary files differ)
Property changes on: trunk/sql12/plugins/multisource/src/main/resources/doc/img/create_unity.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/sql12/plugins/multisource/src/main/resources/doc/img/example_four_sources.png
===================================================================
(Binary files differ)
Property changes on: trunk/sql12/plugins/multisource/src/main/resources/doc/img/example_four_sources.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/sql12/plugins/multisource/src/main/resources/doc/img/install_after_unzip.png
===================================================================
(Binary files differ)
Property changes on: trunk/sql12/plugins/multisource/src/main/resources/doc/img/install_after_unzip.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/sql12/plugins/multisource/src/main/resources/doc/img/install_before_unzip.png
===================================================================
(Binary files differ)
Property changes on: trunk/sql12/plugins/multisource/src/main/resources/doc/img/install_before_unzip.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/sql12/plugins/multisource/src/main/resources/doc/img/register_driver.png
===================================================================
(Binary files differ)
Property changes on: trunk/sql12/plugins/multisource/src/main/resources/doc/img/register_driver.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/sql12/plugins/multisource/src/main/resources/doc/img/trim_translation_example.png
===================================================================
(Binary files differ)
Property changes on: trunk/sql12/plugins/multisource/src/main/resources/doc/img/trim_translation_example.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/sql12/plugins/multisource/src/main/resources/doc/img/two_source_join.png
===================================================================
(Binary files differ)
Property changes on: trunk/sql12/plugins/multisource/src/main/resources/doc/img/two_source_join.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/sql12/plugins/multisource/src/main/resources/doc/readme.html
===================================================================
--- trunk/sql12/plugins/multisource/src/main/resources/doc/readme.html (rev 0)
+++ trunk/sql12/plugins/multisource/src/main/resources/doc/readme.html 2012-05-16 05:00:49 UTC (rev 6622)
@@ -0,0 +1,119 @@
+<html>
+<head>
+ <title>MultiSource Virtualization Plugin</title>
+</head>
+<body>
+
+<h2>MultiSource Virtualization Plugin</h2>
+
+<h3>Overview</h3>
+
+<p>The multiple source query plugin allows SQuirreL users to create a virtual data source that may consist of multiple data sources on different servers and platforms. The user can enter one SQL query to combine and join information from multiple sources.</p>
+
+
+<h3>Benefits</h3>
+
+<ul>
+<li>The plugin allows SQuirreL to natively support multiple source queries.</li>
+<li>No data source or server changes are required.</li>
+<li>The plugin supports standard SQL including joins, group by, aggregation, LIMIT, and ordering where tables may come from one or more sources.</li>
+<li>The plugin will perform function translation where a user requests a function that is not supported on a certain source.</li>
+</ul>
+
+<h3>Installation</h3>
+
+<ol>
+<li>Download and install SQuirreL.</li>
+<li>Download the plugin at <a href="http://people.ok.ubc.ca/rlawrenc/multisource.zip">http://people.ok.ubc.ca/rlawrenc/multisource.zip</a>.</li>
+<li>Unzip the multisource.zip into the directory squirrel/plugins.
+
+<table>
+<tr><th>Before Unzip</th> <th>After Unzip</th></tr>
+<tr><td><img src="img/install_before_unzip.png"/></td><td><img src="img/install_after_unzip.png"/></td></tr>
+</table>
+
+</li>
+
+<li>Copy the unityjdbc.jar into the squirrel/lib directory or JAVA_HOME/jre/lib/ext directory.</li>
+<li>For any other JDBC drivers used (say the driver for MySQL), they must be in the squirrel/lib directory or JAVA_HOME/jre/lib/ext directory as well.</li>
+<li>Start SQuirreL. The multisource plugin should be visible in the plugin list.</li>
+<li>Register the UnityJDBC driver in the driver list.<br/>
+
+<img src="img/register_driver.png"/></li>
+</ol>
+
+
+
+<h3>How It Works</h3>
+
+<ol>
+<li>Register data source aliases as usual. Here we have created connections to a Microsoft SQL Server database, a MySQL database, an Oracle database, and a PostgreSQL database all containing the TPC-H benchmark schema. Note that any database with a JDBC driver is supported including those accessible using the JDBC-ODBC bridge.<br/>
+
+<table>
+<tr><th>Microsoft SQL Server</th> <th>MySQL</th></tr>
+<tr><td><img src="img/add_mssql.png"/></td><td><img src="img/add_mysql.png"/></td></tr>
+<tr><th>Oracle</th> <th>Postgres</th></tr>
+<tr><td><img src="img/add_oracle.png"/></td><td><img src="img/add_postgres.png"/></td></tr>
+</table>
+
+<li>Make sure you have registered the UnityJDBC driver (during installation). Create an alias consisting of virtual sources. The name field can be any name. It does not have to be virtual.
+
+<li>The user adds each database alias to the virtual source.
+
+<h4>Before add MSSQL source:</h4>
+
+<img src="img/before_add_mssql.png"/>
+
+<h4>Prompt for source (alias) to add:</h4>
+
+<img src="img/add_alias_prompt.png"/>
+
+<h4>After add Microsoft source. Tables of MSSQL sources are visible in object tree view.</h4>
+
+<img src="img/after_add_mssql.png"/>
+
+</li>
+
+<li>User can add as many sources as they wish. You can also rename the source in the virtual view. It does not have to be the same as the alias name used by SQuirreL. When adding Oracle sources, make sure to specify a schema so that system tables and tables from all schemas are not extracted.
+
+<h4>Adding an Oracle Source with a Schema</h4>
+
+<img src="img/add_oracle_with_schema.png"/>
+
+<h4>Object Tree View with all Four Sources Added</h4>
+
+<img src="img/example_four_sources.png"/>
+
+</li>
+
+<li>The user can execute an SQL query that spans multiple sources and get a single result. The virtualization is transparent to the user and SQuirreL.
+
+<h4>Join across two data sources.</h4>
+
+<img src="img/two_source_join.png"/>
+
+
+<h3>A Translation Example</h3>
+
+<p>The UnityJDBC driver used to perform the virtualization will also translate functions that are not implemented by certain sources. For example, MSSQL does not support TRIM(), but you can do the same result using RTRIM(LTRIM()). Unity will automatically translate a TRIM() function specified in a MSSQL query to the correct syntax supported by the database.</p>
+
+<h4>Example TRIM() Translation for MSSQL</h4>
+
+<img src="img/trim_translation_example.png"/>
+
+<p>This translation is supported for common databases and can be freely extended by user-defined functions and translations for each database dialect.</p>
+
+
+<h3>Plugin Limits</h3>
+
+<p>The plugin source code, like all of SQuirreL, is released under the GNU Lesser General Public License. The UnityJDBC virtualization driver is released under a commercial license. However, the UnityJDBC driver included in the plugin is fully functioning with no time limits allowing an unlimited number of sources and queries. The only limitation is the size of the result set is limited to the first 100 rows. (Note there is no limit on the number of rows extracted from each source. So select count(*) from table with a 1 million row table is fine as it only returns one result row.) Use LIMIT 100 to get the first 100 results of a query.</p>
+
+
+<p>For More Information and Technical Support Contact:<br/>
+Dr. Ramon Lawrence, ram...@ub..., 250-807-9390<br/>
+Associate Professor, Computer Science, University of British Columbia Okanagan, Canada<br/>
+UnityJDBC driver information: <a href="http://www.unityjdbc.com">www.unityjdbc.com</a></p>
+
+
+</body>
+</html>
Added: trunk/sql12/plugins/multisource/src/main/resources/doc/unityjdbc.jar
===================================================================
(Binary files differ)
Property changes on: trunk/sql12/plugins/multisource/src/main/resources/doc/unityjdbc.jar
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|