Browse Source

ServerBrowserTool now shows meta data for db objects such as Tables, Procedures etc. Loading of metadata from files is now invoked from right click menu for each connection rather than at start up. Beware will overwrite saved metadata if SaveAll invoked while 'empty' DbModelInfos are loaded.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@1699 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Dickon Field 19 years ago
parent
commit
7451fc131f
  1. 33
      src/AddIns/Misc/SharpDbTools/Project/Src/Model/DbModelInfoService.cs
  2. 1
      src/AddIns/Misc/SharpDbTools/Project/Src/Model/TableNames.cs
  3. 141
      src/AddIns/Misc/SharpDbTools/Project/Src/ServerBrowserTool.cs

33
src/AddIns/Misc/SharpDbTools/Project/Src/Model/DbModelInfoService.cs

@ -152,6 +152,25 @@ namespace SharpDbTools.Model @@ -152,6 +152,25 @@ namespace SharpDbTools.Model
}
}
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
@ -159,12 +178,12 @@ namespace SharpDbTools.Model @@ -159,12 +178,12 @@ namespace SharpDbTools.Model
string[] files = Directory.GetFiles(saveLocation);
cache.Clear();
for (int i = 0; i < files.Length; i++) {
DbModelInfo nextModel = LoadFromFile(@files[i]);
DbModelInfo nextModel = LoadFromFileAtPath(@files[i]);
cache.Add(nextModel.Name, nextModel);
}
}
private static DbModelInfo LoadFromFile(string filePath)
private static DbModelInfo LoadFromFileAtPath(string filePath)
{
LoggingService.Debug("loading DbModelInfo from filePath: " + filePath);
DbModelInfo nextModel = new DbModelInfo();
@ -172,6 +191,16 @@ namespace SharpDbTools.Model @@ -172,6 +191,16 @@ namespace SharpDbTools.Model
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

1
src/AddIns/Misc/SharpDbTools/Project/Src/Model/TableNames.cs

@ -23,5 +23,6 @@ namespace SharpDbTools.Model @@ -23,5 +23,6 @@ namespace SharpDbTools.Model
{
public const string MetaDataCollections = "MetaDataCollections";
public const string ConnectionInfo = "ConnectionInfo";
public static string[] PrimaryObjects = new string[] { "Tables", "Procedures", "Functions", "Views", "Users" };
}
}

141
src/AddIns/Misc/SharpDbTools/Project/Src/ServerBrowserTool.cs

@ -13,7 +13,10 @@ @@ -13,7 +13,10 @@
using System;
using System.Windows.Forms;
using System.Data;
using System.Data.Common;
using System.Collections.Generic;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui;
using SharpDbTools.Model;
@ -73,14 +76,36 @@ namespace SharpDbTools @@ -73,14 +76,36 @@ namespace SharpDbTools
}
class ServerToolTreeView : TreeView
{
TreeNode dbNode;
{
public ServerToolTreeView(): base()
{
// this is the wrong place for this, but lets give it a go...
DbModelInfoService.LoadNamesFromFiles();
Rebuild();
}
/// <summary>
/// Rebuilds the database connection tree.
/// Should only be called from a delegate via Invoke or BeginInvoke.
/// </summary>
public void Rebuild()
{
dbNode = new TreeNode();
dbNode.Text = "Database Explorer";
dbNode.Tag = "DatabaseConnections";
this.BeginUpdate();
// TODO: put the Rebuild... behaviour into a view builder;
TreeNode dbNode = null;
TreeNode[] dbNodes = this.Nodes.Find("DatabaseExplorer", true);
// lets assume there is only one with this above name
if (dbNodes.Length == 0) {
LoggingService.Debug("could not find DatabaseExplorer Node, so creating it now");
dbNode = new TreeNode();
dbNode.Text = "Database Explorer";
dbNode.Name = "DatabaseExplorer";
this.Nodes.Add(dbNode);
} else {
dbNode = dbNodes[0];
}
// create the context menu for the database server node
ContextMenuStrip cMenu = new ContextMenuStrip();
@ -105,29 +130,15 @@ namespace SharpDbTools @@ -105,29 +130,15 @@ namespace SharpDbTools
}
);
dbNode.ContextMenuStrip = cMenu;
// TODO: NEXT: put this and the Rebuild... behaviour into a view builder;
// this is the wrong place for this, but lets give it a go...
DbModelInfoService.LoadFromFiles();
this.BeginUpdate();
this.Nodes.Add(dbNode);
RebuildDbConnectionsNode();
this.EndUpdate();
}
/// <summary>
/// Rebuilds the database connection tree.
/// Should only be called from a delegate via Invoke or BeginInvoke.
/// </summary>
public void RebuildDbConnectionsNode()
{
// Rebuild each of the root nodes in the ServerToolTreeView
this.BeginUpdate();
dbNode.Nodes.Clear();
foreach (string name in DbModelInfoService.Names) {
TreeNode dbModelInfoNode = CreateDbModelInfoNode(name);
TreeNode connectionNode = CreateConnectionPropertiesNode(name);
TreeNode metadataNode = CreateMetaDataNode(name);
dbModelInfoNode.Nodes.Add(connectionNode);
dbModelInfoNode.Nodes.Add(metadataNode);
dbNode.Nodes.Add(dbModelInfoNode);
}
this.EndUpdate();
@ -145,26 +156,42 @@ namespace SharpDbTools @@ -145,26 +156,42 @@ namespace SharpDbTools
new ToolStripMenuItem("Set Connection String");
setConnectionStringMenuItem.Click += new EventHandler(SetConnectionStringOnDbModelInfoClickHandler);
ToolStripMenuItem loadMetadataMenuItem =
ToolStripMenuItem loadMetadataFromConnectionMenuItem =
new ToolStripMenuItem("Load Metadata from Connection");
loadMetadataMenuItem.Click += new EventHandler(LoadMetadataClickHandler);
loadMetadataFromConnectionMenuItem.Click += new EventHandler(LoadMetadataFromConnectionClickHandler);
ToolStripMenuItem loadMetadataFromFileMenuItem =
new ToolStripMenuItem("Load Metadata from File");
loadMetadataFromFileMenuItem.Click += new EventHandler(LoadMetadataFromFileClickHandler);
cMenu.Items.AddRange(new ToolStripMenuItem[]
{
setConnectionStringMenuItem,
loadMetadataMenuItem
loadMetadataFromConnectionMenuItem,
loadMetadataFromFileMenuItem
});
treeNode.ContextMenuStrip = cMenu;
return treeNode;
}
/// <summary>
///
/// </summary>
/// <param name="name"></param>
/// <returns>a TreeNode representation of the connection properties
/// of the connection</returns>
public TreeNode CreateConnectionPropertiesNode(string name)
{
// create sub TreeNodes for the connection string and invariant name if they exist
DbModelInfo modelInfo = DbModelInfoService.GetDbModelInfo(name);
if (name == null) throw new KeyNotFoundException();
string connectionString = modelInfo.ConnectionString;
string invariantName = modelInfo.InvariantName;
TreeNode attributesNode = new TreeNode("Connection Properties");
treeNode.Nodes.Add(attributesNode);
if (connectionString != null) {
TreeNode cstringNode = new TreeNode("Connection String: " + connectionString);
attributesNode.Nodes.Add(cstringNode);
@ -175,7 +202,43 @@ namespace SharpDbTools @@ -175,7 +202,43 @@ namespace SharpDbTools
attributesNode.Nodes.Add(invNameNode);
}
return treeNode;
return attributesNode;
}
public TreeNode CreateMetaDataNode(string name)
{
TreeNode metaNode = new TreeNode("Db Objects");
metaNode.Name = name + ":MetaData";
DbModelInfo info = DbModelInfoService.GetDbModelInfo(name);
DataTable metadataCollectionsTable = info.Tables[TableNames.MetaDataCollections];
if (metadataCollectionsTable != null) {
for (int i = 0; i < TableNames.PrimaryObjects.Length; i++) {
string metadataCollectionName = TableNames.PrimaryObjects[i];
DataTable metaCollectionTable = info.Tables[metadataCollectionName];
LoggingService.Debug("found metadata collection: " + metadataCollectionName);
TreeNode collectionNode = new TreeNode(metadataCollectionName);
collectionNode.Name = name + ":Collection:" + metadataCollectionName;
metaNode.Nodes.Add(collectionNode);
foreach (DataRow dbObjectRow in metaCollectionTable.Rows) {
TreeNode objectNode = null;
if (dbObjectRow.ItemArray.Length > 1) {
objectNode = new TreeNode((string)dbObjectRow[1]);
objectNode.Name = name + ":Object:" + (string)dbObjectRow[1];
} else {
objectNode = new TreeNode((string)dbObjectRow[0]);
objectNode.Name = name + ":Object:" + (string)dbObjectRow[0];
}
// TreeNode ownerNode = new TreeNode("Owner: " + (string)dbObjectRow["OWNER"]);
// TreeNode typeNode = new TreeNode("Type: " + (string)dbObjectRow["TYPE"]);
// // TODO: add fields to each Table
// TreeNode fieldsNode = new TreeNode("Fields [TODO]");
// objectNode.Nodes.AddRange(new TreeNode[] {ownerNode, typeNode, fieldsNode });
collectionNode.Nodes.Add(objectNode);
}
}
}
return metaNode;
}
/// <summary>
@ -203,7 +266,7 @@ namespace SharpDbTools @@ -203,7 +266,7 @@ namespace SharpDbTools
DbModelInfoService.Add(logicalName, null, null);
// rebuild the database server node
this.BeginInvoke(new MethodInvoker(this.RebuildDbConnectionsNode));
this.BeginInvoke(new MethodInvoker(this.Rebuild));
}
public void DeleteDbConnectionClickHandler(object sender, EventArgs e)
@ -217,6 +280,14 @@ namespace SharpDbTools @@ -217,6 +280,14 @@ namespace SharpDbTools
DbModelInfoService.SaveAll();
}
public void LoadMetadataFromFileClickHandler(object sender, EventArgs e)
{
LoggingService.Debug("load metadata from file clicked");
string logicalConnectionName = getConnectionName(sender);
DbModelInfoService.LoadFromFile(logicalConnectionName);
this.BeginInvoke(new MethodInvoker(this.Rebuild));
}
private static string getConnectionName(object sender)
{
ToolStripMenuItem menuItem = sender as ToolStripMenuItem;
@ -256,10 +327,10 @@ namespace SharpDbTools @@ -256,10 +327,10 @@ namespace SharpDbTools
dbModelInfo.InvariantName = definitionDialog.InvariantName;
// rebuild the database explorer node
this.BeginInvoke(new MethodInvoker(this.RebuildDbConnectionsNode));
this.BeginInvoke(new MethodInvoker(this.Rebuild));
}
public void LoadMetadataClickHandler(object sender, EventArgs args)
public void LoadMetadataFromConnectionClickHandler(object sender, EventArgs args)
{
string connectionLogicalName = getConnectionName(sender);
LoggingService.Debug("load metadata from connection clicked for connection with name: "

Loading…
Cancel
Save