From d3b4caea0152b36349285b1650dde783e24576ca Mon Sep 17 00:00:00 2001 From: Dickon Field Date: Sun, 16 Jul 2006 22:50:47 +0000 Subject: [PATCH] git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@1591 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Configuration/AssemblyInfo.cs | 27 ++ .../Project/Resources/MyUserControl.xfrm | 25 ++ .../SharpDbTools/Project/SharpDbTools.addin | 18 ++ .../SharpDbTools/Project/SharpDbTools.csproj | 76 ++++++ ...nnectionStringDefinitionDialog.Designer.cs | 239 ++++++++++++++++++ .../Src/ConnectionStringDefinitionDialog.cs | 216 ++++++++++++++++ .../Src/ConnectionStringDefinitionDialog.resx | 126 +++++++++ .../Project/Src/DbProvidersService.cs | 93 +++++++ .../Project/Src/Model/DbConnectionInfo.cs | 112 ++++++++ .../Project/Src/Model/DbModelInfo.cs | 32 +++ .../Project/Src/Model/IConnectionInfo.cs | 27 ++ .../Project/Src/ServerBrowserTool.cs | 56 ++++ 12 files changed, 1047 insertions(+) create mode 100644 src/AddIns/Misc/SharpDbTools/Project/Configuration/AssemblyInfo.cs create mode 100644 src/AddIns/Misc/SharpDbTools/Project/Resources/MyUserControl.xfrm create mode 100644 src/AddIns/Misc/SharpDbTools/Project/SharpDbTools.addin create mode 100644 src/AddIns/Misc/SharpDbTools/Project/SharpDbTools.csproj create mode 100644 src/AddIns/Misc/SharpDbTools/Project/Src/ConnectionStringDefinitionDialog.Designer.cs create mode 100644 src/AddIns/Misc/SharpDbTools/Project/Src/ConnectionStringDefinitionDialog.cs create mode 100644 src/AddIns/Misc/SharpDbTools/Project/Src/ConnectionStringDefinitionDialog.resx create mode 100644 src/AddIns/Misc/SharpDbTools/Project/Src/DbProvidersService.cs create mode 100644 src/AddIns/Misc/SharpDbTools/Project/Src/Model/DbConnectionInfo.cs create mode 100644 src/AddIns/Misc/SharpDbTools/Project/Src/Model/DbModelInfo.cs create mode 100644 src/AddIns/Misc/SharpDbTools/Project/Src/Model/IConnectionInfo.cs create mode 100644 src/AddIns/Misc/SharpDbTools/Project/Src/ServerBrowserTool.cs diff --git a/src/AddIns/Misc/SharpDbTools/Project/Configuration/AssemblyInfo.cs b/src/AddIns/Misc/SharpDbTools/Project/Configuration/AssemblyInfo.cs new file mode 100644 index 0000000000..aa7c81a027 --- /dev/null +++ b/src/AddIns/Misc/SharpDbTools/Project/Configuration/AssemblyInfo.cs @@ -0,0 +1,27 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("SharpDbTools")] +[assembly: AssemblyDescription("Addin for SharpDevelop 2.0")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SharpDevelop")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("1.0.*")] + diff --git a/src/AddIns/Misc/SharpDbTools/Project/Resources/MyUserControl.xfrm b/src/AddIns/Misc/SharpDbTools/Project/Resources/MyUserControl.xfrm new file mode 100644 index 0000000000..bbfacac561 --- /dev/null +++ b/src/AddIns/Misc/SharpDbTools/Project/Resources/MyUserControl.xfrm @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AddIns/Misc/SharpDbTools/Project/SharpDbTools.addin b/src/AddIns/Misc/SharpDbTools/Project/SharpDbTools.addin new file mode 100644 index 0000000000..90cb7437fa --- /dev/null +++ b/src/AddIns/Misc/SharpDbTools/Project/SharpDbTools.addin @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/src/AddIns/Misc/SharpDbTools/Project/SharpDbTools.csproj b/src/AddIns/Misc/SharpDbTools/Project/SharpDbTools.csproj new file mode 100644 index 0000000000..b960b52789 --- /dev/null +++ b/src/AddIns/Misc/SharpDbTools/Project/SharpDbTools.csproj @@ -0,0 +1,76 @@ + + + Library + SharpDbTools + SharpDbTools + Debug + AnyCPU + {413A467D-7EA1-4C40-B10B-D6832B94DD6E} + False + False + False + Auto + 4194304 + AnyCPU + 4096 + 4 + false + + + obj\ + obj\Debug\ + ..\..\..\..\..\AddIns\AddIns\Misc\SharpDbTools\ + False + DEBUG;TRACE + true + Full + True + + + obj\ + obj\Release\ + ..\..\..\..\..\AddIns\AddIns\Misc\SharpDbTools\ + True + TRACE + false + None + True + + + + + + + + + + + Always + + + + + + + + + ConnectionStringDefinitionDialog.cs + + + + + + + + + + {2748AD25-9C63-4E12-877B-4DCE96FBED54} + ICSharpCode.SharpDevelop + + + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} + ICSharpCode.Core + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/SharpDbTools/Project/Src/ConnectionStringDefinitionDialog.Designer.cs b/src/AddIns/Misc/SharpDbTools/Project/Src/ConnectionStringDefinitionDialog.Designer.cs new file mode 100644 index 0000000000..6b2e3a891f --- /dev/null +++ b/src/AddIns/Misc/SharpDbTools/Project/Src/ConnectionStringDefinitionDialog.Designer.cs @@ -0,0 +1,239 @@ +/* + * Responsibilities:
+ *
+ * Collaboration:
+ *
+ * User: ${USER} + * Date: ${DATE} + * Time: ${TIME} + * + */ +namespace SharpDbTools.Connection +{ + partial class ConnectionStringDefinitionDialog : System.Windows.Forms.Form + { + /// + /// Designer variable used to keep track of non-visual components. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Disposes resources used by the form. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing) { + if (components != null) { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + /// + /// This method is required for Windows Forms designer support. + /// Do not change the method contents inside the source code editor. The Forms designer might + /// not be able to load this method if it was changed manually. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.connStringPropertyGrid = new System.Windows.Forms.PropertyGrid(); + this.buttonsFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel(); + this.testButton = new System.Windows.Forms.Button(); + this.submitButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.providerTypeComboBox = new System.Windows.Forms.ComboBox(); + this.dataSourceTypeLabel = new System.Windows.Forms.Label(); + this.connStringResult = new System.Windows.Forms.TextBox(); + this.connectionStringLabel = new System.Windows.Forms.Label(); + this.progressTimer = new System.Windows.Forms.Timer(this.components); + this.statusStrip = new System.Windows.Forms.StatusStrip(); + this.outputMessageTabControl = new System.Windows.Forms.TabControl(); + this.connectionStringTab = new System.Windows.Forms.TabPage(); + this.testResultTab = new System.Windows.Forms.TabPage(); + this.testResultTextBox = new System.Windows.Forms.TextBox(); + this.buttonsFlowLayoutPanel.SuspendLayout(); + this.outputMessageTabControl.SuspendLayout(); + this.connectionStringTab.SuspendLayout(); + this.testResultTab.SuspendLayout(); + this.SuspendLayout(); + // + // connStringPropertyGrid + // + this.connStringPropertyGrid.Location = new System.Drawing.Point(0, 39); + this.connStringPropertyGrid.Name = "connStringPropertyGrid"; + this.connStringPropertyGrid.Size = new System.Drawing.Size(547, 300); + this.connStringPropertyGrid.TabIndex = 0; + // + // buttonsFlowLayoutPanel + // + this.buttonsFlowLayoutPanel.Controls.Add(this.testButton); + this.buttonsFlowLayoutPanel.Controls.Add(this.submitButton); + this.buttonsFlowLayoutPanel.Controls.Add(this.cancelButton); + this.buttonsFlowLayoutPanel.Location = new System.Drawing.Point(3, 447); + this.buttonsFlowLayoutPanel.Name = "buttonsFlowLayoutPanel"; + this.buttonsFlowLayoutPanel.Size = new System.Drawing.Size(312, 34); + this.buttonsFlowLayoutPanel.TabIndex = 1; + // + // testButton + // + this.testButton.Location = new System.Drawing.Point(3, 3); + this.testButton.Name = "testButton"; + this.testButton.Size = new System.Drawing.Size(75, 23); + this.testButton.TabIndex = 0; + this.testButton.Text = "Test"; + this.testButton.UseVisualStyleBackColor = true; + this.testButton.Click += new System.EventHandler(this.TestButtonClick); + // + // submitButton + // + this.submitButton.Location = new System.Drawing.Point(84, 3); + this.submitButton.Name = "submitButton"; + this.submitButton.Size = new System.Drawing.Size(75, 23); + this.submitButton.TabIndex = 1; + this.submitButton.Text = "Submit"; + this.submitButton.UseVisualStyleBackColor = true; + this.submitButton.Click += new System.EventHandler(this.SubmitButtonClick); + // + // cancelButton + // + this.cancelButton.Location = new System.Drawing.Point(165, 3); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 23); + this.cancelButton.TabIndex = 2; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.CancelButtonClick); + // + // providerTypeComboBox + // + this.providerTypeComboBox.FormattingEnabled = true; + this.providerTypeComboBox.Location = new System.Drawing.Point(117, 12); + this.providerTypeComboBox.Name = "providerTypeComboBox"; + this.providerTypeComboBox.Size = new System.Drawing.Size(195, 21); + this.providerTypeComboBox.TabIndex = 2; + this.providerTypeComboBox.SelectedIndexChanged += new System.EventHandler(this.ProviderTypeSelectedIndexChanged); + // + // dataSourceTypeLabel + // + this.dataSourceTypeLabel.Location = new System.Drawing.Point(3, 9); + this.dataSourceTypeLabel.Name = "dataSourceTypeLabel"; + this.dataSourceTypeLabel.Size = new System.Drawing.Size(108, 23); + this.dataSourceTypeLabel.TabIndex = 3; + this.dataSourceTypeLabel.Text = "Data Source Type:"; + this.dataSourceTypeLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // connStringResult + // + this.connStringResult.Enabled = false; + this.connStringResult.Location = new System.Drawing.Point(0, 0); + this.connStringResult.Multiline = true; + this.connStringResult.Name = "connStringResult"; + this.connStringResult.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.connStringResult.Size = new System.Drawing.Size(413, 74); + this.connStringResult.TabIndex = 4; + // + // connectionStringLabel + // + this.connectionStringLabel.Location = new System.Drawing.Point(12, 348); + this.connectionStringLabel.Name = "connectionStringLabel"; + this.connectionStringLabel.Size = new System.Drawing.Size(100, 23); + this.connectionStringLabel.TabIndex = 5; + this.connectionStringLabel.Text = "Connection String:"; + // + // progressTimer + // + this.progressTimer.Interval = 1000; + this.progressTimer.Tick += new System.EventHandler(this.ProgressTimerTick); + // + // statusStrip + // + this.statusStrip.Location = new System.Drawing.Point(0, 478); + this.statusStrip.Name = "statusStrip"; + this.statusStrip.Size = new System.Drawing.Size(547, 22); + this.statusStrip.TabIndex = 6; + this.statusStrip.Text = "statusStrip1"; + // + // testResultTab + // + this.outputMessageTabControl.Controls.Add(this.connectionStringTab); + this.outputMessageTabControl.Controls.Add(this.testResultTab); + this.outputMessageTabControl.Location = new System.Drawing.Point(118, 345); + this.outputMessageTabControl.Name = "testResultTab"; + this.outputMessageTabControl.SelectedIndex = 0; + this.outputMessageTabControl.Size = new System.Drawing.Size(417, 100); + this.outputMessageTabControl.TabIndex = 7; + // + // tabPage1 + // + this.connectionStringTab.Controls.Add(this.connStringResult); + this.connectionStringTab.Location = new System.Drawing.Point(4, 22); + this.connectionStringTab.Name = "tabPage1"; + this.connectionStringTab.Padding = new System.Windows.Forms.Padding(3); + this.connectionStringTab.Size = new System.Drawing.Size(409, 74); + this.connectionStringTab.TabIndex = 0; + this.connectionStringTab.Text = "Connection String"; + this.connectionStringTab.UseVisualStyleBackColor = true; + // + // tabPage2 + // + this.testResultTab.Controls.Add(this.testResultTextBox); + this.testResultTab.Location = new System.Drawing.Point(4, 22); + this.testResultTab.Name = "tabPage2"; + this.testResultTab.Padding = new System.Windows.Forms.Padding(3); + this.testResultTab.Size = new System.Drawing.Size(409, 74); + this.testResultTab.TabIndex = 1; + this.testResultTab.Text = "Test Result Message"; + this.testResultTab.UseVisualStyleBackColor = true; + // + // testResultTextBox + // + this.testResultTextBox.Location = new System.Drawing.Point(-5, 0); + this.testResultTextBox.Multiline = true; + this.testResultTextBox.Name = "testResultTextBox"; + this.testResultTextBox.Size = new System.Drawing.Size(418, 77); + this.testResultTextBox.TabIndex = 0; + // + // ConnectionStringDefinitionDialog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(547, 500); + this.Controls.Add(this.outputMessageTabControl); + this.Controls.Add(this.statusStrip); + this.Controls.Add(this.connectionStringLabel); + this.Controls.Add(this.dataSourceTypeLabel); + this.Controls.Add(this.providerTypeComboBox); + this.Controls.Add(this.buttonsFlowLayoutPanel); + this.Controls.Add(this.connStringPropertyGrid); + this.Name = "ConnectionStringDefinitionDialog"; + this.Text = "Set up Connection String"; + this.buttonsFlowLayoutPanel.ResumeLayout(false); + this.outputMessageTabControl.ResumeLayout(false); + this.connectionStringTab.ResumeLayout(false); + this.connectionStringTab.PerformLayout(); + this.testResultTab.ResumeLayout(false); + this.testResultTab.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + } + private System.Windows.Forms.TabControl outputMessageTabControl; + private System.Windows.Forms.TextBox testResultTextBox; + private System.Windows.Forms.TabPage testResultTab; + private System.Windows.Forms.TabPage connectionStringTab; + + private System.Windows.Forms.Timer progressTimer; + private System.Windows.Forms.StatusStrip statusStrip; + private System.Windows.Forms.TextBox connStringResult; + private System.Windows.Forms.Label connectionStringLabel; + private System.Windows.Forms.Label dataSourceTypeLabel; + private System.Windows.Forms.ComboBox providerTypeComboBox; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button submitButton; + private System.Windows.Forms.Button testButton; + private System.Windows.Forms.FlowLayoutPanel buttonsFlowLayoutPanel; + private System.Windows.Forms.PropertyGrid connStringPropertyGrid; + } +} diff --git a/src/AddIns/Misc/SharpDbTools/Project/Src/ConnectionStringDefinitionDialog.cs b/src/AddIns/Misc/SharpDbTools/Project/Src/ConnectionStringDefinitionDialog.cs new file mode 100644 index 0000000000..ab363fe822 --- /dev/null +++ b/src/AddIns/Misc/SharpDbTools/Project/Src/ConnectionStringDefinitionDialog.cs @@ -0,0 +1,216 @@ + +using System; +using System.Drawing; +using System.Windows.Forms; +using System.Collections.Generic; +using System.Data.Common; +using System.ComponentModel; + +namespace SharpDbTools.Connection +{ + /// + /// This class creates a dialog that can be used to create and test connection strings + /// that can be used with .net 2.0 DbProviders. + /// It utilises .net 2.0 configuration to discover any DbProviderFactories that are + /// installed and configured in machine.config, app.config or user.config using + /// standard .net 2.0 apis. + /// It then enables a user to browse the properties of each type of db connection, + /// set values for them and test the resulting connection string. + /// When the submit button is clicked the dialog is dismissed and the connection + /// string constructed is accessible through the ConnectionString property of the dialog. + /// + public partial class ConnectionStringDefinitionDialog + { + ToolStripProgressBar connectionTestProgressBar = new ToolStripProgressBar(); + ConnectionTestBackgroundWorker testConnectionBackgroundWorker; + string resultMessage; + + public ConnectionStringDefinitionDialog() + { + // + // The InitializeComponent() call is required for Windows Forms designer support. + // + InitializeComponent(); + this.connStringPropertyGrid.PropertyValueChanged += + new PropertyValueChangedEventHandler(this.ConnStringAttributesViewPropertyValueChanged); + // add a ProgressBar to the statusString + this.statusStrip.Items.Add(connectionTestProgressBar); + this.connectionTestProgressBar.Step = 10; + this.connectionTestProgressBar.Minimum = 0; + this.connectionTestProgressBar.Maximum = 150; + } + + public string ResultMessage + { + get + { + return resultMessage; + } + set + { + resultMessage = value; + } + } + + public DbConnectionStringBuilder ConnectionStringBuilder + { + get + { + return (DbConnectionStringBuilder)this.connStringPropertyGrid.SelectedObject; + } + } + + public string ConnectionString + { + get + { + return ((DbConnectionStringBuilder)this.connStringPropertyGrid.SelectedObject).ConnectionString; + } + } + + protected override void OnLoad(EventArgs e) + { + // + // set the PropertyGrid to browse the available DbProviders + // + + base.OnLoad(e); + + DbProvidersService service = DbProvidersService.GetDbProvidersService(); + List names = service.Names; + this.providerTypeComboBox.DataSource = names; + this.connStringResult.Text = this.ConnectionString; + } + + void CancelButtonClick(object sender, System.EventArgs e) + { + this.Close(); + } + + void ProviderTypeSelectedIndexChanged(object sender, System.EventArgs e) + { + string selection = (string)this.providerTypeComboBox.SelectedItem; + DbProvidersService service = DbProvidersService.GetDbProvidersService(); + DbProviderFactory factory = service[selection]; + DbConnectionStringBuilder builder = factory.CreateConnectionStringBuilder(); + connStringPropertyGrid.SelectedObject = builder; + } + + void ConnStringAttributesViewPropertyValueChanged(Object s, PropertyValueChangedEventArgs args) + { + // looking for changes to the ConnectionString property in the PropertyGrid + this.connStringResult.Text = this.ConnectionString; + this.outputMessageTabControl.SelectTab(this.connectionStringTab); + ResetTestResultTextBox(); + } + + void TestButtonClick(object sender, System.EventArgs e) + { + string dbTypeName = (string)this.providerTypeComboBox.SelectedItem; + testConnectionBackgroundWorker = new ConnectionTestBackgroundWorker(dbTypeName); + testConnectionBackgroundWorker.WorkerSupportsCancellation = false; + progressTimer.Enabled = true; + testConnectionBackgroundWorker.DoWork += + new DoWorkEventHandler(this.TestConnectionBackgroundWorkerDoWork); + testConnectionBackgroundWorker.RunWorkerCompleted += + new RunWorkerCompletedEventHandler(TestConnectionRunWorkerComplete); + testConnectionBackgroundWorker.RunWorkerAsync(); + } + + void ProgressTimerTick(object sender, System.EventArgs e) + { + this.Invoke(new EventHandler(UpdateProgressBar)); + } + + void UpdateProgressBar(object sender, EventArgs e) + { + ToolStripProgressBar p = connectionTestProgressBar; + if (p.Value == p.Maximum) p.Value = 0; + p.PerformStep(); + } + + void SetTestResultTextBox() + { + this.testResultTextBox.Text = ResultMessage; + this.outputMessageTabControl.SelectTab(this.testResultTab); + } + + void ResetTestResultTextBox() + { + this.testResultTextBox.Text = ""; + } + + void TestConnectionBackgroundWorkerDoWork(object sender, DoWorkEventArgs e) + { + DbConnection connection = null; + try + { + // get the current name + + ConnectionTestBackgroundWorker bw = sender as ConnectionTestBackgroundWorker; + string currentDbTypeName = bw.DatabaseType; + + // get the DbProviderFactory for this name + + DbProvidersService service = DbProvidersService.GetDbProvidersService(); + DbProviderFactory factory = service[currentDbTypeName]; + + // get a connection object or this factory + + connection = factory.CreateConnection(); + connection.ConnectionString = this.ConnectionString; + + connection.Open(); + e.Result = "Connection Succeeded"; + } + catch(Exception ex) + { + e.Result = "Connection Failed: " + ex.Message; + } + finally + { + if (connection != null) + { + connection.Close(); + } + } + } + + void TestConnectionRunWorkerComplete(object sender, RunWorkerCompletedEventArgs args) + { + ResultMessage = args.Result as string; + this.Invoke(new EventHandler(TestConnectionCompleted)); + } + + void TestConnectionCompleted(object sender, EventArgs args) + { + progressTimer.Enabled = false; + connectionTestProgressBar.Value = 0; + SetTestResultTextBox(); + testConnectionBackgroundWorker.Dispose(); + } + + void SubmitButtonClick(object sender, System.EventArgs e) + { + this.Close(); + } + } + + class ConnectionTestBackgroundWorker: BackgroundWorker + { + private string dbTypeName; + + public ConnectionTestBackgroundWorker(string dbTypeName): base() + { + this.dbTypeName = dbTypeName; + } + + public string DatabaseType + { + get + { + return dbTypeName; + } + } + } +} diff --git a/src/AddIns/Misc/SharpDbTools/Project/Src/ConnectionStringDefinitionDialog.resx b/src/AddIns/Misc/SharpDbTools/Project/Src/ConnectionStringDefinitionDialog.resx new file mode 100644 index 0000000000..157d9061d2 --- /dev/null +++ b/src/AddIns/Misc/SharpDbTools/Project/Src/ConnectionStringDefinitionDialog.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 247, 17 + + + 371, 17 + + \ No newline at end of file diff --git a/src/AddIns/Misc/SharpDbTools/Project/Src/DbProvidersService.cs b/src/AddIns/Misc/SharpDbTools/Project/Src/DbProvidersService.cs new file mode 100644 index 0000000000..403da75b18 --- /dev/null +++ b/src/AddIns/Misc/SharpDbTools/Project/Src/DbProvidersService.cs @@ -0,0 +1,93 @@ +/* + * Responsibilities:
+ *
+ * Collaboration:
+ *
+ * User: Dickon Field + * Date: 21/05/2006 + * Time: 23:19 + * + */ + +using System; +using System.Data.Common; +using System.Data; +using System.Collections.Generic; + +namespace SharpDbTools.Connection +{ + /// + /// A utility class that caches the DbProviderFactory and DbConnectionString + /// objects whose state is stored in the current processes config space. + /// + public class DbProvidersService + { + private static DbProvidersService me = new DbProvidersService(); + private static Boolean initialized = false; + private Dictionary factories = new Dictionary(); + private List names = new List(); + + private DbProvidersService() + { + } + + private void Initialize() + { + // get a complete list of config data for DbProviderFactories, indexed by name + + DataTable providerFactoriesTable = DbProviderFactories.GetFactoryClasses(); + DataRow[] rows = providerFactoriesTable.Select(); + + foreach(DataRow row in rows) + { + string name = (string)row["Name"]; + //factoryData.Add(name, row); + DbProviderFactory factory = DbProviderFactories.GetFactory(row); + names.Add(name); + factories.Add(name, factory); + } + + initialized = true; + } + + public List Names + { + get + { + return names; + } + } + + public string this[int i] + { + get + { + return names[i]; + } + } + + public DbProviderFactory this[string name] + { + get + { + return factories[name]; + } + set + { + factories[name] = value; + } + } + + public static DbProvidersService GetDbProvidersService() + { + lock(me) + { + if (!initialized) + { + me.Initialize(); + } + } + return me; + } + } +} diff --git a/src/AddIns/Misc/SharpDbTools/Project/Src/Model/DbConnectionInfo.cs b/src/AddIns/Misc/SharpDbTools/Project/Src/Model/DbConnectionInfo.cs new file mode 100644 index 0000000000..4d49482308 --- /dev/null +++ b/src/AddIns/Misc/SharpDbTools/Project/Src/Model/DbConnectionInfo.cs @@ -0,0 +1,112 @@ +/* + * User: Dickon Field + * Date: 05/07/2006 + * Time: 22:13 + * + */ + +using System; +using System.Data; +using System.Data.Common; +using ICSharpCode.Core; + + +namespace SharpDbTools.Model +{ + /// + /// Description of ConnectionInfo. + /// + public class DbConnectionInfo: IConnectionInfo, IDisposable + { + DbConnection connection = null; + string connectionString = null; + string invariantName = null; + string name = null; + DbModelInfo dbModel = null; + + private DbConnectionInfo() + { + + } + + public DbConnectionInfo(string name, string invariantName, string connectionString) + { + this.name = name; + this.connectionString = connectionString; + this.invariantName = invariantName; + } + + public bool HasConnection + { + get + { + return !(connection == null); + } + } + + public bool HasModel + { + get + { + return !(dbModel == null); + } + } + + public DbConnection Connection + { + get { + // return connection if defined else try and create it + if (connection != null) { + return connection; + } + else { + DbProviderFactory factory = DbProviderFactories.GetFactory(invariantName); + this.connection = factory.CreateConnection(); + this.connection.ConnectionString = this.connectionString; + this.connection.Open(); + return this.connection; + } + } + } + + public DataSet DbModel + { + get + { + if (dbModel == null) + { + dbModel = new DbModelInfo(); + DbConnection connection = this.Connection; + + // get the Schema table + + DataTable schemaInfo = connection.GetSchema(); + + // iterate through the rows in it - the first column of each is a + // schema info collection name that can be retrieved as a DbTable + // Add each one to the DbModel DataSet + + foreach (DataRow collectionRow in schemaInfo.Rows) { + String collectionName = (string)collectionRow[0]; + DataTable nextMetaData = connection.GetSchema(collectionName); + dbModel.Merge(nextMetaData); + } + + } + return this.dbModel; + } + } + + public void Dispose() + { + try { + this.connection.Close(); + } + catch(Exception e) { + LoggingService.Warn("unable to close connection: exception thrown", e); + } + } + + // TODO: serialise into a store + } +} diff --git a/src/AddIns/Misc/SharpDbTools/Project/Src/Model/DbModelInfo.cs b/src/AddIns/Misc/SharpDbTools/Project/Src/Model/DbModelInfo.cs new file mode 100644 index 0000000000..d4a4fe4be3 --- /dev/null +++ b/src/AddIns/Misc/SharpDbTools/Project/Src/Model/DbModelInfo.cs @@ -0,0 +1,32 @@ +/* + * User: Dickon Field + * Date: 10/07/2006 + * Time: 09:12 + * + */ + +using System; +using System.Data; +using System.Collections.Generic; + +namespace SharpDbTools.Model +{ + /// + /// DbModel is a DataSet containing the metadata tables returned from a DbConnection. + /// It adds methods designed specifically to facilitate access to the data in the + /// DataTables contained by the DbModel. + /// + /// The DbModel class is intended to be usable in a fully disconnected mode - that is, + /// it requires a DbConnection to populate it, but it may then be locally persisted and subsequently + /// retrieved from its persisted data. This is intended to allow work to progress against the + /// DbModel without requiring a connection to its RDB server. + /// + public class DbModelInfo: DataSet + { + public const string METADATACOLLECTIONS = "MetaDataCollections"; + + public DbModelInfo() + { + } + } +} diff --git a/src/AddIns/Misc/SharpDbTools/Project/Src/Model/IConnectionInfo.cs b/src/AddIns/Misc/SharpDbTools/Project/Src/Model/IConnectionInfo.cs new file mode 100644 index 0000000000..95509eb20f --- /dev/null +++ b/src/AddIns/Misc/SharpDbTools/Project/Src/Model/IConnectionInfo.cs @@ -0,0 +1,27 @@ +/* + * User: Dickon Field + * Date: 10/07/2006 + * Time: 09:23 + * + */ + +using System; + +namespace SharpDbTools.Model +{ + /// + /// Presents the basic contract for ConnectionInfo classes + /// + public interface IConnectionInfo + { + bool HasConnection + { + get; + } + + bool HasModel + { + get; + } + } +} diff --git a/src/AddIns/Misc/SharpDbTools/Project/Src/ServerBrowserTool.cs b/src/AddIns/Misc/SharpDbTools/Project/Src/ServerBrowserTool.cs new file mode 100644 index 0000000000..7bd2af9503 --- /dev/null +++ b/src/AddIns/Misc/SharpDbTools/Project/Src/ServerBrowserTool.cs @@ -0,0 +1,56 @@ +/* + * User: Dickon Field + * Date: 12/06/2006 + * Time: 06:25 + */ + +using System; +using System.Windows.Forms; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; + +namespace SharpDbTools +{ + /// + /// Enables a user to browse metadata associated with a db server and to open resources + /// referenced therein. + /// + public class ServerBrowserTool : AbstractPadContent + { + Panel ctl; + + /// + /// + /// + public ServerBrowserTool() + { + ctl = new Panel(); + } + + /// + /// The representing the pad + /// + public override Control Control { + get { + return ctl; + } + } + + /// + /// Refreshes the pad + /// + public override void RedrawContent() + { + // TODO: Refresh the whole pad control here, renew all resource strings whatever + // Note that you do not need to recreate the control. + } + + /// + /// Cleans up all used resources + /// + public override void Dispose() + { + ctl.Dispose(); + } + } +}