Browse Source

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@1904 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61

shortcuts
Dickon Field 19 years ago
parent
commit
a872553042
  1. 68
      src/AddIns/Misc/SharpServerTools/OracleDbToolsProvider/OracleDbToolsProvider.csproj
  2. 6
      src/AddIns/Misc/SharpServerTools/OracleDbToolsProvider/OracleDbToolsProvider.sln
  3. 67
      src/AddIns/Misc/SharpServerTools/OracleDbToolsProvider/OracleSharpDbToolsProvider.csproj
  4. 90
      src/AddIns/Misc/SharpServerTools/OracleDbToolsProvider/Src/Forms/OracleFormsArtefactFactory.cs
  5. 56
      src/AddIns/Misc/SharpServerTools/OracleDbToolsProvider/Src/Forms/TableTreeNode.cs
  6. 67
      src/AddIns/Misc/SharpServerTools/ServerBrowserTool/ServerBrowserTool.csproj
  7. 6
      src/AddIns/Misc/SharpServerTools/ServerBrowserTool/ServerBrowserTool.sln
  8. 24
      src/AddIns/Misc/SharpServerTools/ServerBrowserTool/SharpServerTools.addin
  9. 31
      src/AddIns/Misc/SharpServerTools/ServerBrowserTool/Src/Configuration/AssemblyInfo.cs
  10. 19
      src/AddIns/Misc/SharpServerTools/ServerBrowserTool/Src/Forms/IInitializable.cs
  11. 28
      src/AddIns/Misc/SharpServerTools/ServerBrowserTool/Src/Forms/NodeAwareContextMenuStrip.cs
  12. 56
      src/AddIns/Misc/SharpServerTools/ServerBrowserTool/Src/Forms/RebuildRequiredEvents.cs
  13. 78
      src/AddIns/Misc/SharpServerTools/ServerBrowserTool/Src/Forms/ServerBrowserTool.cs
  14. 77
      src/AddIns/Misc/SharpServerTools/ServerBrowserTool/Src/Forms/ServerToolTreeView.cs
  15. 76
      src/AddIns/Misc/SharpServerTools/SharpDbTools/SharpDbTools.csproj
  16. 6
      src/AddIns/Misc/SharpServerTools/SharpDbTools/SharpDbTools.sln
  17. 21
      src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Configuration/AssemblyInfo.cs
  18. 34
      src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Data/ColumnNames.cs
  19. 181
      src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Data/DbModelInfo.cs
  20. 295
      src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Data/DbModelInfoService.cs
  21. 124
      src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Data/DbProvidersService.cs
  22. 29
      src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Data/TableNames.cs
  23. 239
      src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/ConnectionStringDefinitionDialog.Designer.cs
  24. 257
      src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/ConnectionStringDefinitionDialog.cs
  25. 126
      src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/ConnectionStringDefinitionDialog.resx
  26. 147
      src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/DatabaseExplorerTreeNode.cs
  27. 210
      src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/DbModelInfoTreeNode.cs
  28. 55
      src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/FormsArtefactFactories.cs
  29. 24
      src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/FormsArtefactFactory.cs
  30. 100
      src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/GetConnectionLogicalNameDialog.Designer.cs
  31. 46
      src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/GetConnectionLogicalNameDialog.cs
  32. 120
      src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/GetConnectionLogicalNameDialog.resx
  33. 72
      src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/TableDescribeViewContent.cs
  34. 24
      src/AddIns/Misc/SharpServerTools/SharpServerTools.addin

68
src/AddIns/Misc/SharpServerTools/OracleDbToolsProvider/OracleDbToolsProvider.csproj

@ -0,0 +1,68 @@ @@ -0,0 +1,68 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<OutputType>Library</OutputType>
<RootNamespace>OracleDbToolsProvider</RootNamespace>
<AssemblyName>OracleDbToolsProvider</AssemblyName>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{DFA70EAA-3285-4BC0-BCA7-EBEC4D67FC9B}</ProjectGuid>
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<NoStdLib>False</NoStdLib>
<RegisterForComInterop>False</RegisterForComInterop>
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
<BaseAddress>4194304</BaseAddress>
<PlatformTarget>AnyCPU</PlatformTarget>
<FileAlignment>4096</FileAlignment>
<WarningLevel>4</WarningLevel>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<OutputPath>..\..\..\..\..\AddIns\AddIns\Misc\SharpServerTools\</OutputPath>
<Optimize>False</Optimize>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugSymbols>true</DebugSymbols>
<DebugType>Full</DebugType>
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<OutputPath>bin\Release\</OutputPath>
<Optimize>True</Optimize>
<DefineConstants>TRACE</DefineConstants>
<DebugSymbols>False</DebugSymbols>
<DebugType>None</DebugType>
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Xml" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Src\Forms\TableTreeNode.cs" />
<Compile Include="Src\Forms\OracleFormsArtefactFactory.cs" />
</ItemGroup>
<ItemGroup>
<Folder Include="Src" />
<Folder Include="Src\Forms" />
<ProjectReference Include="..\..\..\..\Main\Core\Project\ICSharpCode.Core.csproj">
<Project>{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}</Project>
<Name>ICSharpCode.Core</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Main\Base\Project\ICSharpCode.SharpDevelop.csproj">
<Project>{2748AD25-9C63-4E12-877B-4DCE96FBED54}</Project>
<Name>ICSharpCode.SharpDevelop</Name>
</ProjectReference>
<ProjectReference Include="..\ServerBrowserTool\ServerBrowserTool.csproj">
<Project>{D721EAA4-8A40-4EF0-A011-5862159BE621}</Project>
<Name>ServerBrowserTool</Name>
</ProjectReference>
<ProjectReference Include="..\SharpDbTools\SharpDbTools.csproj">
<Project>{93B2D6DF-7588-40C0-8A35-CA0DD7328FC3}</Project>
<Name>SharpDbTools</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
</Project>

6
src/AddIns/Misc/SharpServerTools/OracleDbToolsProvider/OracleDbToolsProvider.sln

@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 9.00
# SharpDevelop 2.1.0.1900
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OracleDbToolsProvider", "OracleDbToolsProvider.csproj", "{DFA70EAA-3285-4BC0-BCA7-EBEC4D67FC9B}"
EndProject
Global
EndGlobal

67
src/AddIns/Misc/SharpServerTools/OracleDbToolsProvider/OracleSharpDbToolsProvider.csproj

@ -0,0 +1,67 @@ @@ -0,0 +1,67 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<OutputType>Library</OutputType>
<RootNamespace>OracleDbToolsProvider</RootNamespace>
<AssemblyName>OracleSharpDbToolsProvider</AssemblyName>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{2B4FE109-816C-4397-BFBE-077E1763A7A4}</ProjectGuid>
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<NoStdLib>False</NoStdLib>
<RegisterForComInterop>False</RegisterForComInterop>
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
<BaseAddress>4194304</BaseAddress>
<PlatformTarget>AnyCPU</PlatformTarget>
<FileAlignment>4096</FileAlignment>
<WarningLevel>4</WarningLevel>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<BaseIntermediateOutputPath>obj\</BaseIntermediateOutputPath>
<IntermediateOutputPath>obj\Debug\</IntermediateOutputPath>
<OutputPath>..\..\..\..\..\..\AddIns\AddIns\Misc\SharpServerTools\</OutputPath>
<Optimize>False</Optimize>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugSymbols>true</DebugSymbols>
<DebugType>Full</DebugType>
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<BaseIntermediateOutputPath>obj\</BaseIntermediateOutputPath>
<IntermediateOutputPath>obj\Release\</IntermediateOutputPath>
<OutputPath>bin\Release\</OutputPath>
<Optimize>True</Optimize>
<DefineConstants>TRACE</DefineConstants>
<DebugSymbols>False</DebugSymbols>
<DebugType>None</DebugType>
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Xml" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
</ItemGroup>
<ItemGroup>
<Compile Include="Src\Forms\OracleFormsArtefactFactory.cs" />
<Compile Include="Src\Forms\TableTreeNode.cs" />
</ItemGroup>
<ItemGroup>
<Folder Include="Src" />
<Folder Include="Src\Forms" />
<ProjectReference Include="..\..\..\..\..\Main\Core\Project\ICSharpCode.Core.csproj">
<Project>{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}</Project>
<Name>ICSharpCode.Core</Name>
</ProjectReference>
<ProjectReference Include="..\..\SharpServerTools.csproj">
<Project>{E8922383-B6F5-4107-AB82-49662D98B2FE}</Project>
<Name>SharpServerTools</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\..\Main\Base\Project\ICSharpCode.SharpDevelop.csproj">
<Project>{2748AD25-9C63-4E12-877B-4DCE96FBED54}</Project>
<Name>ICSharpCode.SharpDevelop</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
</Project>

90
src/AddIns/Misc/SharpServerTools/OracleDbToolsProvider/Src/Forms/OracleFormsArtefactFactory.cs

@ -0,0 +1,90 @@ @@ -0,0 +1,90 @@
/*
* User: dickon
* Date: 17/09/2006
* Time: 09:10
*
*/
using System;
using System.Windows.Forms;
using System.Data;
using SharpDbTools.Forms;
using SharpDbTools.Data;
using SharpServerTools.Forms;
using ICSharpCode.Core;
namespace SharpDbTools.Oracle.Forms
{
/// <summary>
/// Description of MetaDataNodeBuilder.
/// TODO: currently this is just a flat list - need to reflect ownership
/// relationships such as schema etc
/// </summary>
public class OracleFormsArtefactFactory : FormsArtefactFactory
{
public OracleFormsArtefactFactory()
{
}
public override TreeNode CreateMetaDataNode(string logicalConnectionName)
{
LoggingService.Debug(this.GetType().ToString()
+ ": creating MetaDataNode for: " + logicalConnectionName);
// create root node of the metadata collections tree
TreeNode metaNode = new TreeNode("Db Objects");
metaNode.Name = logicalConnectionName + ":MetaData";
// retrieve the metadata for this logical connection name
DbModelInfo info = DbModelInfoService.GetDbModelInfo(logicalConnectionName);
// retrieve the table listing the metadata collections
DataTable metadataCollectionsTable = info.Tables[TableNames.MetaDataCollections];
// if it exists then populate the tree
if (metadataCollectionsTable != null) {
LoggingService.Debug(this.GetType().ToString() + ": found metadata collections table, " +
" building node...");
for (int i = 0; i < TableNames.PrimaryObjects.Length; i++) {
string metadataCollectionName = TableNames.PrimaryObjects[i];
LoggingService.Debug("looking for metadata: " + metadataCollectionName);
DataTable metaCollectionTable = info.Tables[metadataCollectionName];
LoggingService.Debug("found metadata collection: " + metadataCollectionName);
TreeNode collectionNode = new TreeNode(metadataCollectionName);
collectionNode.Name = logicalConnectionName + ":Collection:" + metadataCollectionName;
metaNode.Nodes.Add(collectionNode);
foreach (DataRow dbObjectRow in metaCollectionTable.Rows) {
TreeNode objectNode = null;
if (dbObjectRow.ItemArray.Length > 1) {
// if it is a table metadata collection then create a node
// with the option to invoke the DescribeTableViewContent
if (metadataCollectionName.Equals("Tables")) {
objectNode = new TableTreeNode((string)dbObjectRow[1], logicalConnectionName);
} else {
// TODO: describe other metadata collections
objectNode = new TreeNode((string)dbObjectRow[1]);
}
objectNode.Name = logicalConnectionName + ":Object:" + (string)dbObjectRow[1];
} else {
objectNode = new TreeNode((string)dbObjectRow[0]);
objectNode.Name = logicalConnectionName + ":Object:" + (string)dbObjectRow[0];
}
collectionNode.Nodes.Add(objectNode);
}
}
}
return metaNode;
}
}
}

56
src/AddIns/Misc/SharpServerTools/OracleDbToolsProvider/Src/Forms/TableTreeNode.cs

@ -0,0 +1,56 @@ @@ -0,0 +1,56 @@
/*
* User: dickon
* Date: 23/09/2006
* Time: 10:57
*
*/
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Data;
using SharpDbTools.Forms;
using SharpDbTools.Data;
using SharpServerTools.Forms;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Gui;
namespace SharpDbTools.Oracle.Forms
{
/// <summary>
/// specialisation of the TreeNode to add context menu and click handling
/// to invoke the DescribeTable component for Oracle tables.
/// Does not change any data or metadata content so does not need to be
/// a ServerExplorerTreeNode
/// </summary>
class TableTreeNode: TreeNode
{
string logicalConnectionName;
public TableTreeNode(string objectName, string logicalConnectionName): base(objectName)
{
this.logicalConnectionName = logicalConnectionName;
NodeAwareContextMenuStrip cMenu = new NodeAwareContextMenuStrip(this);
ToolStripMenuItem invokeDescriberMenuItem = new ToolStripMenuItem("Describe");
invokeDescriberMenuItem.Click += new EventHandler(DescribeTableClickHandler);
cMenu.Items.Add(invokeDescriberMenuItem);
this.ContextMenuStrip = cMenu;
}
public void DescribeTableClickHandler(object sender, EventArgs args)
{
ToolStripMenuItem item = sender as ToolStripMenuItem;
NodeAwareContextMenuStrip s = item.Owner as NodeAwareContextMenuStrip;
string tableName = s.TreeNode.Text;
LoggingService.Debug("describe table clicked for: " + logicalConnectionName + " and table name: " + tableName);
DataTable tableInfo = DbModelInfoService.GetTableInfo(logicalConnectionName, tableName);
TableDescribeViewContent tableDescribeViewContent = new TableDescribeViewContent(tableInfo, tableName);
WorkbenchSingleton.Workbench.ShowView(tableDescribeViewContent);
}
}
}

67
src/AddIns/Misc/SharpServerTools/ServerBrowserTool/ServerBrowserTool.csproj

@ -0,0 +1,67 @@ @@ -0,0 +1,67 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<OutputType>Library</OutputType>
<RootNamespace>ServerBrowserTool</RootNamespace>
<AssemblyName>ServerBrowserTool</AssemblyName>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{D721EAA4-8A40-4EF0-A011-5862159BE621}</ProjectGuid>
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<NoStdLib>False</NoStdLib>
<RegisterForComInterop>False</RegisterForComInterop>
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
<BaseAddress>4194304</BaseAddress>
<PlatformTarget>AnyCPU</PlatformTarget>
<FileAlignment>4096</FileAlignment>
<WarningLevel>4</WarningLevel>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<OutputPath>..\..\..\..\..\AddIns\AddIns\Misc\SharpServerTools\</OutputPath>
<Optimize>False</Optimize>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugSymbols>true</DebugSymbols>
<DebugType>Full</DebugType>
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<OutputPath>bin\Release\</OutputPath>
<Optimize>True</Optimize>
<DefineConstants>TRACE</DefineConstants>
<DebugSymbols>False</DebugSymbols>
<DebugType>None</DebugType>
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Xml" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="System.Drawing" />
</ItemGroup>
<ItemGroup>
<Compile Include="Src\Forms\ServerToolTreeView.cs" />
<Compile Include="Src\Forms\IInitializable.cs" />
<Compile Include="Src\Forms\NodeAwareContextMenuStrip.cs" />
<Compile Include="Src\Forms\RebuildRequiredEvents.cs" />
<Compile Include="Src\Forms\ServerBrowserTool.cs" />
<Compile Include="Src\Configuration\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<Folder Include="Src" />
<Folder Include="Src\Configuration" />
<Folder Include="Src\Forms" />
<Content Include="SharpServerTools.addin">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<ProjectReference Include="..\..\..\..\Main\Core\Project\ICSharpCode.Core.csproj">
<Project>{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}</Project>
<Name>ICSharpCode.Core</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Main\Base\Project\ICSharpCode.SharpDevelop.csproj">
<Project>{2748AD25-9C63-4E12-877B-4DCE96FBED54}</Project>
<Name>ICSharpCode.SharpDevelop</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
</Project>

6
src/AddIns/Misc/SharpServerTools/ServerBrowserTool/ServerBrowserTool.sln

@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 9.00
# SharpDevelop 2.1.0.1900
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServerBrowserTool", "ServerBrowserTool.csproj", "{D721EAA4-8A40-4EF0-A011-5862159BE621}"
EndProject
Global
EndGlobal

24
src/AddIns/Misc/SharpServerTools/ServerBrowserTool/SharpServerTools.addin

@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
<AddIn name = "SharpDbTools"
author = "Dickon Field"
url = ""
description = "A collection of components and tools to help develop db-aware apps... and more">
<Manifest>
<Identity name = "ICSharpCode.SharpServerTools"/>
</Manifest>
<Runtime>
<Import assembly = "SharpDbTools.dll"/>
<Import assembly = "ServerBrowserTool.dll"/>
<Import assembly="OracleDbToolsProvider.dll"/>
</Runtime>
<Path name = "/SharpDevelop/Workbench/Pads">
<Pad id = "SharpServerToolsPad"
category = "Main"
title = "Server Explorer"
icon = "PadIcons.Output"
shortcut = "Control|Alt|D"
class = "SharpServerTools.Forms.ServerBrowserTool"/>
</Path>
</AddIn>

31
src/AddIns/Misc/SharpServerTools/ServerBrowserTool/Src/Configuration/AssemblyInfo.cs

@ -0,0 +1,31 @@ @@ -0,0 +1,31 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 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("ServerBrowserTool")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ServerBrowserTool")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// This sets the default COM visibility of types in the assembly to invisible.
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
[assembly: ComVisible(false)]
// 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.*")]

19
src/AddIns/Misc/SharpServerTools/ServerBrowserTool/Src/Forms/IInitializable.cs

@ -0,0 +1,19 @@ @@ -0,0 +1,19 @@
/*
* User: dickon
* Date: 01/10/2006
* Time: 23:22
*
*/
using System;
namespace SharpServerTools.Forms
{
/// <summary>
/// Implemented by anything that is initializable
/// </summary>
public interface IInitializable
{
void Initialize();
}
}

28
src/AddIns/Misc/SharpServerTools/ServerBrowserTool/Src/Forms/NodeAwareContextMenuStrip.cs

@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
/*
* User: dickon
* Date: 23/09/2006
* Time: 23:09
*
*/
using System;
using System.Windows.Forms;
namespace SharpServerTools.Forms
{
public class NodeAwareContextMenuStrip : ContextMenuStrip
{
TreeNode treeNodeAttached;
public NodeAwareContextMenuStrip(TreeNode treeNodeAttached) : base()
{
this.treeNodeAttached = treeNodeAttached;
}
public TreeNode TreeNode {
get {
return treeNodeAttached;
}
}
}
}

56
src/AddIns/Misc/SharpServerTools/ServerBrowserTool/Src/Forms/RebuildRequiredEvents.cs

@ -0,0 +1,56 @@ @@ -0,0 +1,56 @@
/*
* User: dickon
* Date: 24/09/2006
* Time: 08:01
*
*/
using System;
using System.Windows.Forms;
using System.Collections;
namespace SharpServerTools.Forms
{
/// <summary>
/// An IRebuildable can be asked to rebuild its Node tree
/// </summary>
public interface IRebuildable
{
void Rebuild();
}
/// <summary>
/// An IRequiresRebuildSource can request the ServerToolTreeView to rebuild
/// it by emitting the RebuildRequiredEvent
/// </summary>
public interface IRequiresRebuildSource
{
event RebuildRequiredEventHandler RebuildRequiredEvent;
}
public delegate void RebuildRequiredEventHandler(object sender, RebuildRequiredEventArgs e);
/// <summary>
/// An IRequiresRebuildSource should add a reference to itself to
/// this event if it wants to be rebuilt.
/// The parent of an IRequiresRebuildSource may or may not add itself
/// and resend the event to the ServerToolTreeView depending on the
/// relationship between parent and child.
/// </summary>
public class RebuildRequiredEventArgs: EventArgs
{
ArrayList rebuildNodes = new ArrayList();
public IEnumerable Nodes {
get {
return rebuildNodes;
}
}
public void AddNode(IRebuildable node)
{
rebuildNodes.Add(node);
}
}
}

78
src/AddIns/Misc/SharpServerTools/ServerBrowserTool/Src/Forms/ServerBrowserTool.cs

@ -0,0 +1,78 @@ @@ -0,0 +1,78 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Dickon Field" email=""/>
// <version>$Revision: 1766 $</version>
// </file>
/*
* User: Dickon Field
* Date: 12/06/2006
* Time: 06:25
*/
using System;
using System.Windows.Forms;
using System.Collections.Generic;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui;
namespace SharpServerTools.Forms
{
/// <summary>
/// Enables a user to browse metadata associated with a db server and to open resources
/// referenced therein. The intention is to extend this to other server processes over
/// time.
/// </summary>
public class ServerBrowserTool : AbstractPadContent
{
Panel ctl;
ServerToolTreeView dbTree;
/// <summary>
/// ServerBrowserTool hosts one or more TreeViews providing views of types
/// of server. Currently it shows only relational database servers.
/// </summary>
public ServerBrowserTool()
{
LoggingService.Debug("Loading ServerBrowserTool");
dbTree = new ServerToolTreeView();
dbTree.Dock = DockStyle.Fill;
ctl = new Panel();
ctl.Controls.Add(dbTree);
dbTree.Rebuild();
}
/// <summary>
/// The <see cref="System.Windows.Forms.Control"/> representing the pad
/// </summary>
public override Control Control {
get {
return ctl;
}
}
/// <summary>
/// Rebuildes the pad
/// </summary>
public override void RedrawContent()
{
}
/// <summary>
/// Cleans up all used resources
/// </summary>
public override void Dispose()
{
ctl.Dispose();
}
}
}

77
src/AddIns/Misc/SharpServerTools/ServerBrowserTool/Src/Forms/ServerToolTreeView.cs

@ -0,0 +1,77 @@ @@ -0,0 +1,77 @@
/*
* User: dickon
* Date: 23/09/2006
* Time: 23:07
*
*/
using System;
using System.Windows.Forms;
using System.Collections;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui;
namespace SharpServerTools.Forms
{
/// <summary>
/// Provides a tree-structured visual rendering of server instances.
/// This class should not hold references to server data, but should render its
/// content using data retrieved from business services responsible for
/// maintaining this model/s of underlying services.
/// </summary>
public class ServerToolTreeView : TreeView, IRebuildable
{
public ServerToolTreeView(): base()
{
// TODO: iterate through plugins retrieved from AddIn Tree
Type dbExplorerType = Type.GetType("SharpDbTools.Forms.DatabaseExplorerTreeNode, SharpDbTools");
TreeNode dbExplorerNode = (TreeNode)Activator.CreateInstance(dbExplorerType);
IRequiresRebuildSource s = dbExplorerNode as IRequiresRebuildSource;
s.RebuildRequiredEvent += new RebuildRequiredEventHandler(RebuildRequiredNotify);
this.Nodes.Add(dbExplorerNode);
}
public void RebuildChildren(IEnumerable children)
{
// Rebuild each of the root nodes in the ServerToolTreeView
// Currently this comprises the Database Explorer
IEnumerable n = children;
if (n == null) {
n = this.Nodes;
}
this.BeginUpdate();
foreach (object o in n) {
IRebuildable se = (IRebuildable)o;
se.Rebuild();
}
this.EndUpdate();
}
private void RebuildRequiredNotify(object sender, RebuildRequiredEventArgs e)
{
IEnumerable children = e.Nodes;
if (this.InvokeRequired) {
this.Invoke(new RebuildChildrenDelegate(RebuildChildren), new object[] {children});
}
else {
RebuildChildren(children);
}
}
public void Rebuild()
{
if (this.InvokeRequired) {
this.Invoke(new RebuildChildrenDelegate(RebuildChildren), new object[] {null});
}
else {
this.RebuildChildren(null);
}
}
}
public delegate void RebuildChildrenDelegate(IEnumerable children);
}

76
src/AddIns/Misc/SharpServerTools/SharpDbTools/SharpDbTools.csproj

@ -0,0 +1,76 @@ @@ -0,0 +1,76 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<OutputType>Library</OutputType>
<RootNamespace>SharpDbTools</RootNamespace>
<AssemblyName>SharpDbTools</AssemblyName>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{93B2D6DF-7588-40C0-8A35-CA0DD7328FC3}</ProjectGuid>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<OutputPath>bin\Debug\</OutputPath>
<Optimize>False</Optimize>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugSymbols>True</DebugSymbols>
<DebugType>Full</DebugType>
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<OutputPath>bin\Release\</OutputPath>
<Optimize>True</Optimize>
<DefineConstants>TRACE</DefineConstants>
<DebugSymbols>False</DebugSymbols>
<DebugType>None</DebugType>
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Xml" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Src\Configuration\AssemblyInfo.cs" />
<Compile Include="Src\Forms\TableDescribeViewContent.cs" />
<Compile Include="Src\Forms\ConnectionStringDefinitionDialog.cs" />
<Compile Include="Src\Forms\ConnectionStringDefinitionDialog.Designer.cs" />
<Compile Include="Src\Forms\DatabaseExplorerTreeNode.cs" />
<Compile Include="Src\Forms\DbModelInfoTreeNode.cs" />
<Compile Include="Src\Forms\FormsArtefactFactories.cs" />
<Compile Include="Src\Forms\FormsArtefactFactory.cs" />
<Compile Include="Src\Forms\GetConnectionLogicalNameDialog.cs" />
<Compile Include="Src\Forms\GetConnectionLogicalNameDialog.Designer.cs" />
<EmbeddedResource Include="Src\Forms\ConnectionStringDefinitionDialog.resx">
<DependentUpon>ConnectionStringDefinitionDialog.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Src\Forms\GetConnectionLogicalNameDialog.resx">
<DependentUpon>GetConnectionLogicalNameDialog.cs</DependentUpon>
</EmbeddedResource>
<Compile Include="Src\Data\TableNames.cs" />
<Compile Include="Src\Data\ColumnNames.cs" />
<Compile Include="Src\Data\DbModelInfo.cs" />
<Compile Include="Src\Data\DbModelInfoService.cs" />
<Compile Include="Src\Data\DbProvidersService.cs" />
</ItemGroup>
<ItemGroup>
<Folder Include="Src" />
<Folder Include="Src\Configuration" />
<Folder Include="Src\Data" />
<Folder Include="Src\Forms" />
<ProjectReference Include="..\..\..\..\Main\Core\Project\ICSharpCode.Core.csproj">
<Project>{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}</Project>
<Name>ICSharpCode.Core</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Main\Base\Project\ICSharpCode.SharpDevelop.csproj">
<Project>{2748AD25-9C63-4E12-877B-4DCE96FBED54}</Project>
<Name>ICSharpCode.SharpDevelop</Name>
</ProjectReference>
<ProjectReference Include="..\ServerBrowserTool\ServerBrowserTool.csproj">
<Project>{D721EAA4-8A40-4EF0-A011-5862159BE621}</Project>
<Name>ServerBrowserTool</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
</Project>

6
src/AddIns/Misc/SharpServerTools/SharpDbTools/SharpDbTools.sln

@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 9.00
# SharpDevelop 2.1.0.1900
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpDbTools", "SharpDbTools.csproj", "{93B2D6DF-7588-40C0-8A35-CA0DD7328FC3}"
EndProject
Global
EndGlobal

21
src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Configuration/AssemblyInfo.cs

@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Dickon Field" email=""/>
// <version>$Revision: 1760 $</version>
// </file>
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: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

34
src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Data/ColumnNames.cs

@ -0,0 +1,34 @@ @@ -0,0 +1,34 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Dickon Field" email=""/>
// <version>$Revision: 1784 $</version>
// </file>
/*
* User: dickon
* Date: 30/07/2006
* Time: 23:37
*
*/
using System;
namespace SharpDbTools.Data
{
/// <summary>
/// Description of Columns.
/// </summary>
public sealed class ColumnNames
{
public const string InvariantName = "invariantName";
public const string Name = "name";
public const string ConnectionString = "connectionString";
public const string TableName = "TABLE_NAME";
public static string[] TableTableFieldsToDisplay =
new string [] {"COLUMN_NAME", "DATATYPE",
"LENGTH", "PRECISION", "SCALE", "NULLABLE"};
public static string[] TableTableFieldsColumnHeaders =
new string[] { "Column", "Type", "Length", "Precision", "Scale", "Nullable" };
}
}

181
src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Data/DbModelInfo.cs

@ -0,0 +1,181 @@ @@ -0,0 +1,181 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Dickon Field" email=""/>
// <version>$Revision: 1784 $</version>
// </file>
/*
* User: Dickon Field
* Date: 10/07/2006
* Time: 09:12
*
*/
using System;
using System.Data;
using System.Data.Common;
using System.Collections.Generic;
using ICSharpCode.Core;
namespace SharpDbTools.Data
{
/// <summary>
/// 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.
/// </summary>
///
public class DbModelInfo: DataSet
{
public const string METADATACOLLECTIONS = "MetaDataCollections";
public DbModelInfo() : base()
{
}
public DbModelInfo(string name) : base()
{
DataTable table = CreateConnectionInfoTable();
// add the first and only column of this table;
table.Rows.Add(new object[] {name, null, null});
}
public DbModelInfo(string name, string invariantName, string connectionString): base()
{
DataTable table = CreateConnectionInfoTable();
// add the first and only column of this table;
table.Rows.Add(new object[] {name, invariantName, connectionString});
}
public string Name {
get {
DataTable table = this.Tables[TableNames.ConnectionInfo];
string name = table.Rows[0][ColumnNames.Name] as string;
return name;
}
}
public string InvariantName {
get {
DataTable table = this.Tables[TableNames.ConnectionInfo];
string invariantName = null;
try {
invariantName = table.Rows[0][ColumnNames.InvariantName] as string;
}
catch(ArgumentException) {
// see comment below - it is correct to bury this exception
//LoggingService.Info("InvariantName property was accessed while undefined" + e);
}
return invariantName;
}
set {
DataTable table = this.Tables[TableNames.ConnectionInfo];
string invariantName = table.Rows[0][ColumnNames.InvariantName] as string;
string name = this.Name;
string connectionString = this.ConnectionString;
if (invariantName == null) {
table.Rows[0][ColumnNames.InvariantName] = value;
}
// if invariant has changed must clear any existing metadata
else if (!(invariantName.Equals(value))) {
// clear tables
this.Clear();
DataTable newTable = CreateConnectionInfoTable();
// add the first and only column of this table;
newTable.Rows.Add(new object[] {name, invariantName, connectionString});
}
}
}
public string ConnectionString {
get {
DataTable table = this.Tables[TableNames.ConnectionInfo];
string connectionString = null;
try {
connectionString = table.Rows[0][ColumnNames.ConnectionString] as string;
}
catch(ArgumentException) {
// this simply indicates that this attribute was not defined when the
// DbModelInfo was saved, returning null makes sense here - so it is
// correct to bury this exception
//LoggingService.Info("InvariantName property was accessed while undefined" + e);
}
return connectionString;
}
set {
DataTable table = this.Tables[TableNames.ConnectionInfo];
string connectionString = this.ConnectionString;
if (connectionString == null) {
table.Rows[0][ColumnNames.ConnectionString] = value;
}
else if (!(connectionString.Equals(value))) {
string invariantName = this.InvariantName;
string name = this.Name;
this.Clear();
// add the first and only column of this table;
table.Rows.Add(new object[] {name, invariantName, value});
}
}
}
public void SetConnectionInfo(string invariantName, string connectionString)
{
string name = this.Name;
SetConnectionInfo(name, invariantName, connectionString);
}
public void SetConnectionInfo(string name, string invariantName,
string connectionString)
{
this.Clear();
DataTable table = CreateConnectionInfoTable();
// add the first and only column of this table;
table.Rows.Add(new object[] {name, invariantName, connectionString});
}
private DataTable CreateConnectionInfoTable()
{
// create a table in the DbModelInfo to hold this initial info.
// this creates a consistent representation of the data and makes
// it easier to serialise it
DataTable table = this.Tables.Add(TableNames.ConnectionInfo);
table.Columns.Add(ColumnNames.Name, typeof(string));
table.Columns.Add(ColumnNames.InvariantName, typeof(string));
table.Columns.Add(ColumnNames.ConnectionString, typeof(string));
return table;
}
public void ClearMetaData()
{
DataTable metadataCollectionsTable = this.MetaDataCollections;
if (metadataCollectionsTable != null) {
foreach (DataRow collectionRow in metadataCollectionsTable.Rows) {
String collectionName = (string)collectionRow[0];
this.Tables.Remove(collectionName);
}
}
}
public DataTable MetaDataCollections {
get {
return this.Tables[METADATACOLLECTIONS];
}
}
public DataTable this[string collectionName] {
get {
return this.Tables[collectionName];
}
}
}
}

295
src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Data/DbModelInfoService.cs

@ -0,0 +1,295 @@ @@ -0,0 +1,295 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Dickon Field" email=""/>
// <version>$Revision: 1784 $</version>
// </file>
/*
* User: dickon
* Date: 28/07/2006
* Time: 21:55
*
*/
using System;
using System.Data;
using System.Data.Common;
using System.Collections.Generic;
using System.IO;
using ICSharpCode.Core;
namespace SharpDbTools.Data
{
/// <summary>
/// Manages a collection of DbModelInfo:
/// - retrieval from files
/// - opening (essentially refreshing) from a database connection
/// - adding for new connection data (name, invariant name, connection string)
/// - saving to files
/// </summary>
public static class DbModelInfoService
{
static string saveLocation = null;
static object lockObject = new Object();
const string dbFilesDir = "DbTools";
static SortedList<string, DbModelInfo> cache = null;
public static IList<string> Names {
get {
lock(lockObject) {
if (cache == null) {
cache = new SortedList<string, DbModelInfo>();
LoadNamesFromFiles();
}
}
return cache.Keys;
}
}
/// <summary>
///
/// </summary>
/// <param name="name">The user readable name of the provider</param>
/// <param name="invariantName">the identifying name of the provider</param>
/// <param name="connectionString">the connection string for this connection</param>
/// <returns></returns>
public static DbModelInfo Add(string name, string invariantName, string connectionString)
{
// TODO: add validation on name; invariant name
// assume that connection string is valid - if it fails an exception will be thrown later
// this allows partially defined connection strings at least to be saved and worked on later
DbModelInfo dbModel = new DbModelInfo(name, invariantName, connectionString);
// add to cache
cache.Add(name, dbModel);
return dbModel;
}
public static void Remove(string name)
{
cache.Remove(name);
}
public static DbModelInfo GetDbModelInfo(string name) {
DbModelInfo modelInfo = null;
bool exists = cache.TryGetValue(name, out modelInfo);
return modelInfo;
}
public static DataTable GetTableInfo(string modelName, string tableName)
{
LoggingService.Debug("-->GetTableInfo");
DbModelInfo modelInfo = GetDbModelInfo(modelName);
DataTable columnTable = modelInfo.Tables[TableNames.Columns];
DataRow[] columnsMetadata = columnTable.Select(ColumnNames.TableName + "='" + tableName + "'");
LoggingService.Debug("found: " + columnsMetadata.Length + " columns belonging to table: " + tableName);
DataTable tableInfo = new DataTable();
DataColumnCollection cols = columnTable.Columns;
foreach (DataColumn c in cols) {
DataColumn nc = new DataColumn(c.ColumnName, c.DataType);
tableInfo.Columns.Add(nc);
}
foreach (DataRow r in columnsMetadata) {
DataRow newRow = tableInfo.NewRow();
newRow.ItemArray = r.ItemArray;
tableInfo.Rows.Add(newRow);
tableInfo.AcceptChanges();
}
return tableInfo;
}
public static DbModelInfo LoadMetadataFromConnection(string name)
{
// get the DbModelInfo
DbModelInfo modelInfo = null;
bool exists = cache.TryGetValue(name, out modelInfo);
if (!exists)
{
// TODO: more detail...
throw new KeyNotFoundException();
}
// get the invariant name and connection string
string invariantName = modelInfo.InvariantName;
string connectionString = modelInfo.ConnectionString;
// get a connection - wait until a connection has been successfully made
// before clearing the DbModelInfo
DbProvidersService factoryService = DbProvidersService.GetDbProvidersService();
DbConnection connection = null;
try {
DbProviderFactory factory = factoryService.GetFactoryByInvariantName(invariantName);
connection = factory.CreateConnection();
modelInfo.ClearMetaData();
// reload the metadata from the connection
// get the Schema table
connection.ConnectionString = connectionString;
connection.Open();
DataTable schemaInfo = connection.GetSchema();
// clear the DbModelInfo prior to refreshing from the connection
modelInfo.ClearMetaData();
// 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);
modelInfo.Merge(nextMetaData);
}
return modelInfo;
}
catch(Exception e) {
LoggingService.Fatal("Exception caught while trying to retrieve database metadata: " + e);
throw e;
}
finally {
connection.Close();
}
}
/// <summary>
///
/// </summary>
/// <param name="name">the logical name of the DbModelInfo to save to a file</param>
/// <param name="overwriteExistingFile">if true, any existing file will be overwritten</param>
/// <returns>true if the DbModelInfo was saved, false if not. It will not be saved if
/// either overwriteExistingFile is set to true, and there is an existing file</returns>
public static bool SaveToFile(string name, bool overwriteExistingFile)
{
string path = GetSaveLocation();
DbModelInfo modelInfo = null;
cache.TryGetValue(name, out modelInfo);
if (modelInfo != null) {
string modelName = modelInfo.Name;
// write to a file in 'path' called <name>.metadata
// TODO: may want to consider ways of making this more resilient
string connectionProps = modelInfo.ConnectionString;
string invariantName = modelInfo.InvariantName;
string filePath = path + @"\" + name + ".metadata";
LoggingService.Debug("writing metadata to: " + filePath);
if (File.Exists(filePath)) {
if (overwriteExistingFile) {
File.Delete(filePath);
} else {
return false;
}
}
using (StreamWriter sw = File.CreateText(filePath)) {
string xml = modelInfo.GetXml();
sw.Write(xml);
sw.Flush();
sw.Close();
return true;
}
} else {
throw new DbModelInfoDoesNotExistException(name);
}
}
public static void SaveAll()
{
foreach (string name in cache.Keys) {
SaveToFile(name, true);
}
}
public static void LoadNamesFromFiles()
{
// load DbModelInfo's from file system
string saveLocation = GetSaveLocation();
LoggingService.Debug("looking for metadata files at: " + saveLocation);
string[] files = Directory.GetFileSystemEntries(saveLocation);
cache.Clear();
for (int i = 0; i < files.Length; i++) {
LoggingService.Debug("found to load metadata from: " + files[i]);
int start = files[i].LastIndexOf('\\');
int end = files[i].LastIndexOf('.');
start++;
string name = files[i].Substring(start, end - start);
DbModelInfo nextModel = new DbModelInfo(name);
cache.Add(nextModel.Name, nextModel);
}
}
public static void LoadFromFiles()
{
// load DbModelInfo's from file system
string saveLocation = GetSaveLocation();
string[] files = Directory.GetFiles(saveLocation);
cache.Clear();
for (int i = 0; i < files.Length; i++) {
DbModelInfo nextModel = LoadFromFileAtPath(@files[i]);
cache.Add(nextModel.Name, nextModel);
}
}
private static DbModelInfo LoadFromFileAtPath(string filePath)
{
LoggingService.Debug("loading DbModelInfo from filePath: " + filePath);
DbModelInfo nextModel = new DbModelInfo();
nextModel.ReadXml(filePath);
return nextModel;
}
public static void LoadFromFile(string logicalConnectionName)
{
LoggingService.Debug("loading DbModelInfo for name: " + logicalConnectionName);
string saveLocation = GetSaveLocation();
string path = saveLocation + "\\" + logicalConnectionName + ".metadata";
DbModelInfo info = LoadFromFileAtPath(path);
cache.Remove(logicalConnectionName);
cache.Add(logicalConnectionName, info);
}
private static string GetSaveLocation()
{
// append the path of the directory for saving Db files
if (saveLocation == null) {
lock(lockObject) {
string configDir = PropertyService.ConfigDirectory;
saveLocation = configDir + @"\" + dbFilesDir;
saveLocation = saveLocation.Replace("/", @"\");
}
}
if (!Directory.Exists(saveLocation)) {
Directory.CreateDirectory(@saveLocation);
}
return saveLocation;
}
}
public class DbModelInfoDoesNotExistException: ApplicationException
{
string name;
public DbModelInfoDoesNotExistException(string dbModelInfoName): base()
{
this.name = dbModelInfoName;
}
public string Name {
get {
return name;
}
}
}
}

124
src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Data/DbProvidersService.cs

@ -0,0 +1,124 @@ @@ -0,0 +1,124 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Dickon Field" email=""/>
// <version>$Revision: 1697 $</version>
// </file>
/*
* Responsibilities:<br>
* <br>
* Collaboration:<br>
* <br>
* User: Dickon Field
* Date: 21/05/2006
* Time: 23:19
*
*/
using System;
using System.Data.Common;
using System.Data;
using System.Collections.Generic;
using ICSharpCode.Core;
namespace SharpDbTools.Data
{
/// <summary>
/// A utility class that caches the DbProviderFactory and DbConnectionString
/// objects whose state is stored in the current processes config space.
/// </summary>
public class DbProvidersService
{
private static DbProvidersService me = new DbProvidersService();
private static Boolean initialized = false;
private Dictionary<string, DbProviderFactory> factories = new Dictionary<string, DbProviderFactory>();
private Dictionary<string, DbProviderFactory> factoriesByInvariantName = new Dictionary<string, DbProviderFactory>();
// This is only valid witin one session - do not persist
private Dictionary<string, string> invariantByNameLookup = new Dictionary<string, string>();
private List<string> names = new List<string>();
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)
{
// TODO: factor out string literals for column names
string name = (string)row["Name"];
string invariantName = (string)row["InvariantName"];
LoggingService.Debug("adding lookup for: " + name + " to: + " + invariantName);
invariantByNameLookup.Add(name, invariantName);
//factoryData.Add(name, row);
LoggingService.Debug("retrieving DbProviderFactory for Name: " + name + " InvariantName: " + invariantName);
DbProviderFactory factory = DbProviderFactories.GetFactory(row);
names.Add(name);
factories.Add(name, factory);
factoriesByInvariantName.Add(invariantName, factory);
}
initialized = true;
}
public List<string> Names
{
get
{
return names;
}
}
public string this[int i]
{
get
{
return names[i];
}
}
public string GetInvariantName(string name) {
string invariantName = null;
invariantByNameLookup.TryGetValue(name, out invariantName);
return invariantName;
}
public DbProviderFactory this[string name]
{
get
{
return factories[name];
}
set
{
factories[name] = value;
}
}
public DbProviderFactory GetFactoryByInvariantName(string invariantName)
{
DbProviderFactory factory = null;
this.factoriesByInvariantName.TryGetValue(invariantName, out factory);
return factory;
}
public static DbProvidersService GetDbProvidersService()
{
lock(me)
{
if (!initialized)
{
me.Initialize();
}
}
return me;
}
}
}

29
src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Data/TableNames.cs

@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Dickon Field" email=""/>
// <version>$Revision: 1784 $</version>
// </file>
/*
* User: dickon
* Date: 30/07/2006
* Time: 23:35
*
*/
using System;
namespace SharpDbTools.Data
{
/// <summary>
/// Description of Tables.
/// </summary>
public sealed class TableNames
{
public const string MetaDataCollections = "MetaDataCollections";
public const string ConnectionInfo = "ConnectionInfo";
public static string[] PrimaryObjects = new string[] { "Tables", "Procedures", "Functions", "Views", "Users" };
public const string Columns = "Columns";
}
}

239
src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/ConnectionStringDefinitionDialog.Designer.cs generated

@ -0,0 +1,239 @@ @@ -0,0 +1,239 @@
/*
* Responsibilities:<br>
* <br>
* Collaboration:<br>
* <br>
* User: ${USER}
* Date: ${DATE}
* Time: ${TIME}
*
*/
namespace SharpDbTools.Forms
{
partial class ConnectionStringDefinitionDialog : System.Windows.Forms.Form
{
/// <summary>
/// Designer variable used to keep track of non-visual components.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Disposes resources used by the form.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing) {
if (components != null) {
components.Dispose();
}
}
base.Dispose(disposing);
}
/// <summary>
/// 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.
/// </summary>
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;
}
}

257
src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/ConnectionStringDefinitionDialog.cs

@ -0,0 +1,257 @@ @@ -0,0 +1,257 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Dickon Field" email=""/>
// <version>$Revision: 1684 $</version>
// </file>
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Data.Common;
using System.ComponentModel;
using SharpDbTools.Data;
namespace SharpDbTools.Forms
{
/// <summary>
/// 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.
/// </summary>
public partial class ConnectionStringDefinitionDialog
{
ToolStripProgressBar connectionTestProgressBar = new ToolStripProgressBar();
ConnectionTestBackgroundWorker testConnectionBackgroundWorker;
string resultMessage;
string invariantName;
ConnectionTestState connectionTestState = ConnectionTestState.UnTested;
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 InvariantName {
get {
return this.invariantName;
}
set {
this.invariantName = value;
}
}
public ConnectionTestState ConnectionTestState {
get {
return this.connectionTestState;
}
}
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<string> names = service.Names;
this.providerTypeComboBox.DataSource = names;
this.connStringResult.Text = this.ConnectionString;
}
void CancelButtonClick(object sender, System.EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
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.BeginInvoke(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 = "";
this.connectionTestState = ConnectionTestState.UnTested;
}
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";
connectionTestState = ConnectionTestState.TestSucceeded;
}
catch(Exception ex)
{
e.Result = "Connection Failed: " + ex.Message;
connectionTestState = ConnectionTestState.TestFailed;
}
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)
{
string name = (string)this.providerTypeComboBox.SelectedItem;
DbProvidersService service = DbProvidersService.GetDbProvidersService();
this.InvariantName = service.GetInvariantName(name);
this.DialogResult = DialogResult.OK;
this.Close();
}
}
public enum ConnectionTestState
{
UnTested,
TestFailed,
TestSucceeded
}
class ConnectionTestBackgroundWorker: BackgroundWorker
{
private string dbTypeName;
public ConnectionTestBackgroundWorker(string dbTypeName): base()
{
this.dbTypeName = dbTypeName;
}
public string DatabaseType
{
get
{
return dbTypeName;
}
}
}
}

126
src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/ConnectionStringDefinitionDialog.resx

@ -0,0 +1,126 @@ @@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="progressTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>247, 17</value>
</metadata>
<metadata name="statusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>371, 17</value>
</metadata>
</root>

147
src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/DatabaseExplorerTreeNode.cs

@ -0,0 +1,147 @@ @@ -0,0 +1,147 @@
/*
* User: dickon
* Date: 23/09/2006
* Time: 22:50
*
*/
using System;
using System.Windows.Forms;
using System.Collections.Generic;
using ICSharpCode.Core;
using SharpDbTools.Data;
using SharpServerTools.Forms;
namespace SharpDbTools.Forms
{
/// <summary>
/// Description of DatabaseExplorerNode.
/// Hold minimal state - access state through the DbModelInfoService
/// </summary>
public class DatabaseExplorerTreeNode: TreeNode, IRebuildable, IRequiresRebuildSource
{
public DatabaseExplorerTreeNode(): base("Database Explorer")
{
ContextMenuStrip cMenu = new ContextMenuStrip();
ToolStripMenuItem addConnectionMenuItem =
new ToolStripMenuItem("Add Connection");
addConnectionMenuItem.Click += new EventHandler(AddDbConnectionClickHandler);
ToolStripMenuItem deleteConnectionMenuItem =
new ToolStripMenuItem("Delete Connection");
deleteConnectionMenuItem.Click += new EventHandler(DeleteDbConnectionClickHandler);
ToolStripMenuItem saveMetadataMenuItem =
new ToolStripMenuItem("Save All");
saveMetadataMenuItem.Click += new EventHandler(SaveDbModelInfoClickHandler);
cMenu.Items.AddRange(new ToolStripMenuItem[]
{
addConnectionMenuItem,
deleteConnectionMenuItem,
saveMetadataMenuItem
}
);
this.ContextMenuStrip = cMenu;
}
public void Rebuild()
{
this.Nodes.Clear();
foreach (string name in DbModelInfoService.Names) {
LoggingService.Debug(this.GetType().ToString() + " getting DbModelInfoTreeNode for node: " + name);
DbModelInfoTreeNode dbModelInfoNode = CreateDbModelInfoNode(name);
dbModelInfoNode.RebuildRequiredEvent += new RebuildRequiredEventHandler(RebuildRequiredNotify);
this.Nodes.Add(dbModelInfoNode);
}
}
public event RebuildRequiredEventHandler RebuildRequiredEvent;
/// <summary>
/// DatabaseExplorerTreeNode chucks away any existing Nodes and recreates its tree when it
/// is triggered.
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
private void RebuildRequiredNotify(object sender, RebuildRequiredEventArgs e)
{
// adding this node because it wants to be rebuilt.
e.AddNode(this);
this.FireRebuildRequired(this, e);
}
private void FireRebuildRequired(object sender, RebuildRequiredEventArgs e)
{
if (this.RebuildRequiredEvent != null) {
RebuildRequiredEvent(this, e);
}
}
private DbModelInfoTreeNode CreateDbModelInfoNode(string name)
{
return new DbModelInfoTreeNode(name);
}
/// <summary>
/// Uses a dialog to get the logical name of a new Connection then
/// adds a new DbModelInfo for it to the cache and updates the DatabaseServer
/// Tree.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AddDbConnectionClickHandler(object sender, EventArgs e)
{
LoggingService.Debug("add connection clicked");
// get the logical name of the new connection
string logicalName = null;
using (GetConnectionLogicalNameDialog dialog = new GetConnectionLogicalNameDialog()) {
dialog.ShowDialog();
logicalName = dialog.LogicalConnectionName;
}
if (logicalName.Equals("") || logicalName == null) return;
LoggingService.Debug("name received is: " + logicalName);
// add a new DbModelInfo to the cache
DbModelInfoService.Add(logicalName, null, null);
// rebuild the database server node
RebuildRequiredEventArgs e1 = new RebuildRequiredEventArgs();
e1.AddNode(this as IRebuildable);
this.FireRebuildRequired(this, e1);
}
private void DeleteDbConnectionClickHandler(object sender, EventArgs e)
{
LoggingService.Debug("delete connection clicked");
}
private void SaveDbModelInfoClickHandler(object sender, EventArgs e)
{
// save each DbModelInfo separately, confirming overwrite where necessary
LoggingService.Debug("save all metadata clicked - will iterate through each and attempt to save");
IList<string> names = DbModelInfoService.Names;
foreach (string name in names) {
bool saved = DbModelInfoService.SaveToFile(name, false);
if (!saved) {
DialogResult result = MessageBox.Show("Overwrite existing file for connection: " + name + "?",
"File exists for connection", MessageBoxButtons.YesNo,
MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
if (result.Equals(DialogResult.Yes)) {
DbModelInfoService.SaveToFile(name, true);
}
}
}
}
}
}

210
src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/DbModelInfoTreeNode.cs

@ -0,0 +1,210 @@ @@ -0,0 +1,210 @@
/*
* User: dickon
* Date: 23/09/2006
* Time: 23:37
*
*/
using System;
using System.Windows.Forms;
using System.Data.Common;
using ICSharpCode.Core;
using SharpServerTools.Forms;
using SharpDbTools.Data;
namespace SharpDbTools.Forms
{
/// <summary>
/// Renders a view of the metadata and connection properties for a single
/// database connection. It is an IRequiresRebuildSource and can emit
/// RequiresRebuildEvents when the metadata etc are changed, but the
/// DatabaseExplorerTreeNode disposes of these and constructs new ones
/// when this occurs, so it is not an IRebuildable
/// </summary>
public class DbModelInfoTreeNode: TreeNode, IRequiresRebuildSource
{
public DbModelInfoTreeNode(string name): base(name)
{
// create and add the menustrip for this node
NodeAwareContextMenuStrip cMenu = new NodeAwareContextMenuStrip(this);
// create menu items
ToolStripMenuItem setConnectionStringMenuItem =
new ToolStripMenuItem("Set Connection String");
setConnectionStringMenuItem.Click += new EventHandler(SetConnectionStringOnDbModelInfoClickHandler);
ToolStripMenuItem loadMetadataFromConnectionMenuItem =
new ToolStripMenuItem("Load Metadata from Connection");
loadMetadataFromConnectionMenuItem.Click += new EventHandler(LoadMetadataFromConnectionClickHandler);
ToolStripMenuItem loadMetadataFromFileMenuItem =
new ToolStripMenuItem("Load Metadata from File");
loadMetadataFromFileMenuItem.Click += new EventHandler(LoadMetadataFromFileClickHandler);
cMenu.Items.AddRange(new ToolStripMenuItem[]
{
setConnectionStringMenuItem,
loadMetadataFromConnectionMenuItem,
loadMetadataFromFileMenuItem
});
this.ContextMenuStrip = cMenu;
this.Nodes.Clear();
TreeNode connectionPropsNode = CreateConnectionPropertiesNode(this.LogicalConnectionName);
TreeNode dbNode = CreateMetaDataNode(this.LogicalConnectionName);
this.Nodes.Add(connectionPropsNode);
this.Nodes.Add(dbNode);
}
public string LogicalConnectionName {
get {
return this.Text;
}
}
public event RebuildRequiredEventHandler RebuildRequiredEvent;
protected void FireRebuildRequired()
{
// HERE: the null eventargs indicates no desire to be rebuilt - is this correct?
if (RebuildRequiredEvent != null) {
// This object does not want to be rebuilt - it is discarded when there is
// a change in the underlying model. So, an event is posted without a ref
// to this object.
RebuildRequiredEventArgs eventArgs = new RebuildRequiredEventArgs();
RebuildRequiredEvent(this, eventArgs);
}
}
private TreeNode CreateConnectionPropertiesNode(string name)
{
// create sub TreeNodes for the connection string and invariant name if they exist
LoggingService.Debug("Looking for a Db Model Info for connection with name: " + name);
DbModelInfo modelInfo = DbModelInfoService.GetDbModelInfo(name);
if (modelInfo == null) {
LoggingService.Error("could not find a logical connection named: " + name);
throw new ArgumentException("this logical connection name is not defined: " + name);
}
string connectionString = modelInfo.ConnectionString;
string invariantName = modelInfo.InvariantName;
TreeNode attributesNode = new TreeNode("Connection Properties");
if (connectionString != null) {
TreeNode cstringNode = new TreeNode("Connection String: " + connectionString);
attributesNode.Nodes.Add(cstringNode);
}
if (invariantName != null) {
TreeNode invNameNode = new TreeNode("Invariant Name: " + invariantName);
attributesNode.Nodes.Add(invNameNode);
}
return attributesNode;
}
private TreeNode CreateMetaDataNode(string name)
{
LoggingService.Debug("creating metadata tree for connection with name: " + name);
TreeNode node = null;
// get the invariant name from the name, then get the FormsArtefactFactory
DbModelInfo modelInfo = DbModelInfoService.GetDbModelInfo(name);
if (modelInfo == null) {
LoggingService.Error("could not find a logical connection named: " + name);
throw new ArgumentException("this logical connection name is not defined: " + name);
}
string invariantName = modelInfo.InvariantName;
LoggingService.Debug("got invariant name: " + invariantName + " for connection name: " + name);
try {
LoggingService.Debug(this.GetType().ToString()
+ ": getting forms info for name: "
+ name + " and invariant name: "
+ invariantName);
FormsArtefactFactory factory = FormsArtefactFactories.GetFactory(invariantName);
node = factory.CreateMetaDataNode(name);
} catch(ArgumentException e) {
LoggingService.Debug(this.GetType().ToString()
+ " failed to create metadata node for connection: "
+ name + "\n"
+ e.Message + "\n"
+ e.GetType().ToString());
node = new TreeNode("No Metadata");
}
return node;
}
/// <summary>
/// Uses a dialog to get the logical name of a new Connection then
/// adds a new DbModelInfo for it to the cache and updates the DatabaseServer
/// Tree.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SetConnectionStringOnDbModelInfoClickHandler(object sender, EventArgs e)
{
string connectionLogicalName = this.Text;
LoggingService.Debug("add connection string clicked for item with name: " + connectionLogicalName);
// use the ConnectionStringDefinitionDialog to get a connection string and invariant name
ConnectionStringDefinitionDialog definitionDialog = new ConnectionStringDefinitionDialog();
DialogResult result = definitionDialog.ShowDialog();
// if the dialog was cancelled then do nothing
if (result == DialogResult.Cancel) {
return;
}
// if the dialog was submitted and connection string has changed then clear the DbModelInfo metadata
// note that is is not required for the Connection string to be valid - it may be work
// in progress and a user might want to save a partially formed connection string
DbModelInfo dbModelInfo = DbModelInfoService.GetDbModelInfo(connectionLogicalName);
string connectionString = dbModelInfo.ConnectionString;
string newConnectionString = definitionDialog.ConnectionString;
if (newConnectionString == null) {
return;
}
dbModelInfo.ConnectionString = newConnectionString;
dbModelInfo.InvariantName = definitionDialog.InvariantName;
// rebuild the database explorer node
this.FireRebuildRequired();
}
private void LoadMetadataFromFileClickHandler(object sender, EventArgs e)
{
LoggingService.Debug("load metadata from file clicked");
string logicalConnectionName = this.Text;
DbModelInfoService.LoadFromFile(logicalConnectionName);
this.FireRebuildRequired();
}
private void LoadMetadataFromConnectionClickHandler(object sender, EventArgs args)
{
string connectionLogicalName = this.Text;
LoggingService.Debug("load metadata from connection clicked for connection with name: "
+ connectionLogicalName);
try {
DbModelInfoService.LoadMetadataFromConnection(connectionLogicalName);
}
catch(DbException e) {
MessageService.ShowError(e,
"An Exception was thrown while trying to connect to: " + connectionLogicalName);
}
this.FireRebuildRequired();
}
}
}

55
src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/FormsArtefactFactories.cs

@ -0,0 +1,55 @@ @@ -0,0 +1,55 @@
/*
* User: dickon
* Date: 17/09/2006
* Time: 09:33
*
*/
using System;
using ICSharpCode.Core;
namespace SharpDbTools.Forms
{
/// <summary>
/// Description of FormsArtefactFactories.
/// </summary>
public class FormsArtefactFactories
{
public FormsArtefactFactories()
{
}
public static FormsArtefactFactory GetFactory(string invariantName)
{
LoggingService.Debug("Looking for FormsArtefactFactory for: " + invariantName);
// to test this base it on hardcoded strings for the type of the factory
// TODO: drive this from the AddIn tree
switch (invariantName)
{
case "System.Data.OracleClient":
Type type = Type.GetType("SharpDbTools.Oracle.Forms.OracleFormsArtefactFactory, OracleDbToolsProvider");
FormsArtefactFactory factory = (FormsArtefactFactory)Activator.CreateInstance(type);
LoggingService.Debug("Found FormsArtefactFactory for: " + invariantName);
return factory;
default:
LoggingService.Debug("Failed to find FormsArtefactFactory for: " + invariantName);
throw new ArgumentException("There is no FormsArtefactFactory for invariant name: " +
invariantName);
}
// TODO: retrieve the relevant factory from file-base config
// TODO: >>>>>>>>>>>>>>>>>>> NEXT: retrieve an XML element with mapping
// from invariant name to class name of FormsArtefactProvider
// options include specific config file or use of .net process config.
// 1. load the config file for DbTools FormsArtefacts
// 2. find the string name of the type of the FormsArtefactsFactory implementation
// corresponding to invariatName
// 3. use Type.GetType to create an instance of it and return it to the caller
}
}
}

24
src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/FormsArtefactFactory.cs

@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
/*
* User: dickon
* Date: 17/09/2006
* Time: 23:47
*
*/
using System;
using System.Windows.Forms;
namespace SharpDbTools.Forms
{
/// <summary>
/// Description of FormsArtefactFactory.
/// </summary>
public abstract class FormsArtefactFactory
{
public FormsArtefactFactory()
{
}
public abstract TreeNode CreateMetaDataNode(string name);
}
}

100
src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/GetConnectionLogicalNameDialog.Designer.cs generated

@ -0,0 +1,100 @@ @@ -0,0 +1,100 @@
/*
* User: dickon
* Date: 04/08/2006
* Time: 22:21
*/
namespace SharpDbTools.Forms
{
partial class GetConnectionLogicalNameDialog : System.Windows.Forms.Form
{
/// <summary>
/// Designer variable used to keep track of non-visual components.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Disposes resources used by the form.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing) {
if (components != null) {
components.Dispose();
}
}
base.Dispose(disposing);
}
/// <summary>
/// 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.
/// </summary>
private void InitializeComponent()
{
this.connectionName = new System.Windows.Forms.TextBox();
this.connectionNameOKButton = new System.Windows.Forms.Button();
this.connectionNameCancelButton = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// connectionName
//
this.connectionName.Location = new System.Drawing.Point(12, 33);
this.connectionName.MaxLength = 30;
this.connectionName.Name = "connectionName";
this.connectionName.Size = new System.Drawing.Size(292, 21);
this.connectionName.TabIndex = 0;
//
// connectionNameOKButton
//
this.connectionNameOKButton.Location = new System.Drawing.Point(66, 70);
this.connectionNameOKButton.Name = "connectionNameOKButton";
this.connectionNameOKButton.Size = new System.Drawing.Size(75, 23);
this.connectionNameOKButton.TabIndex = 1;
this.connectionNameOKButton.Text = "OK";
this.connectionNameOKButton.UseVisualStyleBackColor = true;
this.connectionNameOKButton.Click += new System.EventHandler(this.ConnectionNameOKButtonClick);
//
// connectionNameCancelButton
//
this.connectionNameCancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.connectionNameCancelButton.Location = new System.Drawing.Point(171, 70);
this.connectionNameCancelButton.Name = "connectionNameCancelButton";
this.connectionNameCancelButton.Size = new System.Drawing.Size(75, 23);
this.connectionNameCancelButton.TabIndex = 2;
this.connectionNameCancelButton.Text = "Cancel";
this.connectionNameCancelButton.UseVisualStyleBackColor = true;
this.connectionNameCancelButton.Click += new System.EventHandler(this.ConnectionNameCancelButtonClick);
//
// label1
//
this.label1.Location = new System.Drawing.Point(12, 9);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(259, 23);
this.label1.TabIndex = 3;
this.label1.Text = "Please provide the name for your db connection:";
//
// GetConnectionLogicalNameDialog
//
this.AcceptButton = this.connectionNameOKButton;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.connectionNameCancelButton;
this.ClientSize = new System.Drawing.Size(316, 114);
this.Controls.Add(this.label1);
this.Controls.Add(this.connectionNameCancelButton);
this.Controls.Add(this.connectionNameOKButton);
this.Controls.Add(this.connectionName);
this.Name = "GetConnectionLogicalNameDialog";
this.Text = "Connection Name";
this.ResumeLayout(false);
this.PerformLayout();
}
private System.Windows.Forms.TextBox connectionName;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button connectionNameCancelButton;
private System.Windows.Forms.Button connectionNameOKButton;
}
}

46
src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/GetConnectionLogicalNameDialog.cs

@ -0,0 +1,46 @@ @@ -0,0 +1,46 @@
/*
* User: dickon
* Date: 04/08/2006
* Time: 22:21
*/
using System;
using System.Drawing;
using System.Windows.Forms;
namespace SharpDbTools.Forms
{
/// <summary>
/// Description of GetConnectionLogicalNameDialog.
/// </summary>
public partial class GetConnectionLogicalNameDialog
{
public GetConnectionLogicalNameDialog()
{
//
// The InitializeComponent() call is required for Windows Forms designer support.
//
InitializeComponent();
//
// TODO: Add constructor code after the InitializeComponent() call.
//
}
public string LogicalConnectionName {
get {
return this.connectionName.Text;
}
}
void ConnectionNameOKButtonClick(object sender, System.EventArgs e)
{
this.Close();
}
void ConnectionNameCancelButtonClick(object sender, System.EventArgs e)
{
this.Close();
}
}
}

120
src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/GetConnectionLogicalNameDialog.resx

@ -0,0 +1,120 @@ @@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

72
src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/TableDescribeViewContent.cs

@ -0,0 +1,72 @@ @@ -0,0 +1,72 @@
/*
* User: dickon
* Date: 06/09/2006
* Time: 08:43
*
*/
using System;
using System.Data;
using System.Windows.Forms;
using ICSharpCode.SharpDevelop.Gui;
using SharpDbTools.Data;
namespace SharpDbTools.Forms
{
/// <summary>
/// Description of TableDescribeViewContent.
/// </summary>
public class TableDescribeViewContent : AbstractViewContent
{
DataTable tableInfo;
DataGridView tableInfoDataGridView;
public TableDescribeViewContent(DataTable tableInfo, string tableName) : base("table: " + tableName)
{
this.tableInfo = tableInfo;
this.tableInfoDataGridView = new DataGridView();
DataGridView v = this.tableInfoDataGridView;
v.AutoGenerateColumns = false;
v.AutoSize = true;
v.DataSource = this.tableInfo;
//v.DataMember = TableNames.Columns;
string[] fieldsToDisplay = ColumnNames.TableTableFieldsToDisplay;
string[] fieldColumnNames = ColumnNames.TableTableFieldsColumnHeaders;
for (int i = 0; i < fieldsToDisplay.Length; i++ ) {
DataGridViewColumn c = new DataGridViewTextBoxColumn();
c.DataPropertyName = fieldsToDisplay[i];
c.Name = fieldColumnNames[i];
v.Columns.Add(c);
}
v.AllowUserToAddRows = false;
v.AllowUserToDeleteRows = false;
v.AllowUserToResizeRows = false;
v.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
v.AutoResizeColumns();
}
public override System.Windows.Forms.Control Control {
get {
return this.tableInfoDataGridView;
}
}
public override bool IsReadOnly {
get {
return true;
}
}
public override bool IsViewOnly {
get {
return true;
}
}
}
}

24
src/AddIns/Misc/SharpServerTools/SharpServerTools.addin

@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
<AddIn name = "SharpDbTools"
author = "Dickon Field"
url = ""
description = "A collection of components and tools to help develop db-aware apps... and more">
<Manifest>
<Identity name = "ICSharpCode.SharpServerTools"/>
</Manifest>
<Runtime>
<Import assembly = "SharpDbTools.dll"/>
<Import assembly = "SharpServerTools.dll"/>
<Import assembly="OracleSharpDbToolsProvider.dll"/>
</Runtime>
<Path name = "/SharpDevelop/Workbench/Pads">
<Pad id = "SharpServerToolsPad"
category = "Main"
title = "Server Explorer"
icon = "PadIcons.Output"
shortcut = "Control|Alt|D"
class = "SharpServerTools.Forms.ServerBrowserTool"/>
</Path>
</AddIn>
Loading…
Cancel
Save