miniSql

创建
zgc123@gmail.com authored at 11/19/2023 1:40:15 AM
6136600
Tree
0 Parent(s)
Summary: 197 changed files with 10432 additions and 0 deletions.
Added +282 -0
Added +73 -0
Added +49 -0
Added +215 -0
Added +86 -0
Added +56 -0
Added +46 -0
Added +48 -0
Added +45 -0
Added +147 -0
Added +40 -0
Added +49 -0
Added +48 -0
Added +38 -0
Added +66 -0
Added +27 -0
Added +64 -0
Added +33 -0
Added +61 -0
Added +47 -0
Added +40 -0
Added +38 -0
Added +52 -0
Added +78 -0
Added +44 -0
Added +38 -0
Added +38 -0
Added +25 -0
Added +51 -0
Added +25 -0
Added +148 -0
Added +72 -0
Added +59 -0
Added +120 -0
Added +51 -0
Added +119 -0
Added +120 -0
Added +37 -0
Added +84 -0
Added +120 -0
Added +50 -0
Added +99 -0
Added +101 -0
Added +89 -0
Added +15 -0
Added +54 -0
Added +94 -0
Added +54 -0
Added +101 -0
Added +46 -0
Added +66 -0
Added +212 -0
Added +20 -0
Added +359 -0
Added +67 -0
Added +43 -0
Added +101 -0
Added +323 -0
Added +105 -0
Added +261 -0
Added +22 -0
Added +57 -0
Added +126 -0
Added +101 -0
Added +50 -0
Added +107 -0
Added +120 -0
Added +134 -0
Added +149 -0
Added +77 -0
Added +29 -0
Added +41 -0
Added +65 -0
Added +46 -0
Added +41 -0
Added +81 -0
Added +44 -0
Added +59 -0
Added +56 -0
Added +148 -0
Added +833 -0
Added +352 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +0 -0
Added +48 -0
Added +9 -0
Added +50 -0
Added +33 -0
Added +65 -0
Added +24 -0
Added +24 -0
Added +36 -0
Added +23 -0
Added +24 -0
Added +35 -0
Added +7 -0
Added +376 -0
Added +0 -0
Added +18 -0
Added +83 -0
Added +49 -0
Added +32 -0
Added +51 -0
Added +96 -0
Added +68 -0
Added +16 -0
Added +100 -0
Added +130 -0
Added +52 -0
Added +125 -0
Added +321 -0
Added +85 -0
Added +45 -0
Added +22 -0
Added +41 -0
Added +148 -0
Added +57 -0
Added +44 -0
Added +21 -0
Added +197 -0
Added +282 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/ApplicationServices.cs b/minisqlquery-master/src/MiniSqlQuery.Core/ApplicationServices.cs
new file mode 100644
index 0000000..4a26269
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/ApplicationServices.cs
@@ -0,0 +1,282 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+using Ninject;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	The core services of the application (singleton).
+    /// </summary>
+    public class ApplicationServices : IApplicationServices
+    {
+        /// <summary>
+        /// 	The _configuration objects.
+        /// </summary>
+        private static readonly List<Type> _configurationObjects = new List<Type>();
+
+        /// <summary>
+        /// 	The _container.
+        /// </summary>
+        private static readonly IKernel _container;
+
+        /// <summary>
+        /// 	The _plugins.
+        /// </summary>
+        private readonly Dictionary<Type, IPlugIn> _plugins = new Dictionary<Type, IPlugIn>();
+
+        /// <summary>
+        /// 	Initializes static members of the <see cref = "ApplicationServices" /> class.
+        /// </summary>
+        static ApplicationServices()
+        {
+            _container = new StandardKernel();
+
+            // add self
+            _container
+                .Bind<IApplicationServices>()
+                .To<ApplicationServices>()
+                .InSingletonScope()
+                .Named("ApplicationServices");
+        }
+
+        /// <summary>
+        /// 	Occurs when a system message is posted.
+        /// </summary>
+        public event EventHandler<SystemMessageEventArgs> SystemMessagePosted;
+
+        /// <summary>
+        /// 	Gets a reference to the singleton instance of the services for this application.
+        /// </summary>
+        /// <value>The singleton instance of <see cref = "IApplicationServices" />.</value>
+        public static IApplicationServices Instance
+        {
+            get { return _container.Get<IApplicationServices>(); }
+        }
+
+        /// <summary>
+        /// 	Gets the Dependency Injection container.
+        /// </summary>
+        /// <value>The container.</value>
+        public IKernel Container
+        {
+            get { return _container; }
+        }
+
+        /// <summary>
+        /// 	Gets the application host window.
+        /// </summary>
+        /// <value>The host window - a <see cref = "Form" />.</value>
+        public IHostWindow HostWindow
+        {
+            get { return _container.Get<IHostWindow>(); }
+        }
+
+        /// <summary>
+        /// 	Gets a dictionary of the current plugins for this application.
+        /// </summary>
+        /// <value>A reference to the plugin dictionary.</value>
+        public Dictionary<Type, IPlugIn> Plugins
+        {
+            get { return _plugins; }
+        }
+
+        /// <summary>
+        /// 	Gets the application settings instance.
+        /// </summary>
+        /// <value>A reference to the settings handler.</value>
+        public IApplicationSettings Settings
+        {
+            get { return _container.Get<IApplicationSettings>(); }
+        }
+
+        /// <summary>
+        /// 	The get configuration object types.
+        /// </summary>
+        /// <returns>An array of configuration objects.</returns>
+        public Type[] GetConfigurationObjectTypes()
+        {
+            return _configurationObjects.ToArray();
+        }
+
+        /// <summary>
+        /// 	Initializes the plugins that have been loaded during application startup.
+        /// </summary>
+        public void InitializePlugIns()
+        {
+            foreach (IPlugIn plugIn in _plugins.Values)
+            {
+                try
+                {
+                    if (HostWindow != null)
+                    {
+                        HostWindow.SetStatus(null, "Initializing " + plugIn.PluginName);
+                    }
+
+                    plugIn.InitializePlugIn();
+                }
+                catch (Exception exp)
+                {
+                    if (HostWindow == null)
+                    {
+                        throw;
+                    }
+
+                    HostWindow.DisplayMessageBox(
+                        null,
+                        string.Format("Error Initializing {0}:{1}{2}", plugIn.PluginName, Environment.NewLine, exp),
+                        "Plugin Error",
+                        MessageBoxButtons.OK,
+                        MessageBoxIcon.Warning,
+                        MessageBoxDefaultButton.Button1,
+                        0,
+                        null,
+                        null);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 	Loads the <paramref name = "plugIn" /> (calling its <see cref = "IPlugIn.LoadPlugIn" /> method) and
+        /// 	adds it to the <see cref = "Plugins" /> dictionary for access by other services.
+        /// </summary>
+        /// <param name = "plugIn">The plugin to load.</param>
+        /// <exception cref = "ArgumentNullException">If <paramref name = "plugIn" /> is null.</exception>
+        public void LoadPlugIn(IPlugIn plugIn)
+        {
+            if (plugIn == null)
+            {
+                throw new ArgumentNullException("plugIn");
+            }
+
+            plugIn.LoadPlugIn(this);
+            var type = plugIn.GetType();
+            _plugins.Add(type, plugIn);
+            _container.Bind<IPlugIn>().To(type).InSingletonScope().Named(type.FullName);
+        }
+
+        /// <summary>
+        /// 	Posts a system message for listeners.
+        /// </summary>
+        /// <param name = "message">A system message type.</param>
+        /// <param name = "data">The asssociated data.</param>
+        public void PostMessage(SystemMessage message, object data)
+        {
+            OnSystemMessagePosted(new SystemMessageEventArgs(message, data));
+        }
+
+        /// <summary>
+        /// 	Registers the component service type <typeparamref name = "TService" /> with and implemetation of type <typeparamref name = "TImp" />.
+        /// </summary>
+        /// <typeparam name = "TService">The contract type.</typeparam>
+        /// <typeparam name = "TImp">The implementing type.</typeparam>
+        /// <param name = "key">The key or name of the service.</param>
+        public void RegisterComponent<TService, TImp>(string key)
+        {
+            _container.Bind<TService>().To(typeof(TImp)).InTransientScope().Named(key);
+        }
+
+        /// <summary>
+        /// 	Registers the component implemetation of type <typeparamref name = "TImp" />.
+        /// </summary>
+        /// <typeparam name = "TImp">The implementing type.</typeparam>
+        /// <param name = "key">The key or name of the service.</param>
+        public void RegisterComponent<TImp>(string key)
+        {
+            _container.Bind<TImp>().ToSelf().InTransientScope().Named(key);
+        }
+
+        /// <summary>
+        /// 	The register configuration object.
+        /// </summary>
+        /// <typeparam name = "TConfig">A configuration class.</typeparam>
+        public void RegisterConfigurationObject<TConfig>() where TConfig : IConfigurationObject
+        {
+            RegisterComponent<IConfigurationObject, TConfig>(typeof(TConfig).FullName);
+
+            // haven't successfully been able to query this into out of castle container (yet)
+            _configurationObjects.Add(typeof(TConfig));
+        }
+
+        /// <summary>
+        /// 	Registers the editor of type <typeparamref name = "TEditor" /> using the <see cref = "FileEditorDescriptor.EditorKeyName" />.
+        /// </summary>
+        /// <typeparam name = "TEditor">The editor type (e.g. "BasicXmlEditor").</typeparam>
+        /// <param name = "fileEditorDescriptor">The file extension descriiptor for this type.</param>
+        public void RegisterEditor<TEditor>(FileEditorDescriptor fileEditorDescriptor) where TEditor : IEditor
+        {
+            RegisterComponent<IEditor, TEditor>(fileEditorDescriptor.EditorKeyName);
+
+            // push the ext reg into the resolver....
+            IFileEditorResolver resolver = Resolve<IFileEditorResolver>();
+            resolver.Register(fileEditorDescriptor);
+        }
+
+        /// <summary>
+        /// 	Registers the component service type <typeparamref name = "TService" /> with and implemetation of type <typeparamref name = "TImp" /> as a singleton.
+        /// </summary>
+        /// <typeparam name = "TService">The contract type.</typeparam>
+        /// <typeparam name = "TImp">The implementing type.</typeparam>
+        /// <param name = "key">The key or name of the service.</param>
+        public void RegisterSingletonComponent<TService, TImp>(string key)
+        {
+            _container.Bind<TService>().To(typeof(TImp)).InSingletonScope().Named(key);
+        }
+
+        /// <summary>
+        /// Remove the component by name.
+        /// </summary>
+        /// <returns>True on success.</returns>
+        public void RemoveComponent<TImp>()
+        {
+            _container.Unbind<TImp>();
+        }
+
+        /// <summary>
+        /// 	Resolves an instance of <typeparamref name = "T" /> from the container.
+        /// </summary>
+        /// <typeparam name = "T">The type of object to resolve, can be an interface or class.</typeparam>
+        /// <param name = "key">The key (can be null if not applicable).</param>
+        /// <returns>An instance of the type depending on the containters configuration.</returns>
+        public T Resolve<T>(string key)
+        {
+            if (key == null)
+            {
+                return _container.Get<T>();
+            }
+
+            return _container.Get<T>(key);
+        }
+
+        /// <summary>
+        /// 	The resolve.
+        /// </summary>
+        /// <typeparam name = "T">The type of object to resolve, can be an interface or class.</typeparam>
+        /// <returns>An instance of the type depending on the containters configuration.</returns>
+        public T Resolve<T>()
+        {
+            return _container.Get<T>();
+        }
+
+        /// <summary>
+        /// 	The on system message posted.
+        /// </summary>
+        /// <param name = "eventArgs">The event args.</param>
+        protected void OnSystemMessagePosted(SystemMessageEventArgs eventArgs)
+        {
+            EventHandler<SystemMessageEventArgs> handler = SystemMessagePosted;
+            if (handler != null)
+            {
+                handler(this, eventArgs);
+            }
+        }
+    }
+}
\ No newline at end of file
Added +73 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/BasicTextFindService.cs b/minisqlquery-master/src/MiniSqlQuery.Core/BasicTextFindService.cs
new file mode 100644
index 0000000..0eac8b7
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/BasicTextFindService.cs
@@ -0,0 +1,73 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	A simple text finding service. Currently supports forward only text matching.
+    /// </summary>
+    public class BasicTextFindService : ITextFindService
+    {
+        /// <summary>
+        /// 	The services reference.
+        /// </summary>
+        private readonly IApplicationServices _services;
+
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "BasicTextFindService" /> class. Creates a new text find service.
+        /// </summary>
+        /// <param name = "applicationServices">A reference to the application services.</param>
+        public BasicTextFindService(IApplicationServices applicationServices)
+        {
+            _services = applicationServices;
+        }
+
+        /// <summary>
+        /// 	Looks for the next match depending on the settings in the <paramref name = "request" />.
+        /// </summary>
+        /// <param name = "request">The text find request.</param>
+        /// <returns>An updated request with the relevent values adjusted (namely position).</returns>
+        public FindTextRequest FindNext(FindTextRequest request)
+        {
+            if (request == null)
+            {
+                throw new ArgumentNullException("request");
+            }
+
+            /*
+			if (request.SearchUp)
+			{
+			    // todo - I think its the TextProvider's job...?
+			}
+			else // search down.
+			{
+			int pos = request.TextProvider.FindString(request.SearchValue, request.Position, request.StringComparison);
+			    //pos = request.TextProvider.FindString(request);
+			}
+			*/
+            int pos = request.TextProvider.FindString(request.SearchValue, request.Position, request.StringComparison);
+
+            if (pos > -1)
+            {
+                // the editor will highlight the find
+                request.Position = pos + request.SearchValue.Length;
+            }
+            else
+            {
+                // todo - notify, beep etc
+
+                // reset to start of buffer.
+                request.Position = 0;
+            }
+
+            return request;
+        }
+    }
+}
\ No newline at end of file
Added +49 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/BatchProgressEventArgs.cs b/minisqlquery-master/src/MiniSqlQuery.Core/BatchProgressEventArgs.cs
new file mode 100644
index 0000000..92e68a6
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/BatchProgressEventArgs.cs
@@ -0,0 +1,49 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	The batch progress event args.
+    /// </summary>
+    public class BatchProgressEventArgs : EventArgs
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "BatchProgressEventArgs" /> class.
+        /// </summary>
+        /// <param name = "query">The query.</param>
+        /// <param name = "count">The count.</param>
+        /// <param name = "index">The index.</param>
+        public BatchProgressEventArgs(Query query, int count, int index)
+        {
+            Query = query;
+            Count = count;
+            Index = index;
+        }
+
+        /// <summary>
+        /// 	Gets Count.
+        /// </summary>
+        /// <value>The count.</value>
+        public int Count { get; private set; }
+
+        /// <summary>
+        /// 	Gets Index.
+        /// </summary>
+        /// <value>The index.</value>
+        public int Index { get; private set; }
+
+        /// <summary>
+        /// 	Gets Query.
+        /// </summary>
+        /// <value>The query.</value>
+        public Query Query { get; private set; }
+    }
+}
\ No newline at end of file
Added +215 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/CommandControlBuilder.cs b/minisqlquery-master/src/MiniSqlQuery.Core/CommandControlBuilder.cs
new file mode 100644
index 0000000..8486be7
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/CommandControlBuilder.cs
@@ -0,0 +1,215 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+using System.Diagnostics;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	Helper class for building controls out of <see cref = "ICommand" /> objects.
+    /// </summary>
+    public class CommandControlBuilder
+    {
+        /// <summary>
+        /// 	Handles the click event of a tool strip item, if the <see cref = "ToolStripItem.Tag" /> is 
+        /// 	an <see cref = "ICommand" /> instance the action is executed.
+        /// </summary>
+        /// <param name = "sender">The sender.</param>
+        /// <param name = "e">The <see cref = "System.EventArgs" /> instance containing the event data.</param>
+        [DebuggerNonUserCode]
+        public static void CommandItemClick(object sender, EventArgs e)
+        {
+            var item = sender as ToolStripItem;
+
+            if (item != null)
+            {
+                var cmd = item.Tag as ICommand;
+
+                if (cmd != null)
+                {
+                    cmd.Execute();
+                }
+            }
+        }
+
+        /// <summary>
+        /// 	Creates a link label given the <typeparamref name = "TCommand" /> definition.
+        /// </summary>
+        /// <typeparam name = "TCommand">The type of the command.</typeparam>
+        /// <returns>A link label wired to the commands <see cref = "ICommand.Execute" /> method.</returns>
+        public static LinkLabel CreateLinkLabel<TCommand>() where TCommand : ICommand, new()
+        {
+            var linkLabel = new LinkLabel();
+            var cmd = CommandManager.GetCommandInstance<TCommand>();
+
+            linkLabel.AutoSize = true;
+            linkLabel.Name = cmd.GetType().Name + "LinkLabel";
+            linkLabel.TabStop = true;
+            linkLabel.Text = cmd.Name.Replace("&", string.Empty);
+            linkLabel.Tag = cmd;
+            linkLabel.Padding = new Padding(4);
+            linkLabel.LinkClicked += LinkLabelLinkClicked;
+
+            return linkLabel;
+        }
+
+        /// <summary>
+        /// 	Creates a tool strip button given the <typeparamref name = "TCommand" /> definition.
+        /// </summary>
+        /// <typeparam name = "TCommand">The type of the command.</typeparam>
+        /// <returns>A tool strip button</returns>
+        public static ToolStripButton CreateToolStripButton<TCommand>() where TCommand : ICommand, new()
+        {
+            var button = new ToolStripButton();
+            var cmd = CommandManager.GetCommandInstance<TCommand>();
+
+            button.DisplayStyle = ToolStripItemDisplayStyle.Image;
+            button.Image = cmd.SmallImage;
+            button.ImageTransparentColor = Color.Magenta;
+            button.Name = cmd.GetType().Name + "ToolStripButton";
+            button.Tag = cmd;
+            button.Text = cmd.Name;
+            button.Click += CommandItemClick;
+
+            return button;
+        }
+
+        /// <summary>
+        /// 	Creates a tool strip menu item given the <typeparamref name = "TCommand" /> definition.
+        /// </summary>
+        /// <typeparam name = "TCommand">The type of the command.</typeparam>
+        /// <returns>A tool strip menu item wired to the commands <see cref = "ICommand.Execute" /> method.</returns>
+        public static ToolStripMenuItem CreateToolStripMenuItem<TCommand>() where TCommand : ICommand, new()
+        {
+            var menuItem = new ToolStripMenuItem();
+            var cmd = CommandManager.GetCommandInstance<TCommand>();
+
+            menuItem.Name = cmd.GetType().Name + "ToolStripMenuItem";
+            menuItem.Text = cmd.Name;
+            menuItem.Tag = cmd;
+            menuItem.ShortcutKeys = cmd.ShortcutKeys;
+            menuItem.Image = cmd.SmallImage;
+            menuItem.Click += CommandItemClick;
+
+            // store the host for callback
+            cmd.Host = menuItem;
+
+            // todo...
+            // if (!string.IsNullOrEmpty(cmd.ShortcutKeysText))
+            // {
+            // menuItem.ToolTipText = string.Format("{0} ({1})", cmd.Name, cmd.ShortcutKeysText);
+            // }
+
+            return menuItem;
+        }
+
+        /// <summary>
+        /// 	Creates a tool strip menu item seperator.
+        /// </summary>
+        /// <returns>A tool strip seperator.</returns>
+        public static ToolStripSeparator CreateToolStripMenuItemSeparator()
+        {
+            return new ToolStripSeparator();
+        }
+
+        /// <summary>
+        /// 	Assigns an event handler (<see cref = "TopLevelMenuDropDownOpening" />) to the opening event
+        /// 	for menu strip items which in turn hadles enableing and disabling.
+        /// </summary>
+        /// <param name = "menuStrip">The menu strip to monitor.</param>
+        public static void MonitorMenuItemsOpeningForEnabling(ToolStrip menuStrip)
+        {
+            if (menuStrip is ContextMenuStrip || menuStrip is MenuStrip)
+            {
+                foreach (ToolStripItem item in menuStrip.Items)
+                {
+                    var topLevelMenu = item as ToolStripMenuItem;
+                    if (topLevelMenu != null)
+                    {
+                        // Debug.WriteLine("MonitorMenuItemsOpeningForEnabling :: " + topLevelMenu.Text);
+                        topLevelMenu.DropDownOpening += TopLevelMenuDropDownOpening;
+                        topLevelMenu.DropDownClosed += TopLevelMenuDropDownClosed;
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// 	Used when a menu is opening, handles enabling/disabling of items for display.
+        /// </summary>
+        /// <param name = "sender">The sender.</param>
+        /// <param name = "e">The <see cref = "System.EventArgs" /> instance containing the event data.</param>
+        [DebuggerNonUserCode]
+        public static void TopLevelMenuDropDownOpening(object sender, EventArgs e)
+        {
+            var menuItem = sender as ToolStripMenuItem;
+
+            if (menuItem != null)
+            {
+                foreach (ToolStripItem item in menuItem.DropDownItems)
+                {
+                    var cmd = item.Tag as ICommand;
+
+                    if (cmd != null)
+                    {
+                        item.Enabled = cmd.Enabled;
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// 	The link label link clicked.
+        /// </summary>
+        /// <param name = "sender">The sender.</param>
+        /// <param name = "e">The <see cref = "System.Windows.Forms.LinkLabelLinkClickedEventArgs" /> instance containing the event data.</param>
+        private static void LinkLabelLinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+        {
+            var linkLabel = sender as Control;
+
+            if (linkLabel != null)
+            {
+                var cmd = linkLabel.Tag as ICommand;
+
+                if (cmd != null)
+                {
+                    cmd.Execute();
+                }
+            }
+        }
+
+        /// <summary>
+        /// 	We need to re-enable all the menu items so that the shortcut keys are available.
+        /// 	This is because the model uses a continuous check approach rather than individual events
+        /// 	for the enabling.
+        /// </summary>
+        /// <param name = "sender">The sender.</param>
+        /// <param name = "e">The <see cref = "System.EventArgs" /> instance containing the event data.</param>
+        [DebuggerNonUserCode]
+        private static void TopLevelMenuDropDownClosed(object sender, EventArgs e)
+        {
+            var menuItem = sender as ToolStripMenuItem;
+
+            if (menuItem != null)
+            {
+                foreach (ToolStripItem item in menuItem.DropDownItems)
+                {
+                    var cmd = item.Tag as ICommand;
+
+                    if (cmd != null)
+                    {
+                        item.Enabled = true;
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
Added +86 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/CommandManager.cs b/minisqlquery-master/src/MiniSqlQuery.Core/CommandManager.cs
new file mode 100644
index 0000000..e887c4a
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/CommandManager.cs
@@ -0,0 +1,86 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	Stores instances of commands by type.
+    /// </summary>
+    public class CommandManager
+    {
+        /// <summary>
+        /// 	The command cache.
+        /// </summary>
+        private static readonly Dictionary<Type, ICommand> CommandCache = new Dictionary<Type, ICommand>();
+
+        /// <summary>
+        /// 	Gets the command instance by <paramref name = "commandTypeName" />.
+        /// </summary>
+        /// <param name = "commandTypeName">Name of the command, e.g. "OpenFileCommand".</param>
+        /// <returns>The first command by that name or null if not found.</returns>
+        public static ICommand GetCommandInstance(string commandTypeName)
+        {
+            foreach (Type cmdType in CommandCache.Keys)
+            {
+                if (cmdType.Name == commandTypeName)
+                {
+                    return CommandCache[cmdType];
+                }
+            }
+
+            return null;
+        }
+
+        /// <summary>
+        /// 	Gets or creates an instance of a command by type.
+        /// </summary>
+        /// <typeparam name = "TCommand">The type of command to get or create.</typeparam>
+        /// <returns>An instance of <typeparamref name = "TCommand" />.</returns>
+        public static ICommand GetCommandInstance<TCommand>() where TCommand : ICommand, new()
+        {
+            ICommand cmd;
+
+            if (CommandCache.ContainsKey(typeof(TCommand)))
+            {
+                cmd = CommandCache[typeof(TCommand)];
+            }
+            else
+            {
+                cmd = new TCommand();
+                cmd.Services = ApplicationServices.Instance;
+                cmd.Settings = ApplicationServices.Instance.Settings;
+                CommandCache[typeof(TCommand)] = cmd;
+            }
+
+            return cmd;
+        }
+
+        /// <summary>
+        /// 	Gets command instance by it's partial name, e.g. "OpenFile".
+        /// </summary>
+        /// <param name = "commandName">Name partial of the command.</param>
+        /// <returns>The first command by that name or null if not found.</returns>
+        public static ICommand GetCommandInstanceByPartialName(string commandName)
+        {
+            string cmdName = commandName + "Command";
+
+            foreach (Type cmdType in CommandCache.Keys)
+            {
+                if (cmdType.Name.EndsWith(commandName) || cmdType.Name.EndsWith(cmdName))
+                {
+                    return CommandCache[cmdType];
+                }
+            }
+
+            return null;
+        }
+    }
+}
\ No newline at end of file
Added +56 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/CancelTaskCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/CancelTaskCommand.cs
new file mode 100644
index 0000000..b6eac44
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/CancelTaskCommand.cs
@@ -0,0 +1,56 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The cancel task command.
+    /// </summary>
+    public class CancelTaskCommand
+        : CommandBase
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "CancelTaskCommand" /> class.
+        /// </summary>
+        public CancelTaskCommand()
+            : base("&Cancel")
+        {
+            SmallImage = ImageResource.stop;
+        }
+
+        /// <summary>
+        /// 	Gets a value indicating whether Enabled.
+        /// </summary>
+        /// <value>The enabled state.</value>
+        public override bool Enabled
+        {
+            get
+            {
+                var editor = HostWindow.ActiveChildForm as IPerformTask;
+                return editor != null && editor.IsBusy;
+            }
+        }
+
+        /// <summary>
+        /// 	Execute the command.
+        /// </summary>
+        public override void Execute()
+        {
+            if (!Enabled)
+            {
+                return;
+            }
+
+            var editor = HostWindow.ActiveChildForm as IPerformTask;
+            if (editor != null)
+            {
+                editor.CancelTask();
+            }
+        }
+    }
+}
\ No newline at end of file
Added +46 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/CloseActiveWindowCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/CloseActiveWindowCommand.cs
new file mode 100644
index 0000000..964a25e
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/CloseActiveWindowCommand.cs
@@ -0,0 +1,46 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The close active window command.
+    /// </summary>
+    public class CloseActiveWindowCommand
+        : CommandBase
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "CloseActiveWindowCommand" /> class.
+        /// </summary>
+        public CloseActiveWindowCommand()
+            : base("&Close")
+        {
+        }
+
+        /// <summary>
+        /// 	Gets a value indicating whether Enabled.
+        /// </summary>
+        /// <value>The enabled state.</value>
+        public override bool Enabled
+        {
+            get { return HostWindow.ActiveChildForm != null; }
+        }
+
+        /// <summary>
+        /// 	Execute the command.
+        /// </summary>
+        public override void Execute()
+        {
+            var frm = HostWindow.ActiveChildForm;
+            if (frm != null)
+            {
+                frm.Close();
+            }
+        }
+    }
+}
\ No newline at end of file
Added +48 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/CloseAllWindowsCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/CloseAllWindowsCommand.cs
new file mode 100644
index 0000000..cbfa429
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/CloseAllWindowsCommand.cs
@@ -0,0 +1,48 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Windows.Forms;
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The close all windows command.
+    /// </summary>
+    public class CloseAllWindowsCommand
+        : CommandBase
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "CloseAllWindowsCommand" /> class.
+        /// </summary>
+        public CloseAllWindowsCommand()
+            : base("Close &All Windows")
+        {
+        }
+
+        /// <summary>
+        /// 	Gets a value indicating whether Enabled.
+        /// </summary>
+        /// <value>The enabled state.</value>
+        public override bool Enabled
+        {
+            get { return HostWindow.ActiveChildForm != null; }
+        }
+
+        /// <summary>
+        /// 	Execute the command.
+        /// </summary>
+        public override void Execute()
+        {
+            var forms = HostWindow.Instance.MdiChildren;
+            foreach (var frm in forms)
+            {
+                Application.DoEvents();
+                frm.Close();
+            }
+        }
+    }
+}
\ No newline at end of file
Added +45 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/CloseDatabaseConnectionCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/CloseDatabaseConnectionCommand.cs
new file mode 100644
index 0000000..bd5f90b
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/CloseDatabaseConnectionCommand.cs
@@ -0,0 +1,45 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Data;
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>The close database connection command.</summary>
+    public class CloseDatabaseConnectionCommand
+        : CommandBase
+    {
+        /// <summary>Initializes a new instance of the <see cref="CloseDatabaseConnectionCommand"/> class.</summary>
+        public CloseDatabaseConnectionCommand()
+            : base("Close Current connection")
+        {
+        }
+
+        /// <summary>Gets a value indicating whether Enabled.</summary>
+        /// <value>The enabled state.</value>
+        public override bool Enabled
+        {
+            get
+            {
+                if (Settings.Connection == null ||
+                    (Settings.Connection.State == ConnectionState.Closed &&
+                    Settings.Connection.State == ConnectionState.Broken))
+                {
+                    return false;
+                }
+
+                return true;
+            }
+        }
+
+        /// <summary>Execute the command.</summary>
+        public override void Execute()
+        {
+            Settings.CloseConnection();
+        }
+    }
+}
\ No newline at end of file
Added +147 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/CommandBase.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/CommandBase.cs
new file mode 100644
index 0000000..e56b9b2
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/CommandBase.cs
@@ -0,0 +1,147 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	<para>A basic implementation of the <see cref="ICommand"/> interface.</para>
+    /// 	<para>Represents a "command", typically a user action such as saving a file or executing a query.</para>
+    /// 	<para>Inheritors must implement the abstract method <see cref="Execute"/>.</para>
+    /// </summary>
+    public abstract class CommandBase : ICommand
+    {
+        /// <summary>
+        /// 	The host window.
+        /// </summary>
+        private IHostWindow _hostWindow;
+
+        /// <summary>
+        /// 	The command name.
+        /// </summary>
+        private string _name;
+
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref="CommandBase"/> class.
+        /// 	The default value for <see cref="Enabled"/> is true, and <see cref="ShortcutKeys"/> is Keys.None.
+        /// </summary>
+        /// <param name="name">
+        /// 	The name of the command.
+        /// </param>
+        protected CommandBase(string name)
+        {
+            _name = name;
+            ShortcutKeys = Keys.None;
+        }
+
+        /// <summary>
+        /// 	Gets a value indicating whether this <see cref = "ICommand" /> is enabled.
+        /// </summary>
+        /// <value><c>true</c> if enabled; otherwise, <c>false</c> (the default is true).</value>
+        public virtual bool Enabled
+        {
+            get { return true; }
+        }
+
+        public object Host { get; set; }
+
+        /// <summary>
+        /// 	The name of the command, used in menus and buttons.
+        /// </summary>
+        /// <value>The name of the command.</value>
+        public virtual string Name
+        {
+            get { return _name; }
+            protected set
+            {
+                if (_name == value)
+                {
+                    return;
+                }
+
+                _name = value;
+
+                // if the "host" of this command is a toolstring item, update its Text property.
+                var item = Host as ToolStripItem;
+                if (item != null)
+                {
+                    item.Text = _name;
+                }
+            }
+        }
+
+        /// <summary>
+        /// 	A reference to the application services to allow access to the other components.
+        /// </summary>
+        /// <value>A reference to the <see cref = "IApplicationServices" /> instance.</value>
+        public IApplicationServices Services { get; set; }
+
+        /// <summary>
+        /// 	Gets a reference to the application settings.
+        /// </summary>
+        /// <value>The application settings.</value>
+        public IApplicationSettings Settings { get; set; }
+
+        /// <summary>
+        /// 	Gets the menu shortcut keys for this command (e.g. Keys.F5).
+        /// </summary>
+        /// <value>The shortcut keys for this command (the default is Keys.None).</value>
+        public virtual Keys ShortcutKeys { get; protected set; }
+
+        /// <summary>
+        /// 	Gets the shortcut key text to be displayed as help.
+        /// </summary>
+        /// <value>The shortcut keys text.</value>
+        public string ShortcutKeysText { get; protected set; }
+
+        /// <summary>
+        /// 	Gets the "small image" associated with this control (for use on buttons or menu items).
+        /// 	Use null (or Nothing in Visual Basic) if there is no image.
+        /// </summary>
+        /// <value>The small image representing this command (the default is null).</value>
+        public virtual Image SmallImage { get; protected set; }
+
+        /// <summary>
+        /// 	Attempts to convert the current host windows active form to <see cref = "IEditor" />.
+        /// </summary>
+        /// <value>A reference to the active base editor window, otherwise null.</value>
+        protected IEditor ActiveFormAsEditor
+        {
+            get { return Services.HostWindow.ActiveChildForm as IEditor; }
+        }
+
+        /// <summary>
+        /// 	Attempts to convert the current host windows active form to <see cref = "IQueryEditor" />.
+        /// </summary>
+        /// <value>A reference to the active query editor window, otherwise null.</value>
+        protected IQueryEditor ActiveFormAsSqlQueryEditor
+        {
+            get { return Services.HostWindow.ActiveChildForm as IQueryEditor; }
+        }
+
+        /// <summary>
+        /// 	Gets a reference to the host window.
+        /// </summary>
+        /// <value>The host window.</value>
+        protected IHostWindow HostWindow
+        {
+            get { return _hostWindow ?? (_hostWindow = Services.HostWindow); }
+        }
+
+        /// <summary>
+        /// 	Executes the command based on the current settings (abstract).
+        /// </summary>
+        /// <remarks>
+        /// 	If a commands <see cref="Enabled"/> value is false, a call to <see cref="Execute"/> should have no effect
+        /// 	(and not throw an exception).
+        /// </remarks>
+        public abstract void Execute();
+    }
+}
\ No newline at end of file
Added +40 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ConvertTextToLowerCaseCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ConvertTextToLowerCaseCommand.cs
new file mode 100644
index 0000000..a83ec9a
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ConvertTextToLowerCaseCommand.cs
@@ -0,0 +1,40 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Windows.Forms;
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>The convert text to lower case command.</summary>
+    public class ConvertTextToLowerCaseCommand
+        : CommandBase
+    {
+        /// <summary>Initializes a new instance of the <see cref="ConvertTextToLowerCaseCommand"/> class.</summary>
+        public ConvertTextToLowerCaseCommand()
+            : base("Convert to 'lower case' text")
+        {
+            ShortcutKeys = Keys.Control | Keys.U;
+        }
+
+        /// <summary>Gets a value indicating whether Enabled.</summary>
+        /// <value>The enabled state.</value>
+        public override bool Enabled
+        {
+            get { return HostWindow.ActiveChildForm as IEditor != null; }
+        }
+
+        /// <summary>Execute the command.</summary>
+        public override void Execute()
+        {
+            var editor = ActiveFormAsEditor;
+            if (Enabled && editor.SelectedText.Length > 0)
+            {
+                editor.InsertText(editor.SelectedText.ToLower());
+            }
+        }
+    }
+}
\ No newline at end of file
Added +49 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ConvertTextToTitleCaseCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ConvertTextToTitleCaseCommand.cs
new file mode 100644
index 0000000..bb4d313
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ConvertTextToTitleCaseCommand.cs
@@ -0,0 +1,49 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Globalization;
+using System.Windows.Forms;
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The convert text to title case command.
+    /// </summary>
+    public class ConvertTextToTitleCaseCommand
+        : CommandBase
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "ConvertTextToTitleCaseCommand" /> class.
+        /// </summary>
+        public ConvertTextToTitleCaseCommand()
+            : base("Convert to 'Title Case' text")
+        {
+            ShortcutKeys = Keys.Control | Keys.Alt | Keys.U;
+        }
+
+        /// <summary>
+        /// 	Gets a value indicating whether Enabled.
+        /// </summary>
+        /// <value>The enabled state.</value>
+        public override bool Enabled
+        {
+            get { return HostWindow.ActiveChildForm as IEditor != null; }
+        }
+
+        /// <summary>
+        /// 	Execute the command.
+        /// </summary>
+        public override void Execute()
+        {
+            var editor = ActiveFormAsEditor;
+            if (Enabled && editor.SelectedText.Length > 0)
+            {
+                editor.InsertText(CultureInfo.CurrentCulture.TextInfo.ToTitleCase(editor.SelectedText));
+            }
+        }
+    }
+}
\ No newline at end of file
Added +48 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ConvertTextToUpperCaseCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ConvertTextToUpperCaseCommand.cs
new file mode 100644
index 0000000..c87b07d
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ConvertTextToUpperCaseCommand.cs
@@ -0,0 +1,48 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Windows.Forms;
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The convert text to upper case command.
+    /// </summary>
+    public class ConvertTextToUpperCaseCommand
+        : CommandBase
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "ConvertTextToUpperCaseCommand" /> class.
+        /// </summary>
+        public ConvertTextToUpperCaseCommand()
+            : base("Convert to 'UPPER CASE' text")
+        {
+            ShortcutKeys = Keys.Control | Keys.Shift | Keys.U;
+        }
+
+        /// <summary>
+        /// 	Gets a value indicating whether Enabled.
+        /// </summary>
+        /// <value>The enabled state.</value>
+        public override bool Enabled
+        {
+            get { return HostWindow.ActiveChildForm as IEditor != null; }
+        }
+
+        /// <summary>
+        /// 	Execute the command.
+        /// </summary>
+        public override void Execute()
+        {
+            var editor = ActiveFormAsEditor;
+            if (Enabled && editor.SelectedText.Length > 0)
+            {
+                editor.InsertText(editor.SelectedText.ToUpper());
+            }
+        }
+    }
+}
\ No newline at end of file
Added +38 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/CopyQueryEditorFileNameCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/CopyQueryEditorFileNameCommand.cs
new file mode 100644
index 0000000..bd0924f
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/CopyQueryEditorFileNameCommand.cs
@@ -0,0 +1,38 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Windows.Forms;
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The copy query editor file name command.
+    /// </summary>
+    public class CopyQueryEditorFileNameCommand
+        : CommandBase
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "CopyQueryEditorFileNameCommand" /> class.
+        /// </summary>
+        public CopyQueryEditorFileNameCommand()
+            : base("Copy Filename")
+        {
+        }
+
+        /// <summary>
+        /// 	Execute the command.
+        /// </summary>
+        public override void Execute()
+        {
+            var editor = HostWindow.Instance.ActiveMdiChild as IEditor;
+            if (editor != null && editor.FileName != null)
+            {
+                Clipboard.SetText(editor.FileName);
+            }
+        }
+    }
+}
\ No newline at end of file
Added +66 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/DisplayDbModelDependenciesCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/DisplayDbModelDependenciesCommand.cs
new file mode 100644
index 0000000..10ec35c
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/DisplayDbModelDependenciesCommand.cs
@@ -0,0 +1,66 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Text;
+using MiniSqlQuery.Core.DbModel;
+using WeifenLuo.WinFormsUI.Docking;
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The display db model dependencies command.
+    /// </summary>
+    public class DisplayDbModelDependenciesCommand
+        : CommandBase
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "DisplayDbModelDependenciesCommand" /> class.
+        /// </summary>
+        public DisplayDbModelDependenciesCommand()
+            : base("Order Tables by FK Dependencies")
+        {
+            SmallImage = ImageResource.table_link;
+        }
+
+        /// <summary>
+        /// 	Execute the command.
+        /// </summary>
+        public override void Execute()
+        {
+            var editor = Services.Resolve<IEditor>("txt-editor");
+            editor.FileName = null;
+            HostWindow.DisplayDockedForm(editor as DockContent);
+
+            if (HostWindow.DatabaseInspector.DbSchema == null)
+            {
+                HostWindow.DatabaseInspector.LoadDatabaseDetails();
+            }
+
+            var dependencyWalker = new DbModelDependencyWalker(HostWindow.DatabaseInspector.DbSchema);
+            var tables = dependencyWalker.SortTablesByForeignKeyReferences();
+
+            var sb = new StringBuilder();
+            foreach (DbModelTable table in tables)
+            {
+                sb.AppendLine(table.FullName);
+            }
+
+            editor.AllText = sb.ToString();
+        }
+
+        /// <summary>
+        /// Gets a value indicating that the command can be executed (requires a connection).
+        /// </summary>
+        public override bool Enabled
+        {
+            get
+            {
+                return Services.Settings.ConnectionDefinition != null;
+            }
+        }
+    }
+}
\ No newline at end of file
Added +27 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/EmailAuthorCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/EmailAuthorCommand.cs
new file mode 100644
index 0000000..6cb6567
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/EmailAuthorCommand.cs
@@ -0,0 +1,27 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The email author command.
+    /// </summary>
+    public class EmailAuthorCommand
+        : ShowUrlCommand
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "EmailAuthorCommand" /> class.
+        /// </summary>
+        public EmailAuthorCommand()
+            : base("Email the Author", "mailto:mr.paul.kohler" +
+                  '@' + /* bla */
+                  "gmail.com?subject=Mini SQL Query Feedback", ImageResource.email)
+        {
+        }
+    }
+}
\ No newline at end of file
Added +64 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ExecuteTaskCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ExecuteTaskCommand.cs
new file mode 100644
index 0000000..43980da
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ExecuteTaskCommand.cs
@@ -0,0 +1,64 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Windows.Forms;
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The execute task command.
+    /// </summary>
+    public class ExecuteTaskCommand
+        : CommandBase
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "ExecuteTaskCommand" /> class.
+        /// </summary>
+        public ExecuteTaskCommand()
+            : base("&Execute")
+        {
+            ShortcutKeys = Keys.F5;
+            ShortcutKeysText = "F5";
+            SmallImage = ImageResource.lightning;
+        }
+
+        /// <summary>
+        /// 	Gets a value indicating whether Enabled.
+        /// </summary>
+        /// <value>The enabled state.</value>
+        public override bool Enabled
+        {
+            get
+            {
+                var editor = HostWindow.ActiveChildForm as IPerformTask;
+                if (editor != null)
+                {
+                    return !editor.IsBusy;
+                }
+
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// 	Execute the command.
+        /// </summary>
+        public override void Execute()
+        {
+            if (!Enabled)
+            {
+                return;
+            }
+
+            var editor = HostWindow.ActiveChildForm as IPerformTask;
+            if (editor != null)
+            {
+                editor.ExecuteTask();
+            }
+        }
+    }
+}
\ No newline at end of file
Added +33 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ExitApplicationCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ExitApplicationCommand.cs
new file mode 100644
index 0000000..4c557fb
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ExitApplicationCommand.cs
@@ -0,0 +1,33 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The exit application command.
+    /// </summary>
+    public class ExitApplicationCommand
+        : CommandBase
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "ExitApplicationCommand" /> class.
+        /// </summary>
+        public ExitApplicationCommand()
+            : base("E&xit")
+        {
+        }
+
+        /// <summary>
+        /// 	Execute the command.
+        /// </summary>
+        public override void Execute()
+        {
+            HostWindow.Instance.Close();
+        }
+    }
+}
\ No newline at end of file
Added +61 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/GenerateCommandCodeCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/GenerateCommandCodeCommand.cs
new file mode 100644
index 0000000..3df9662
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/GenerateCommandCodeCommand.cs
@@ -0,0 +1,61 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using Ninject;
+using WeifenLuo.WinFormsUI.Docking;
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The generate command code command.
+    /// </summary>
+    public class GenerateCommandCodeCommand
+        : CommandBase
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "GenerateCommandCodeCommand" /> class.
+        /// </summary>
+        public GenerateCommandCodeCommand()
+            : base("Generate Command Code")
+        {
+            SmallImage = ImageResource.cog;
+        }
+
+        /// <summary>
+        /// 	Execute the command.
+        /// </summary>
+        public override void Execute()
+        {
+            string template =
+                @"    public class $name$Command
+        : CommandBase
+    {
+        public $name$Command()
+            : base(""$desc$"")
+        {
+            //ShortcutKeys = Keys.Control | Keys.?;
+			//SmallImage = ImageResource.?;
+		}
+
+        public override void Execute()
+        {
+			
+        }
+    }";
+
+            string code = template
+                .Replace("$name$", "OI")
+                .Replace("$desc$", "a thing");
+
+            var editor = Services.Container.Get<IQueryEditor>();
+            editor.AllText = code;
+            editor.SetSyntax("C#");
+
+            HostWindow.DisplayDockedForm(editor as DockContent);
+        }
+    }
+}
\ No newline at end of file
Added +47 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/InsertGuidCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/InsertGuidCommand.cs
new file mode 100644
index 0000000..1d91a82
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/InsertGuidCommand.cs
@@ -0,0 +1,47 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System;
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The insert guid command.
+    /// </summary>
+    public class InsertGuidCommand : CommandBase
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "InsertGuidCommand" /> class.
+        /// </summary>
+        public InsertGuidCommand()
+            : base("Insert GUID")
+        {
+            // todo SmallImage = ImageResource.;
+        }
+
+        /// <summary>
+        /// 	Gets a value indicating whether Enabled.
+        /// </summary>
+        /// <value>The enabled state.</value>
+        public override bool Enabled
+        {
+            get { return ActiveFormAsEditor != null; }
+        }
+
+        /// <summary>
+        /// 	Execute the command.
+        /// </summary>
+        public override void Execute()
+        {
+            var editor = ActiveFormAsEditor;
+            if (editor != null)
+            {
+                editor.InsertText(Guid.NewGuid().ToString());
+            }
+        }
+    }
+}
\ No newline at end of file
Added +40 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/NewQueryFormCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/NewQueryFormCommand.cs
new file mode 100644
index 0000000..61d72e3
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/NewQueryFormCommand.cs
@@ -0,0 +1,40 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Windows.Forms;
+using Ninject;
+using WeifenLuo.WinFormsUI.Docking;
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The new query form command.
+    /// </summary>
+    public class NewQueryFormCommand
+        : CommandBase
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "NewQueryFormCommand" /> class.
+        /// </summary>
+        public NewQueryFormCommand()
+            : base("New &Query Window")
+        {
+            ShortcutKeys = Keys.Control | Keys.N;
+            SmallImage = ImageResource.page_white;
+        }
+
+        /// <summary>
+        /// 	Execute the command.
+        /// </summary>
+        public override void Execute()
+        {
+            var editor = Services.Container.Get<IQueryEditor>();
+            editor.FileName = null;
+            HostWindow.DisplayDockedForm(editor as DockContent);
+        }
+    }
+}
\ No newline at end of file
Added +38 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/OpenConnectionFileCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/OpenConnectionFileCommand.cs
new file mode 100644
index 0000000..7c58716
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/OpenConnectionFileCommand.cs
@@ -0,0 +1,38 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using WeifenLuo.WinFormsUI.Docking;
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The open connection file command.
+    /// </summary>
+    public class OpenConnectionFileCommand
+        : CommandBase
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "OpenConnectionFileCommand" /> class.
+        /// </summary>
+        public OpenConnectionFileCommand()
+            : base("Open the connections file")
+        {
+        }
+
+        /// <summary>
+        /// 	Execute the command.
+        /// </summary>
+        public override void Execute()
+        {
+            string xmlFile = Utility.GetConnectionStringFilename();
+            IEditor editor = Services.Resolve<IFileEditorResolver>().ResolveEditorInstance(xmlFile);
+            editor.FileName = xmlFile;
+            editor.LoadFile();
+            HostWindow.DisplayDockedForm(editor as DockContent);
+        }
+    }
+}
\ No newline at end of file
Added +52 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/PasteAroundSelectionCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/PasteAroundSelectionCommand.cs
new file mode 100644
index 0000000..d132f55
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/PasteAroundSelectionCommand.cs
@@ -0,0 +1,52 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Windows.Forms;
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	Description of PasteAroundSelectionCommand.
+    /// </summary>
+    public class PasteAroundSelectionCommand : CommandBase
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "PasteAroundSelectionCommand" /> class.
+        /// </summary>
+        public PasteAroundSelectionCommand()
+          : base("Paste &Around Selection")
+        {
+            ShortcutKeys = Keys.Alt | Keys.A;
+            SmallImage = ImageResource.around_text;
+        }
+
+        /// <summary>
+        /// Gets or sets the "left text".
+        /// </summary>
+        /// <value>The "left text".</value>
+        public static string LeftText { get; set; }
+
+        /// <summary>
+        /// Gets or sets the "right text".
+        /// </summary>
+        /// <value>The "right text".</value>
+        public static string RightText { get; set; }
+
+        /// <summary>
+        /// 	Execute the command.
+        /// </summary>
+        public override void Execute()
+        {
+            var queryForm = HostWindow.Instance.ActiveMdiChild as IQueryEditor;
+            if (queryForm != null)
+            {
+                string newText = string.Concat(LeftText, queryForm.SelectedText, RightText);
+                queryForm.InsertText(newText);
+            }
+        }
+    }
+}
\ No newline at end of file
Added +78 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/PrintCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/PrintCommand.cs
new file mode 100644
index 0000000..c2b2890
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/PrintCommand.cs
@@ -0,0 +1,78 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Windows.Forms;
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The print command.
+    /// </summary>
+    public class PrintCommand
+        : CommandBase
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "PrintCommand" /> class.
+        /// </summary>
+        public PrintCommand()
+            : base("Print...")
+        {
+            SmallImage = ImageResource.printer;
+        }
+
+        /// <summary>
+        /// 	Gets a value indicating whether Enabled.
+        /// </summary>
+        /// <value>The enabled state.</value>
+        public override bool Enabled
+        {
+            get
+            {
+                var printable = HostWindow.ActiveChildForm as IPrintableContent;
+                if (printable != null)
+                {
+                    var doc = printable.PrintDocument;
+
+                    if (doc != null)
+                    {
+                        return true;
+                    }
+                }
+
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// 	Execute the command.
+        /// </summary>
+        public override void Execute()
+        {
+            var printable = HostWindow.ActiveChildForm as IPrintableContent;
+            if (printable != null)
+            {
+                var doc = printable.PrintDocument;
+
+                if (doc != null)
+                {
+                    using (var ppd = new PrintDialog())
+                    {
+                        ppd.Document = doc;
+                        ppd.AllowSomePages = true;
+                        // https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k(System.Windows.Forms.PrintDialog.UseEXDialog);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv3.5);k(DevLang-csharp)&rd=true#Anchor_1
+                        ppd.UseEXDialog = true;
+
+                        if (ppd.ShowDialog(HostWindow.Instance) == DialogResult.OK)
+                        {
+                            doc.Print();
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
Added +44 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/RefreshDatabaseConnectionCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/RefreshDatabaseConnectionCommand.cs
new file mode 100644
index 0000000..73ec1a8
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/RefreshDatabaseConnectionCommand.cs
@@ -0,0 +1,44 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Windows.Forms;
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The refresh database connection command.
+    /// </summary>
+    public class RefreshDatabaseConnectionCommand
+        : CommandBase
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "RefreshDatabaseConnectionCommand" /> class.
+        /// </summary>
+        public RefreshDatabaseConnectionCommand()
+            : base("&Refresh Database Connection")
+        {
+            SmallImage = ImageResource.database_refresh;
+        }
+
+        /// <summary>
+        /// 	Execute the command.
+        /// </summary>
+        public override void Execute()
+        {
+            try
+            {
+                HostWindow.SetPointerState(Cursors.WaitCursor);
+                Settings.ResetConnection();
+                HostWindow.SetStatus(null, "Connection reset");
+            }
+            finally
+            {
+                HostWindow.SetPointerState(Cursors.Default);
+            }
+        }
+    }
+}
\ No newline at end of file
Added +38 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/SetLeftPasteAroundSelectionCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/SetLeftPasteAroundSelectionCommand.cs
new file mode 100644
index 0000000..31d5faf
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/SetLeftPasteAroundSelectionCommand.cs
@@ -0,0 +1,38 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Windows.Forms;
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The set left paste around selection command.
+    /// </summary>
+    public class SetLeftPasteAroundSelectionCommand : CommandBase
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "SetLeftPasteAroundSelectionCommand" /> class.
+        /// </summary>
+        public SetLeftPasteAroundSelectionCommand()
+            : base("Set Left Paste Around Selection text")
+        {
+            ShortcutKeys = Keys.Alt | Keys.F1;
+        }
+
+        /// <summary>
+        /// 	Execute the command.
+        /// </summary>
+        public override void Execute()
+        {
+            var queryForm = HostWindow.Instance.ActiveMdiChild as IQueryEditor;
+            if (queryForm != null)
+            {
+                PasteAroundSelectionCommand.LeftText = queryForm.SelectedText;
+            }
+        }
+    }
+}
\ No newline at end of file
Added +38 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/SetRightPasteAroundSelectionCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/SetRightPasteAroundSelectionCommand.cs
new file mode 100644
index 0000000..e7947ff
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/SetRightPasteAroundSelectionCommand.cs
@@ -0,0 +1,38 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Windows.Forms;
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The set right paste around selection command.
+    /// </summary>
+    public class SetRightPasteAroundSelectionCommand : CommandBase
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "SetRightPasteAroundSelectionCommand" /> class.
+        /// </summary>
+        public SetRightPasteAroundSelectionCommand()
+            : base("Set Right Paste Around Selection text")
+        {
+            ShortcutKeys = Keys.Alt | Keys.F2;
+        }
+
+        /// <summary>
+        /// 	Execute the command.
+        /// </summary>
+        public override void Execute()
+        {
+            var queryForm = HostWindow.Instance.ActiveMdiChild as IQueryEditor;
+            if (queryForm != null)
+            {
+                PasteAroundSelectionCommand.RightText = queryForm.SelectedText;
+            }
+        }
+    }
+}
\ No newline at end of file
Added +25 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ShowHelpCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ShowHelpCommand.cs
new file mode 100644
index 0000000..4addead
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ShowHelpCommand.cs
@@ -0,0 +1,25 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The show help command.
+    /// </summary>
+    public class ShowHelpCommand
+        : ShowUrlCommand
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "ShowHelpCommand" /> class.
+        /// </summary>
+        public ShowHelpCommand()
+            : base("&Index (github.com ... Quickstart.md)", "https://github.com/paulkohler/minisqlquery/blob/master/src/Docs/Quickstart.md", ImageResource.help)
+        {
+        }
+    }
+}
\ No newline at end of file
Added +51 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ShowUrlCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ShowUrlCommand.cs
new file mode 100644
index 0000000..9507141
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ShowUrlCommand.cs
@@ -0,0 +1,51 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Drawing;
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The show url command.
+    /// </summary>
+    public class ShowUrlCommand
+        : CommandBase
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref="ShowUrlCommand"/> class.
+        /// </summary>
+        /// <param name="name">
+        /// The name of the command.
+        /// </param>
+        /// <param name="url">
+        /// The url of the link to display in a browser.
+        /// </param>
+        /// <param name="image">
+        /// The image to use from the resources.
+        /// </param>
+        public ShowUrlCommand(string name, string url, Image image)
+            : base(name)
+        {
+            Url = url;
+            SmallImage = image;
+        }
+
+        /// <summary>
+        /// 	Gets or sets Url.
+        /// </summary>
+        /// <value>The url.</value>
+        public string Url { get; protected set; }
+
+        /// <summary>
+        /// 	Execute the command.
+        /// </summary>
+        public override void Execute()
+        {
+            Utility.ShowUrl(Url);
+        }
+    }
+}
\ No newline at end of file
Added +25 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ShowWebPageCommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ShowWebPageCommand.cs
new file mode 100644
index 0000000..9fb5322
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Commands/ShowWebPageCommand.cs
@@ -0,0 +1,25 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+
+namespace MiniSqlQuery.Core.Commands
+{
+    /// <summary>
+    /// 	The show web page command.
+    /// </summary>
+    public class ShowWebPageCommand
+        : ShowUrlCommand
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "ShowWebPageCommand" /> class.
+        /// </summary>
+        public ShowWebPageCommand()
+            : base("Mini SQL Query on GitHub", "https://github.com/paulkohler/minisqlquery", ImageResource.house)
+        {
+        }
+    }
+}
\ No newline at end of file
Added +148 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/ConnectionDefinition.cs b/minisqlquery-master/src/MiniSqlQuery.Core/ConnectionDefinition.cs
new file mode 100644
index 0000000..4c001d9
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/ConnectionDefinition.cs
@@ -0,0 +1,148 @@
+#region License
+// Copyright 2005-2009 Paul Kohler (http://pksoftware.net/MiniSqlQuery/). All rights reserved.
+// This source code is made available under the terms of the Microsoft Public License (Ms-PL)
+// http://minisqlquery.codeplex.com/license
+#endregion
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+
+namespace MiniSqlQuery.Core
+{
+	/// <summary>
+	/// Provides a defition of database connections by provider and name.
+	/// </summary>
+	[Obsolete]
+	public class ConnectionDefinition
+	{
+		/// <summary>
+		/// The character used to "split" the definition text into its components.
+		/// </summary>
+		public const char SplitChar = '^';
+
+		/// <summary>
+		/// The prefix character for comments in the definition text.
+		/// </summary>
+		public const string CommentPrefix = "#";
+
+		/// <summary>
+		/// Gets or sets the name.
+		/// </summary>
+		/// <value>The name.</value>
+		public string Name { get; set; }
+
+		/// <summary>
+		/// Gets or sets the name of the provider.
+		/// </summary>
+		/// <value>The name of the provider.</value>
+		public string ProviderName { get; set; }
+
+		/// <summary>
+		/// Gets or sets the connection string.
+		/// </summary>
+		/// <value>The connection string.</value>
+		public string ConnectionString { get; set; }
+
+		/// <summary>
+		/// A default connection, an MSSQL db on localhost connecting to "master".
+		/// </summary>
+		public static readonly ConnectionDefinition Default;
+
+		/// <summary>
+		/// Initializes the <see cref="ConnectionDefinition"/> class.
+		/// </summary>
+		static ConnectionDefinition()
+		{
+			Default = new ConnectionDefinition()
+			{
+				Name = "Default - MSSQL Master@localhost",
+				ProviderName = "System.Data.SqlClient",
+				ConnectionString = @"Server=.; Database=Master; Integrated Security=SSPI"
+			};
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="ConnectionDefinition"/> class.
+		/// </summary>
+		public ConnectionDefinition()
+		{
+		}
+
+		/// <summary>
+		/// Parses the specified <paramref name="definition"/> string.
+		/// </summary>
+		/// <param name="definition">The definition string, e.g. "Default - MSSQL Master@localhost ^ System.Data.SqlClient ^ Server=.; Database=master; Integrated Security=SSPI".</param>
+		/// <returns>A new <see cref="ConnectionDefinition"/> object or null.</returns>
+		public static ConnectionDefinition Parse(string definition)
+		{
+			ConnectionDefinition connDef = null;
+
+			if (string.IsNullOrEmpty(definition) == false)
+			{
+				if (definition.StartsWith(CommentPrefix) == false)
+				{
+					string[] parts = definition.Split(new char[] { SplitChar }, StringSplitOptions.RemoveEmptyEntries);
+					if (parts != null)
+					{
+						if (parts.Length == 3)
+						{
+							connDef = new ConnectionDefinition()
+							{
+								Name = parts[0].Trim(),
+								ProviderName = parts[1].Trim(),
+								ConnectionString = parts[2].Trim()
+							};
+						}
+					}
+				}
+			}
+
+			return connDef;
+		}
+
+		/// <summary>
+		/// Parses the specified definitions.
+		/// </summary>
+		/// <param name="definitions">The definitions.</param>
+		/// <returns>An array of <see cref="ConnectionDefinition"/> objects.</returns>
+		public static ConnectionDefinition[] Parse(string[] definitions)
+		{
+			List<ConnectionDefinition> conDefs = new List<ConnectionDefinition>();
+
+			if (definitions != null)
+			{
+				foreach (string definition in definitions)
+				{
+					ConnectionDefinition conDef = ConnectionDefinition.Parse(definition);
+					if (conDef != null)
+					{
+						conDefs.Add(conDef);
+					}
+				}
+			}
+
+			return conDefs.ToArray();
+		}
+
+		/// <summary>
+		/// Converts the data to a parsable format.
+		/// </summary>
+		/// <returns></returns>
+		public string ToParsableFormat()
+		{
+			return string.Concat(Name, SplitChar, ProviderName, SplitChar, ConnectionString);
+		}
+
+		/// <summary>
+		/// Returns a <see cref="T:System.String"/> that represents the current <see cref="T:System.Object"/>.
+		/// </summary>
+		/// <returns>
+		/// A <see cref="T:System.String"/> that represents the current <see cref="T:System.Object"/>.
+		/// </returns>
+		public override string ToString()
+		{
+			return Name ?? GetType().FullName;
+		}
+	}
+}
Added +72 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Controls/BatchQuerySelectControl.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/BatchQuerySelectControl.cs
new file mode 100644
index 0000000..2211260
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/BatchQuerySelectControl.cs
@@ -0,0 +1,72 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System;
+using System.Windows.Forms;
+
+namespace MiniSqlQuery.Core.Controls
+{
+    /// <summary>A batch query selection control is used for displaying multiple result sets and allows
+    /// the user to select one (e.g. for exports etc).</summary>
+    public partial class BatchQuerySelectControl : UserControl
+    {
+        /// <summary>The _batch.</summary>
+        private QueryBatch _batch;
+
+        /// <summary>The _selected query.</summary>
+        private Query _selectedQuery;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="BatchQuerySelectControl"/> class.
+        /// </summary>
+        public BatchQuerySelectControl()
+        {
+            InitializeComponent();
+        }
+
+        /// <summary>
+        /// Gets the selected query.
+        /// </summary>
+        /// <value>The selected query.</value>
+        public Query SelectedQuery
+        {
+            get { return _selectedQuery; }
+        }
+
+        /// <summary>Fills the list with the batch result sets.</summary>
+        /// <param name="batch">The query batch.</param>
+        public void Fill(QueryBatch batch)
+        {
+            _batch = batch;
+            lstBatches.Items.Clear();
+            if (batch == null)
+            {
+                return;
+            }
+
+            for (int setIndex = 0; setIndex < batch.Queries.Count; setIndex++)
+            {
+                var query = batch.Queries[setIndex];
+                if (query.Result != null && query.Result.Tables.Count > 0)
+                {
+                    string setName = string.Format("Result Set {0} ({1} tables)", setIndex, query.Result.Tables.Count);
+                    lstBatches.Items.Add(setName);
+                }
+            }
+
+            lstBatches.SelectedIndex = 0;
+        }
+
+        /// <summary>The lst batches_ selected index changed.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void lstBatches_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            _selectedQuery = _batch.Queries[lstBatches.SelectedIndex];
+        }
+    }
+}
\ No newline at end of file
Added +59 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Controls/BatchQuerySelectControl.Designer.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/BatchQuerySelectControl.Designer.cs
new file mode 100644
index 0000000..65790b3
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/BatchQuerySelectControl.Designer.cs
@@ -0,0 +1,59 @@
+namespace MiniSqlQuery.Core.Controls
+{
+	partial class BatchQuerySelectControl
+	{
+		/// <summary> 
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary> 
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if (disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
+
+		#region Component Designer generated code
+
+		/// <summary> 
+		/// Required method for Designer support - do not modify 
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.lstBatches = new System.Windows.Forms.ListBox();
+			this.SuspendLayout();
+			// 
+			// lstBatches
+			// 
+			this.lstBatches.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.lstBatches.FormattingEnabled = true;
+			this.lstBatches.Location = new System.Drawing.Point(0, 0);
+			this.lstBatches.Name = "lstBatches";
+			this.lstBatches.Size = new System.Drawing.Size(293, 160);
+			this.lstBatches.TabIndex = 0;
+			this.lstBatches.SelectedIndexChanged += new System.EventHandler(this.lstBatches_SelectedIndexChanged);
+			// 
+			// BatchQuerySelectControl
+			// 
+			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.Controls.Add(this.lstBatches);
+			this.Name = "BatchQuerySelectControl";
+			this.Size = new System.Drawing.Size(293, 163);
+			this.ResumeLayout(false);
+
+		}
+
+		#endregion
+
+		private System.Windows.Forms.ListBox lstBatches;
+	}
+}
Added +120 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Controls/BatchQuerySelectControl.resx b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/BatchQuerySelectControl.resx
new file mode 100644
index 0000000..19dc0dd
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/BatchQuerySelectControl.resx
@@ -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>
\ No newline at end of file
Added +51 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Controls/ExceptionControl.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/ExceptionControl.cs
new file mode 100644
index 0000000..be6a39b
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/ExceptionControl.cs
@@ -0,0 +1,51 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System;
+using System.Windows.Forms;
+
+namespace MiniSqlQuery.Core.Controls
+{
+    /// <summary>A basic control for displaying an unhandled exception.</summary>
+    public partial class ExceptionControl : UserControl
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ExceptionControl"/> class.
+        /// </summary>
+        public ExceptionControl()
+        {
+            InitializeComponent();
+        }
+
+        /// <summary>Sets the exception to display.</summary>
+        /// <param name="exp">The exception object.</param>
+        public void SetException(Exception exp)
+        {
+            if (exp != null)
+            {
+                lblError.Text = exp.GetType().FullName;
+                txtMessage.Text = exp.Message;
+                txtDetails.Text = exp.ToString();
+            }
+        }
+
+        /// <summary>The exception control_ load.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void ExceptionControl_Load(object sender, EventArgs e)
+        {
+        }
+
+        /// <summary>The lnk copy_ link clicked.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void lnkCopy_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+        {
+            Clipboard.SetText(txtDetails.Text);
+        }
+    }
+}
\ No newline at end of file
Added +119 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Controls/ExceptionControl.Designer.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/ExceptionControl.Designer.cs
new file mode 100644
index 0000000..51a3d8d
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/ExceptionControl.Designer.cs
@@ -0,0 +1,119 @@
+namespace MiniSqlQuery.Core.Controls
+{
+	partial class ExceptionControl
+	{
+		/// <summary> 
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary> 
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if (disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
+
+		#region Component Designer generated code
+
+		/// <summary> 
+		/// Required method for Designer support - do not modify 
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.lblError = new System.Windows.Forms.Label();
+			this.txtMessage = new System.Windows.Forms.TextBox();
+			this.txtDetails = new System.Windows.Forms.TextBox();
+			this.label2 = new System.Windows.Forms.Label();
+			this.lnkCopy = new System.Windows.Forms.LinkLabel();
+			this.SuspendLayout();
+			// 
+			// lblError
+			// 
+			this.lblError.AutoSize = true;
+			this.lblError.Location = new System.Drawing.Point(3, 0);
+			this.lblError.Name = "lblError";
+			this.lblError.Size = new System.Drawing.Size(29, 13);
+			this.lblError.TabIndex = 0;
+			this.lblError.Text = "Error";
+			// 
+			// txtMessage
+			// 
+			this.txtMessage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+						| System.Windows.Forms.AnchorStyles.Right)));
+			this.txtMessage.Location = new System.Drawing.Point(6, 16);
+			this.txtMessage.Multiline = true;
+			this.txtMessage.Name = "txtMessage";
+			this.txtMessage.ReadOnly = true;
+			this.txtMessage.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+			this.txtMessage.Size = new System.Drawing.Size(428, 54);
+			this.txtMessage.TabIndex = 1;
+			// 
+			// txtDetails
+			// 
+			this.txtDetails.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+						| System.Windows.Forms.AnchorStyles.Left)
+						| System.Windows.Forms.AnchorStyles.Right)));
+			this.txtDetails.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+			this.txtDetails.Location = new System.Drawing.Point(6, 94);
+			this.txtDetails.Multiline = true;
+			this.txtDetails.Name = "txtDetails";
+			this.txtDetails.ReadOnly = true;
+			this.txtDetails.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+			this.txtDetails.Size = new System.Drawing.Size(428, 142);
+			this.txtDetails.TabIndex = 3;
+			// 
+			// label2
+			// 
+			this.label2.AutoSize = true;
+			this.label2.Location = new System.Drawing.Point(3, 78);
+			this.label2.Name = "label2";
+			this.label2.Size = new System.Drawing.Size(39, 13);
+			this.label2.TabIndex = 2;
+			this.label2.Text = "Details";
+			// 
+			// lnkCopy
+			// 
+			this.lnkCopy.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+			this.lnkCopy.AutoSize = true;
+			this.lnkCopy.Location = new System.Drawing.Point(344, 239);
+			this.lnkCopy.Name = "lnkCopy";
+			this.lnkCopy.Size = new System.Drawing.Size(90, 13);
+			this.lnkCopy.TabIndex = 4;
+			this.lnkCopy.TabStop = true;
+			this.lnkCopy.Text = "Copy to Clipboard";
+			this.lnkCopy.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkCopy_LinkClicked);
+			// 
+			// ExceptionControl
+			// 
+			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.Controls.Add(this.lnkCopy);
+			this.Controls.Add(this.txtDetails);
+			this.Controls.Add(this.label2);
+			this.Controls.Add(this.txtMessage);
+			this.Controls.Add(this.lblError);
+			this.Name = "ExceptionControl";
+			this.Size = new System.Drawing.Size(437, 256);
+			this.Load += new System.EventHandler(this.ExceptionControl_Load);
+			this.ResumeLayout(false);
+			this.PerformLayout();
+
+		}
+
+		#endregion
+
+		private System.Windows.Forms.Label lblError;
+		private System.Windows.Forms.TextBox txtMessage;
+		private System.Windows.Forms.TextBox txtDetails;
+		private System.Windows.Forms.Label label2;
+		private System.Windows.Forms.LinkLabel lnkCopy;
+	}
+}
Added +120 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Controls/ExceptionControl.resx b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/ExceptionControl.resx
new file mode 100644
index 0000000..19dc0dd
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/ExceptionControl.resx
@@ -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>
\ No newline at end of file
Added +37 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Controls/PluginListControl.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/PluginListControl.cs
new file mode 100644
index 0000000..28e2ff7
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/PluginListControl.cs
@@ -0,0 +1,37 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Windows.Forms;
+
+namespace MiniSqlQuery.Core.Controls
+{
+    /// <summary>A simple control to display plugin details.</summary>
+    public partial class PluginListControl : UserControl
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="PluginListControl"/> class.
+        /// </summary>
+        public PluginListControl()
+        {
+            InitializeComponent();
+        }
+
+        /// <summary>Sets the data source to the <paramref name="plugins"/>.</summary>
+        /// <param name="plugins">The plugins to display.</param>
+        public void SetDataSource(IPlugIn[] plugins)
+        {
+            foreach (IPlugIn plugin in plugins)
+            {
+                ListViewItem item = new ListViewItem(new[]
+                                                         {
+                                                             plugin.PluginName, plugin.PluginDescription, plugin.GetType().Assembly.FullName
+                                                         });
+                listView1.Items.Add(item);
+            }
+        }
+    }
+}
\ No newline at end of file
Added +84 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Controls/PluginListControl.Designer.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/PluginListControl.Designer.cs
new file mode 100644
index 0000000..7dd82b8
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/PluginListControl.Designer.cs
@@ -0,0 +1,84 @@
+namespace MiniSqlQuery.Core.Controls
+{
+	partial class PluginListControl
+	{
+		/// <summary> 
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary> 
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if (disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
+
+		#region Component Designer generated code
+
+		/// <summary> 
+		/// Required method for Designer support - do not modify 
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.listView1 = new System.Windows.Forms.ListView();
+			this.columnHeaderName = new System.Windows.Forms.ColumnHeader();
+			this.columnHeaderDescription = new System.Windows.Forms.ColumnHeader();
+			this.columnHeaderAssembly = new System.Windows.Forms.ColumnHeader();
+			this.SuspendLayout();
+			// 
+			// listView1
+			// 
+			this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeaderName,
+            this.columnHeaderDescription,
+            this.columnHeaderAssembly});
+			this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.listView1.Location = new System.Drawing.Point(0, 0);
+			this.listView1.Name = "listView1";
+			this.listView1.Size = new System.Drawing.Size(361, 146);
+			this.listView1.TabIndex = 0;
+			this.listView1.UseCompatibleStateImageBehavior = false;
+			this.listView1.View = System.Windows.Forms.View.Details;
+			// 
+			// columnHeaderName
+			// 
+			this.columnHeaderName.Text = "Name";
+			this.columnHeaderName.Width = 150;
+			// 
+			// columnHeaderDescription
+			// 
+			this.columnHeaderDescription.Text = "Description";
+			this.columnHeaderDescription.Width = 200;
+			// 
+			// columnHeaderAssembly
+			// 
+			this.columnHeaderAssembly.Text = "Assembly";
+			this.columnHeaderAssembly.Width = 200;
+			// 
+			// PluginListControl
+			// 
+			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.Controls.Add(this.listView1);
+			this.Name = "PluginListControl";
+			this.Size = new System.Drawing.Size(361, 146);
+			this.ResumeLayout(false);
+
+		}
+
+		#endregion
+
+		private System.Windows.Forms.ListView listView1;
+		private System.Windows.Forms.ColumnHeader columnHeaderName;
+		private System.Windows.Forms.ColumnHeader columnHeaderDescription;
+		private System.Windows.Forms.ColumnHeader columnHeaderAssembly;
+	}
+}
Added +120 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Controls/PluginListControl.resx b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/PluginListControl.resx
new file mode 100644
index 0000000..19dc0dd
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Controls/PluginListControl.resx
@@ -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>
\ No newline at end of file
Added +50 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DatabaseMetaDataService.cs b/minisqlquery-master/src/MiniSqlQuery.Core/DatabaseMetaDataService.cs
new file mode 100644
index 0000000..5ffe49b
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DatabaseMetaDataService.cs
@@ -0,0 +1,50 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using MiniSqlQuery.Core.DbModel;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	Creates <see cref="IDatabaseSchemaService"/> instance to provide a simplified view of the database schema.
+    /// </summary>
+    public class DatabaseMetaDataService
+    {
+        /// <summary>
+        /// 	Creates a schema service for a database depending on the <paramref name = "providerName" />.
+        /// 	Currently has specific providers for MSSQL, MSSQL CE and OLE DB.
+        /// 	The <see cref="GenericSchemaService"/> is the fallback option.
+        /// </summary>
+        /// <param name = "providerName">The provider name, e.g. "System.Data.SqlClient".</param>
+        /// <returns>
+        /// A schema serivce for the based on the <paramref name = "providerName" />. 
+        /// The default is <see cref = "GenericSchemaService" />.
+        /// </returns>
+        public static IDatabaseSchemaService Create(string providerName)
+        {
+            switch (providerName)
+            {
+                case "System.Data.OleDb":
+                    return new OleDbSchemaService { ProviderName = providerName };
+
+                case "System.Data.SqlClient":
+                    return new SqlClientSchemaService { ProviderName = providerName };
+                case "Oracle.DataAccess.Client":
+                    return new OracleSchemaService { ProviderName = providerName };
+                default:
+                    // The SQL CE types tend to include the version number within the provider name, hence "StartsWith"
+                    if (providerName.StartsWith("System.Data.SqlServerCe."))
+                    {
+                        return new SqlCeSchemaService { ProviderName = providerName };
+                    }
+
+                    return new GenericSchemaService { ProviderName = providerName };
+            }
+        }
+    }
+}
\ No newline at end of file
Added +99 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DBConnectionDefinition.cs b/minisqlquery-master/src/MiniSqlQuery.Core/DBConnectionDefinition.cs
new file mode 100644
index 0000000..39fed27
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DBConnectionDefinition.cs
@@ -0,0 +1,99 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+using System.IO;
+using System.Xml.Serialization;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	Provides a defition of database connection by provider and name.
+    /// </summary>
+    [Serializable]
+    public class DbConnectionDefinition
+    {
+        /// <summary>
+        /// 	A default connection, an MSSQL db on localhost connecting to the "master" database using integrated authentication.
+        /// </summary>
+        [XmlIgnore] public static readonly DbConnectionDefinition Default;
+
+        /// <summary>
+        /// 	Initializes static members of the <see cref = "DbConnectionDefinition" /> class.
+        /// </summary>
+        static DbConnectionDefinition()
+        {
+            Default = new DbConnectionDefinition
+            {
+                Name = "Default - MSSQL Master@localhost",
+                ProviderName = "System.Data.SqlClient",
+                ConnectionString = @"Server=.; Database=Master; Integrated Security=SSPI"
+            };
+        }
+
+        /// <summary>
+        /// 	Gets or sets a comment in relation to this connection, e.g. "development..."
+        /// </summary>
+        /// <value>A comment.</value>
+        [XmlElement(IsNullable = true)]
+        public string Comment { get; set; }
+
+        /// <summary>
+        /// 	Gets or sets the connection string.
+        /// </summary>
+        /// <value>The connection string.</value>
+        [XmlElement(IsNullable = false)]
+        public string ConnectionString { get; set; }
+
+        /// <summary>
+        /// 	Gets or sets the name.
+        /// </summary>
+        /// <value>The name of the definition.</value>
+        [XmlElement(IsNullable = false)]
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 	Gets or sets the name of the provider.
+        /// </summary>
+        /// <value>The name of the provider.</value>
+        [XmlElement(IsNullable = false)]
+        public string ProviderName { get; set; }
+
+        /// <summary>
+        /// 	Converts the definition from an XML string.
+        /// </summary>
+        /// <param name = "xml">The XML to hydrate from.</param>
+        /// <returns>A <see cref="DbConnectionDefinition"/> instance.</returns>
+        public static DbConnectionDefinition FromXml(string xml)
+        {
+            using (var sr = new StringReader(xml))
+            {
+                var serializer = new XmlSerializer(typeof(DbConnectionDefinition));
+                return (DbConnectionDefinition)serializer.Deserialize(sr);
+            }
+        }
+
+        /// <summary>
+        /// 	Returns a <see cref = "T:System.String" /> that represents the current <see cref = "T:System.Object" />.
+        /// </summary>
+        /// <returns>A <see cref = "T:System.String" /> that represents the current <see cref = "T:System.Object" />.</returns>
+        public override string ToString()
+        {
+            return Name ?? GetType().FullName;
+        }
+
+        /// <summary>
+        /// 	Serialize the object to XML.
+        /// </summary>
+        /// <returns>An XML string.</returns>
+        public string ToXml()
+        {
+            return Utility.ToXml(this);
+        }
+    }
+}
\ No newline at end of file
Added +101 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DBConnectionDefinitionList.cs b/minisqlquery-master/src/MiniSqlQuery.Core/DBConnectionDefinitionList.cs
new file mode 100644
index 0000000..135f98a
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DBConnectionDefinitionList.cs
@@ -0,0 +1,101 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Xml.Serialization;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	Manages a list of database connections.
+    /// </summary>
+    [Serializable]
+    public class DbConnectionDefinitionList
+    {
+        // store internally as a list
+        /// <summary>
+        /// 	An class refernece to the database definitions.
+        /// </summary>
+        private readonly List<DbConnectionDefinition> _definitions;
+
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "DbConnectionDefinitionList" /> class.
+        /// </summary>
+        public DbConnectionDefinitionList()
+        {
+            _definitions = new List<DbConnectionDefinition>();
+        }
+
+        /// <summary>
+        /// 	Gets or sets the default name of a connection definition from the list of <see cref = "Definitions" />.
+        /// </summary>
+        /// <value>The default name.</value>
+        public string DefaultName { get; set; }
+
+        /// <summary>
+        /// 	Gets or sets the connection definitions.
+        /// </summary>
+        /// <value>The definitions.</value>
+        public DbConnectionDefinition[] Definitions
+        {
+            get
+            {
+                return _definitions.ToArray();
+            }
+            set
+            {
+                _definitions.Clear();
+                _definitions.AddRange(value);
+            }
+        }
+
+        /// <summary>
+        /// 	Creates a <see cref = "DbConnectionDefinitionList" /> from a string of <paramref name = "xml" />.
+        /// </summary>
+        /// <param name = "xml">The XML to hydrate from.</param>
+        /// <returns>An instance of <see cref = "DbConnectionDefinitionList" />.</returns>
+        public static DbConnectionDefinitionList FromXml(string xml)
+        {
+            using (var sr = new StringReader(xml))
+            {
+                var serializer = new XmlSerializer(typeof(DbConnectionDefinitionList));
+                return (DbConnectionDefinitionList)serializer.Deserialize(sr);
+            }
+        }
+
+        /// <summary>
+        /// 	Adds the definition from the list.
+        /// </summary>
+        /// <param name = "connectionDefinition">The connection definition.</param>
+        public void AddDefinition(DbConnectionDefinition connectionDefinition)
+        {
+            _definitions.Add(connectionDefinition);
+        }
+
+        /// <summary>
+        /// 	Removes the definition from the list.
+        /// </summary>
+        /// <param name = "connectionDefinition">The connection definition.</param>
+        /// <returns>True if the item was removed.</returns>
+        public bool RemoveDefinition(DbConnectionDefinition connectionDefinition)
+        {
+            return _definitions.Remove(connectionDefinition);
+        }
+
+        /// <summary>
+        /// 	Serialize the list to XML.
+        /// </summary>
+        /// <returns>An XML string.</returns>
+        public string ToXml()
+        {
+            return Utility.ToXml(this);
+        }
+    }
+}
\ No newline at end of file
Added +89 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelColumn.cs b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelColumn.cs
new file mode 100644
index 0000000..843a2a0
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelColumn.cs
@@ -0,0 +1,89 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Diagnostics;
+
+namespace MiniSqlQuery.Core.DbModel
+{
+    /// <summary>The db model column.</summary>
+    [DebuggerDisplay("DbModelColumn: {Name} (DbModelType.Summary: {DbModelType.Summary}, Nullable: {Nullable}, IsKey: {IsKey})")]
+    public class DbModelColumn : DbModelObjectBase
+    {
+        /// <summary>Initializes a new instance of the <see cref="DbModelColumn"/> class.</summary>
+        public DbModelColumn()
+        {
+            Nullable = true;
+            DbType = new DbModelType("varchar", 50);
+            ObjectType = ObjectTypes.Column;
+        }
+
+        /// <summary>Gets or sets DbType.</summary>
+        /// <value>The db type.</value>
+        public virtual DbModelType DbType { get; set; }
+
+        /// <summary>Gets or sets ForeignKeyReference.</summary>
+        /// <value>The foreign key reference.</value>
+        public virtual DbModelForeignKeyReference ForeignKeyReference { get; set; }
+
+        /// <summary>Gets FullName.</summary>
+        /// <value>The full name.</value>
+        public override string FullName
+        {
+            get { return Name; }
+        }
+
+        /// <summary>Gets a value indicating whether HasFK.</summary>
+        /// <value>The has fk.</value>
+        public virtual bool HasFK
+        {
+            get { return ForeignKeyReference != null; }
+        }
+
+        /// <summary>Gets or sets a value indicating whether IsAutoIncrement.</summary>
+        /// <value>The is auto increment.</value>
+        public virtual bool IsAutoIncrement { get; set; }
+
+        /// <summary>Gets or sets a value indicating whether IsIdentity.</summary>
+        /// <value>The is identity.</value>
+        public virtual bool IsIdentity { get; set; }
+
+        /// <summary>Gets or sets a value indicating whether IsKey.</summary>
+        /// <value>The is key.</value>
+        public virtual bool IsKey { get; set; }
+
+        /// <summary>Gets or sets a value indicating whether IsReadOnly.</summary>
+        /// <value>The is read only.</value>
+        public virtual bool IsReadOnly { get; set; }
+
+        /// <summary>
+        /// Gets or sets a value indicating whether this column is a concurrency field, such as a timestamp.
+        /// </summary>
+        /// <value>
+        /// 	<c>true</c> if this instance is row version, or concurrency field; otherwise, <c>false</c>.
+        /// </value>
+        public virtual bool IsRowVersion { get; set; }
+
+        /// <summary>Gets or sets a value indicating whether IsUnique.</summary>
+        /// <value>The is unique.</value>
+        public virtual bool IsUnique { get; set; }
+
+        /// <summary>Gets a value indicating whether IsWritable.</summary>
+        /// <value>The is writable.</value>
+        public virtual bool IsWritable
+        {
+            get { return !IsReadOnly; }
+        }
+
+        /// <summary>Gets or sets a value indicating whether Nullable.</summary>
+        /// <value>The nullable.</value>
+        public virtual bool Nullable { get; set; }
+
+        /// <summary>Gets the parent table of the column.</summary>
+        /// <value>The parent table instance.</value>
+        public virtual DbModelTable ParentTable { get; internal set; }
+    }
+}
\ No newline at end of file
Added +15 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelColumnCollection.cs b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelColumnCollection.cs
new file mode 100644
index 0000000..dc8eebc
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelColumnCollection.cs
@@ -0,0 +1,15 @@
+#region License
+// Copyright 2005-2009 Paul Kohler (http://pksoftware.net/MiniSqlQuery/). All rights reserved.
+// This source code is made available under the terms of the Microsoft Public License (Ms-PL)
+// http://minisqlquery.codeplex.com/license
+#endregion
+using System;
+using System.Collections.Generic;
+
+namespace MiniSqlQuery.Core.DbModel
+{
+	[Obsolete("Just use List - easier for filtering etc")]
+	public class DbModelColumnCollection : List<DbModelColumn>
+	{
+	}
+}
\ No newline at end of file
Added +54 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelConstraint.cs b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelConstraint.cs
new file mode 100644
index 0000000..ad2f12a
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelConstraint.cs
@@ -0,0 +1,54 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+
+namespace MiniSqlQuery.Core.DbModel
+{
+    /// <summary>The db model constraint.</summary>
+    public class DbModelConstraint
+    {
+        /// <summary>Gets or sets ColumnName.</summary>
+        /// <value>The column name.</value>
+        public string ColumnName { get; set; }
+
+        /// <summary>Gets or sets ConstraintName.</summary>
+        /// <value>The constraint name.</value>
+        public string ConstraintName { get; set; }
+
+        /// <summary>Gets or sets ConstraintTableName.</summary>
+        /// <value>The constraint table name.</value>
+        public string ConstraintTableName { get; set; }
+
+        /// <summary>Gets or sets ConstraintTableSchema.</summary>
+        /// <value>The constraint table schema.</value>
+        public string ConstraintTableSchema { get; set; }
+
+        /// <summary>Gets or sets DeleteRule.</summary>
+        /// <value>The delete rule.</value>
+        public string DeleteRule { get; set; }
+
+        /// <summary>Gets or sets UniqueColumnName.</summary>
+        /// <value>The unique column name.</value>
+        public string UniqueColumnName { get; set; }
+
+        /// <summary>Gets or sets UniqueConstraintName.</summary>
+        /// <value>The unique constraint name.</value>
+        public string UniqueConstraintName { get; set; }
+
+        /// <summary>Gets or sets UniqueConstraintTableName.</summary>
+        /// <value>The unique constraint table name.</value>
+        public string UniqueConstraintTableName { get; set; }
+
+        /// <summary>Gets or sets UniqueConstraintTableSchema.</summary>
+        /// <value>The unique constraint table schema.</value>
+        public string UniqueConstraintTableSchema { get; set; }
+
+        /// <summary>Gets or sets UpdateRule.</summary>
+        /// <value>The update rule.</value>
+        public string UpdateRule { get; set; }
+    }
+}
\ No newline at end of file
Added +94 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelDependencyWalker.cs b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelDependencyWalker.cs
new file mode 100644
index 0000000..7851f1e
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelDependencyWalker.cs
@@ -0,0 +1,94 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System;
+using System.Collections.Generic;
+
+namespace MiniSqlQuery.Core.DbModel
+{
+    /// <summary>Examins a <see cref="DbModelInstance"/> providing sort methods.</summary>
+    public class DbModelDependencyWalker
+    {
+        /// <summary>The _model.</summary>
+        private readonly DbModelInstance _model;
+
+        /// <summary>Initializes a new instance of the <see cref="DbModelDependencyWalker"/> class.</summary>
+        /// <param name="model">The database model instance.</param>
+        public DbModelDependencyWalker(DbModelInstance model)
+        {
+            if (model == null)
+            {
+                throw new ArgumentNullException("model");
+            }
+
+            _model = model;
+        }
+
+        /// <summary>Sorts the tables by checking the foreign key references recursivly building a list of tables in order.</summary>
+        /// <returns>An array of tables in dependency order.</returns>
+        public DbModelTable[] SortTablesByForeignKeyReferences()
+        {
+            List<DbModelTable> tables = new List<DbModelTable>();
+
+            // add tables with no FKs
+            foreach (DbModelTable table in _model.Tables)
+            {
+                if (table.ForeignKeyColumns.Count == 0)
+                {
+                    tables.Add(table);
+                }
+            }
+
+            foreach (DbModelTable table in _model.Tables)
+            {
+                ProcessForeignKeyReferences(1, tables, table);
+            }
+
+            return tables.ToArray();
+        }
+
+        /// <summary>The process foreign key references.</summary>
+        /// <param name="level">The level.</param>
+        /// <param name="tablesList">The tables list.</param>
+        /// <param name="table">The table.</param>
+        /// <exception cref="InvalidOperationException"></exception>
+        private void ProcessForeignKeyReferences(int level, List<DbModelTable> tablesList, DbModelTable table)
+        {
+            if (tablesList.Contains(table))
+            {
+                return;
+            }
+
+            // recursive insurance ;-)
+            level++;
+            if (level > 1000)
+            {
+                throw new InvalidOperationException(string.Format("FK processor exceeded recursive level of 1000 at '{0}'.", table.Name));
+            }
+
+            // if there are FK refs, add the refered tables first
+            if (table.ForeignKeyColumns.Count > 0)
+            {
+                // if the table is not already in the list....
+                foreach (DbModelColumn fkColumn in table.ForeignKeyColumns)
+                {
+                    // ensure its not a self referencing table
+                    if (fkColumn.ForeignKeyReference.ReferenceTable != table)
+                    {
+                        ProcessForeignKeyReferences(++level, tablesList, fkColumn.ForeignKeyReference.ReferenceTable);
+                    }
+                }
+
+                // now add the table if not in the list yet
+                if (!tablesList.Contains(table))
+                {
+                    tablesList.Add(table);
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
Added +54 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelForeignKeyReference.cs b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelForeignKeyReference.cs
new file mode 100644
index 0000000..ad6c910
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelForeignKeyReference.cs
@@ -0,0 +1,54 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+
+namespace MiniSqlQuery.Core.DbModel
+{
+    /// <summary>The db model foreign key reference.</summary>
+    public class DbModelForeignKeyReference
+    {
+        /// <summary>Initializes a new instance of the <see cref="DbModelForeignKeyReference"/> class.</summary>
+        public DbModelForeignKeyReference()
+        {
+        }
+
+        /// <summary>Initializes a new instance of the <see cref="DbModelForeignKeyReference"/> class.</summary>
+        /// <param name="owningColumn">The owning column.</param>
+        /// <param name="fkTable">The fk table.</param>
+        /// <param name="fkColumn">The fk column.</param>
+        public DbModelForeignKeyReference(DbModelColumn owningColumn, DbModelTable fkTable, DbModelColumn fkColumn)
+        {
+            OwningColumn = owningColumn;
+            ReferenceTable = fkTable;
+            ReferenceColumn = fkColumn;
+        }
+
+        /// <summary>Gets or sets ConstraintName.</summary>
+        /// <value>The constraint name.</value>
+        public virtual string ConstraintName { get; set; }
+
+        /// <summary>Gets or sets DeleteRule.</summary>
+        /// <value>The delete rule.</value>
+        public string DeleteRule { get; set; }
+
+        /// <summary>Gets or sets OwningColumn.</summary>
+        /// <value>The owning column.</value>
+        public DbModelColumn OwningColumn { get; set; }
+
+        /// <summary>Gets or sets ReferenceColumn.</summary>
+        /// <value>The reference column.</value>
+        public DbModelColumn ReferenceColumn { get; set; }
+
+        /// <summary>Gets or sets ReferenceTable.</summary>
+        /// <value>The reference table.</value>
+        public DbModelTable ReferenceTable { get; set; }
+
+        /// <summary>Gets or sets UpdateRule.</summary>
+        /// <value>The update rule.</value>
+        public string UpdateRule { get; set; }
+    }
+}
\ No newline at end of file
Added +101 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelInstance.cs b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelInstance.cs
new file mode 100644
index 0000000..5776f44
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelInstance.cs
@@ -0,0 +1,101 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System;
+using System.Collections.Generic;
+
+namespace MiniSqlQuery.Core.DbModel
+{
+    /// <summary>The db model instance.</summary>
+    public class DbModelInstance
+    {
+        /// <summary>The _tables.</summary>
+        private readonly List<DbModelTable> _tables;
+
+        /// <summary>The _views.</summary>
+        private readonly List<DbModelView> _views;
+
+        /// <summary>Initializes a new instance of the <see cref="DbModelInstance"/> class.</summary>
+        public DbModelInstance()
+        {
+            _tables = new List<DbModelTable>();
+            _views = new List<DbModelView>();
+        }
+
+        /// <summary>Gets or sets ConnectionString.</summary>
+        /// <value>The connection string.</value>
+        public string ConnectionString { get; set; }
+
+        /// <summary>Gets or sets ProviderName.</summary>
+        /// <value>The provider name.</value>
+        public string ProviderName { get; set; }
+
+        /// <summary>Gets Tables.</summary>
+        /// <value>The tables.</value>
+        public virtual ICollection<DbModelTable> Tables
+        {
+            get { return _tables; }
+        }
+
+        /// <summary>Gets or sets Types.</summary>
+        /// <value>The types.</value>
+        public Dictionary<string, DbModelType> Types { get; set; }
+
+        /// <summary>Gets Views.</summary>
+        /// <value>The views.</value>
+        public virtual ICollection<DbModelView> Views
+        {
+            get { return _views; }
+        }
+
+        /// <summary>The add.</summary>
+        /// <param name="table">The table.</param>
+        public virtual void Add(DbModelTable table)
+        {
+            table.ParentDb = this;
+            _tables.Add(table);
+        }
+
+        /// <summary>The add.</summary>
+        /// <param name="view">The view.</param>
+        public virtual void Add(DbModelView view)
+        {
+            view.ParentDb = this;
+            _views.Add(view);
+        }
+
+        /// <summary>The find table.</summary>
+        /// <param name="tableName">The table name.</param>
+        /// <returns></returns>
+        public virtual DbModelTable FindTable(string tableName)
+        {
+            return _tables.Find(table => table.FullName.Equals(tableName, StringComparison.InvariantCultureIgnoreCase));
+        }
+
+        /// <summary>The find table or view.</summary>
+        /// <param name="name">The name.</param>
+        /// <returns></returns>
+        public virtual DbModelTable FindTableOrView(string name)
+        {
+            var obj = _tables.Find(table => table.FullName.Equals(name, StringComparison.InvariantCultureIgnoreCase));
+            if (obj == null)
+            {
+                obj = _views.Find(view => view.FullName.Equals(name, StringComparison.InvariantCultureIgnoreCase));
+            }
+
+            return obj;
+        }
+
+        /// <summary>The find view.</summary>
+        /// <param name="viewName">The view name.</param>
+        /// <returns></returns>
+        public virtual DbModelTable FindView(string viewName)
+        {
+            return _views.Find(view => view.FullName.Equals(viewName, StringComparison.InvariantCultureIgnoreCase));
+        }
+    }
+}
\ No newline at end of file
Added +46 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelObjectBase.cs b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelObjectBase.cs
new file mode 100644
index 0000000..348fd8f
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelObjectBase.cs
@@ -0,0 +1,46 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+
+namespace MiniSqlQuery.Core.DbModel
+{
+    /// <summary>The db model object base.</summary>
+    public class DbModelObjectBase : IDbModelNamedObject
+    {
+        private string _fullName;
+
+        /// <summary>
+        /// Gets the full name of the object which may include the <see cref="IDbModelNamedObject.Schema"/> for example.
+        /// </summary>
+        /// <value>The full name.</value>
+        public virtual string FullName
+        {
+            get
+            {
+                if (_fullName == null)
+                {
+                    _fullName = Utility.RenderSafeSchemaObjectName(Schema, Name);
+                }
+
+                return _fullName;
+            }
+        }
+
+        /// <summary>Gets or sets name of the database object.</summary>
+        /// <value>The name of the object.</value>
+        public virtual string Name { get; set; }
+
+        /// <summary>Gets or sets ObjectType.</summary>
+        /// <value>The object type.</value>
+        public virtual string ObjectType { get; set; }
+
+        /// <summary>Gets or sets Schema.</summary>
+        /// <value>The schema.</value>
+        public virtual string Schema { get; set; }
+    }
+}
\ No newline at end of file
Added +66 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelTable.cs b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelTable.cs
new file mode 100644
index 0000000..c5e7820
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelTable.cs
@@ -0,0 +1,66 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Collections.Generic;
+using System.Diagnostics;
+
+namespace MiniSqlQuery.Core.DbModel
+{
+    /// <summary>The db model table.</summary>
+    [DebuggerDisplay("DbModelTable: {FullName} (Columns: {Columns.Count}, PKs: {PrimaryKeyColumns.Count}, FKs: {ForeignKeyColumns.Count})")]
+    public class DbModelTable : DbModelObjectBase
+    {
+        /// <summary>Initializes a new instance of the <see cref="DbModelTable"/> class.</summary>
+        public DbModelTable()
+        {
+            Columns = new List<DbModelColumn>();
+            Constraints = new List<DbModelConstraint>();
+            ObjectType = ObjectTypes.Table;
+        }
+
+        /// <summary>Gets the Columns for this table.</summary>
+        /// <value>The columns.</value>
+        public virtual List<DbModelColumn> Columns { get; internal set; }
+
+        /// <summary>Gets Constraints.</summary>
+        /// <value>The constraints.</value>
+        public virtual List<DbModelConstraint> Constraints { get; private set; }
+
+        /// <summary>Gets ForeignKeyColumns.</summary>
+        /// <value>The foreign key columns.</value>
+        public virtual List<DbModelColumn> ForeignKeyColumns
+        {
+            get { return Columns.FindAll(c => c.ForeignKeyReference != null); }
+        }
+
+        /// <summary>Gets NonKeyColumns.</summary>
+        /// <value>The non key columns.</value>
+        public virtual List<DbModelColumn> NonKeyColumns
+        {
+            get { return Columns.FindAll(c => !c.IsKey && c.ForeignKeyReference == null); }
+        }
+
+        /// <summary>Gets a reference to the parent database instance.</summary>
+        /// <value>The parent model instance object.</value>
+        public virtual DbModelInstance ParentDb { get; internal set; }
+
+        /// <summary>Gets PrimaryKeyColumns.</summary>
+        /// <value>The primary key columns.</value>
+        public virtual List<DbModelColumn> PrimaryKeyColumns
+        {
+            get { return Columns.FindAll(c => c.IsKey); }
+        }
+
+        /// <summary>Adds the <paramref name="column"/> to the list of <see cref="Columns"/> assigning the <see cref="DbModelColumn.ParentTable"/>.</summary>
+        /// <param name="column">The new column.</param>
+        public virtual void Add(DbModelColumn column)
+        {
+            column.ParentTable = this;
+            Columns.Add(column);
+        }
+    }
+}
\ No newline at end of file
Added +212 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelType.cs b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelType.cs
new file mode 100644
index 0000000..261c15b
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelType.cs
@@ -0,0 +1,212 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+
+namespace MiniSqlQuery.Core.DbModel
+{
+    /// <summary>Describes a database type.</summary>
+    [DebuggerDisplay("DbModelType: {Name} [{Summary,nq}]")]
+    public class DbModelType : DbModelObjectBase
+    {
+        /// <summary>Initializes a new instance of the <see cref="DbModelType"/> class.</summary>
+        /// <param name="name">The name of the type, e.g. "varchar".</param>
+        /// <param name="length">The length of the type, e.g. 10.</param>
+        public DbModelType(string name, int length)
+        {
+            Name = name;
+            Length = length;
+        }
+
+        /// <summary>Gets or sets CreateFormat.</summary>
+        /// <value>The create format.</value>
+        public virtual string CreateFormat { get; set; }
+
+        /// <summary>Gets or sets CreateParameters.</summary>
+        /// <value>The create parameters.</value>
+        public virtual string CreateParameters { get; set; }
+
+        /// <summary>Gets or sets Length.</summary>
+        /// <value>The length.</value>
+        public virtual int Length { get; set; }
+
+        /// <summary>Gets or sets LiteralPrefix.</summary>
+        /// <value>The literal prefix.</value>
+        public virtual string LiteralPrefix { get; set; }
+
+        /// <summary>Gets or sets LiteralSuffix.</summary>
+        /// <value>The literal suffix.</value>
+        public virtual string LiteralSuffix { get; set; }
+
+        /// <summary>Gets or sets Precision.</summary>
+        /// <value>The precision.</value>
+        public virtual int Precision { get; set; }
+
+        /// <summary>Gets or sets ProviderDbType.</summary>
+        /// <value>The provider db type.</value>
+        public virtual string ProviderDbType { get; set; }
+
+        /// <summary>Gets or sets Scale.</summary>
+        /// <value>The scale.</value>
+        public virtual int Scale { get; set; }
+
+        /// <summary>
+        /// Gets the summary of the SQL type using the <see cref="CreateFormat"/> if applicable.
+        /// </summary>
+        /// <value>The summary.</value>
+        public virtual string Summary
+        {
+            get
+            {
+                if (!string.IsNullOrEmpty(CreateFormat))
+                {
+                    if (CreateFormat.Contains("{1}") && (Precision != -1 && Scale != -1))
+                    {
+                        return string.Format(CreateFormat, Precision, Scale);
+                    }
+
+                    if (CreateFormat.Contains("{0}") && !CreateFormat.Contains("{1}") && (Length != -1))
+                    {
+                        return string.Format(CreateFormat, Length);
+                    }
+
+                    if (CreateFormat.Contains("{0}"))
+                    {
+                        // err...
+                        return Name;
+                    }
+
+                    return CreateFormat;
+                }
+
+                return Name;
+            }
+        }
+
+        /// <summary>Gets or sets SystemType.</summary>
+        /// <value>The system type.</value>
+        public virtual Type SystemType { get; set; }
+
+        /// <summary>Gets or sets Value.</summary>
+        /// <value>The value.</value>
+        public virtual object Value { get; set; }
+
+        // public static DbModelType Create(string name, int length, int precision, int scale, string systemTypeName)
+        // {
+        // return Create(null, name, length, precision, scale, systemTypeName);
+        // }
+
+        /// <summary>Creates an instance of <see cref="DbModelType"/> defined by the parameers.</summary>
+        /// <param name="dbTypes">The db types list, if the <paramref name="name"/> is in the list it is used as a base copy of the type.</param>
+        /// <param name="name">The name of the type, e.g. "int", "nvarchar" etc.</param>
+        /// <param name="length">The length of the type.</param>
+        /// <param name="precision">The precision.</param>
+        /// <param name="scale">The scale.</param>
+        /// <param name="systemTypeName">Name of the system type, e.g. "System.String".</param>
+        /// <returns>An instance of <see cref="DbModelType"/> defined by the parameers</returns>
+        public static DbModelType Create(Dictionary<string, DbModelType> dbTypes, string name, int length, int precision, int scale, string systemTypeName)
+        {
+            DbModelType baseType;
+
+            string key = name.ToLower();
+            if (dbTypes != null && dbTypes.ContainsKey(key))
+            {
+                // the type should be here, this is used as a baseline for new instances
+                baseType = dbTypes[key].Copy();
+                baseType.Length = length;
+            }
+            else
+            {
+                baseType = new DbModelType(name, length);
+                baseType.SystemType = Type.GetType(systemTypeName);
+            }
+
+            baseType.Precision = precision;
+            baseType.Scale = scale;
+
+            return baseType;
+        }
+
+        /// <summary>Copies this instance.</summary>
+        /// <returns>A copy of this instance.</returns>
+        public DbModelType Copy()
+        {
+            DbModelType copy = new DbModelType(Name, Length)
+            {
+                CreateFormat = CreateFormat,
+                CreateParameters = CreateParameters,
+                LiteralPrefix = LiteralPrefix,
+                LiteralSuffix = LiteralSuffix,
+                Precision = Precision,
+                Scale = Scale,
+                SystemType = SystemType,
+            };
+            return copy;
+        }
+
+        /// <summary>Renders this <see cref="DbModelType"/> as basic DDL base on the contents of <see cref="Value"/> (assumes nullable).</summary>
+        /// <returns>An SQL string representing the <see cref="Value"/> acording to the database type (assumes nullable).</returns>
+        public string ToDDLValue()
+        {
+            return ToDDLValue(true);
+        }
+
+        /// <summary>Renders this <see cref="DbModelType"/> as basic DDL base on the contents of <see cref="Value"/>.</summary>
+        /// <param name="nullable">A boolean value indicating the nullability of the column.</param>
+        /// <returns>An SQL string representing the <see cref="Value"/> acording to the database type.</returns>
+        /// <remarks>If a column is "not null" and the <see cref="Value"/> is null, in the furure this method will attampt to return a default value
+        /// rather than throwing an exception etc.</remarks>
+        public string ToDDLValue(bool nullable)
+        {
+            if (Value == null || Value == DBNull.Value)
+            {
+                if (nullable)
+                {
+                    return "null";
+                }
+
+                // not supposed to be nullable but the Value is. render a default
+                switch (SystemType.FullName)
+                {
+                    case "System.String":
+                        return string.Concat(LiteralPrefix, LiteralSuffix);
+                    case "System.DateTime":
+                        return "'?'";
+                    case "System.Guid":
+                        return string.Concat("'", Guid.Empty, "'");
+                    default:
+                        return "0"; // take a punt
+                }
+            }
+
+            if (SystemType == typeof(string))
+            {
+                return string.Concat(LiteralPrefix, ((string)Value).Replace("'", "''"), LiteralSuffix);
+            }
+
+            if (SystemType == typeof(DateTime))
+            {
+                return string.Format("{0}{1:yyyy-MM-dd HH:mm:ss}{2}", LiteralPrefix, Value, LiteralSuffix);
+            }
+
+            if (SystemType == typeof(bool) && Name.Equals("bit", StringComparison.InvariantCultureIgnoreCase))
+            {
+                return ((bool)Value) ? "1" : "0";
+            }
+
+            if (SystemType == typeof(byte[]))
+            {
+                return "null /* not supported yet */ ";
+            }
+
+            return string.Concat(LiteralPrefix, Value, LiteralSuffix);
+        }
+    }
+}
\ No newline at end of file
Added +20 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelView.cs b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelView.cs
new file mode 100644
index 0000000..8438833
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/DbModelView.cs
@@ -0,0 +1,20 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+
+namespace MiniSqlQuery.Core.DbModel
+{
+    /// <summary>The db model view.</summary>
+    public class DbModelView : DbModelTable
+    {
+        /// <summary>Initializes a new instance of the <see cref="DbModelView"/> class.</summary>
+        public DbModelView()
+        {
+            ObjectType = ObjectTypes.View;
+        }
+    }
+}
\ No newline at end of file
Added +359 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/GenericSchemaService.cs b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/GenericSchemaService.cs
new file mode 100644
index 0000000..a8a374a
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/GenericSchemaService.cs
@@ -0,0 +1,359 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.Common;
+using System.Diagnostics;
+
+namespace MiniSqlQuery.Core.DbModel
+{
+    /// <summary>
+    /// The generic schema service.
+    /// </summary>
+    public class GenericSchemaService : IDatabaseSchemaService
+    {
+        /// <summary>The _connection.</summary>
+        private string _connection;
+
+        /// <summary>Gets or sets a value indicating whether ForeignKeyInformationAvailable.</summary>
+        /// <value>The foreign key information available.</value>
+        public bool ForeignKeyInformationAvailable { get; set; }
+
+        /// <summary>Gets or sets ProviderName.</summary>
+        /// <value>The provider name.</value>
+        public string ProviderName { get; set; }
+
+        /// <summary>Gets a database object model that represents the items defined by the <paramref name="connection"/>.</summary>
+        /// <param name="connection">The connection string.</param>
+        /// <returns>An instance of <see cref="DbModelInstance"/> describing the database.</returns>
+        public virtual DbModelInstance GetDbObjectModel(string connection)
+        {
+
+            _connection = connection;
+
+            DbModelInstance model = new DbModelInstance();
+            DbProviderFactory factory = DbProviderFactories.GetFactory(ProviderName);
+
+            try
+            {
+                using (DbConnection dbConn = factory.CreateConnection())
+                {
+                    dbConn.ConnectionString = connection;
+                    dbConn.Open();
+
+                    DataTable tables = dbConn.GetSchema("Tables");
+                    Dictionary<string, DbModelType> dbTypes = GetDbTypes(dbConn);
+                    model.Types = dbTypes;
+                    model.ProviderName = ProviderName;
+                    model.ConnectionString = _connection;
+
+                    if (tables == null)
+                    {
+                        return model;
+                    }
+
+                    DataView tablesDV = new DataView(tables, "TABLE_TYPE='TABLE' OR TABLE_TYPE='BASE TABLE'", "TABLE_SCHEMA, TABLE_NAME", DataViewRowState.CurrentRows);
+
+                    foreach (DataRowView row in tablesDV)
+                    {
+                        string schemaName = SafeGetString(row.Row, "TABLE_SCHEMA");
+                        string tableName = SafeGetString(row.Row, "TABLE_NAME");
+
+                        DbModelTable dbTable = new DbModelTable { Schema = schemaName, Name = tableName };
+                        model.Add(dbTable);
+
+                        DataTable schemaTableKeyInfo = GetTableKeyInfo(dbConn, schemaName, tableName);
+                        GetColumnsForTable(dbTable, schemaTableKeyInfo, dbTypes);
+                    }
+
+                    DataView viewsDV = new DataView(tables, "TABLE_TYPE='VIEW'", "TABLE_SCHEMA, TABLE_NAME", DataViewRowState.CurrentRows);
+                    foreach (DataRowView row in viewsDV)
+                    {
+                        string schemaName = SafeGetString(row.Row, "TABLE_SCHEMA");
+                        string tableName = SafeGetString(row.Row, "TABLE_NAME");
+
+                        DbModelView dbTable = new DbModelView { Schema = schemaName, Name = tableName };
+                        model.Add(dbTable);
+
+                        DataTable schemaTableKeyInfo = GetTableKeyInfo(dbConn, schemaName, tableName);
+                        GetColumnsForTable(dbTable, schemaTableKeyInfo, dbTypes);
+                    }
+
+                    // build FK relationships 
+                    if (model.Tables != null)
+                    {
+                        foreach (DbModelTable table in model.Tables)
+                        {
+                            GetForeignKeyReferencesForTable(dbConn, table);
+                            ProcessForeignKeyReferencesForTable(dbConn, table);
+                        }
+                    }
+
+                    // build FK relationships
+                    if (model.Views != null)
+                    {
+                        foreach (DbModelView view in model.Views)
+                        {
+                            GetForeignKeyReferencesForTable(dbConn, view);
+                            ProcessForeignKeyReferencesForTable(dbConn, view);
+                        }
+                    }
+                }
+            }
+            catch (Exception)
+            {
+                // catch all for providers that are not implementing the schema info.
+                return model;
+            }
+
+            return model;
+        }
+
+        /// <summary>The get db types.</summary>
+        /// <param name="connection">The connection.</param>
+        /// <returns>A dictionary of named <see cref="DbModelType"/> objects supported by the database.</returns>
+        /// <exception cref="ArgumentNullException">If the <paramref name="connection"/> is null.</exception>
+        public virtual Dictionary<string, DbModelType> GetDbTypes(DbConnection connection)
+        {
+            if (connection == null)
+            {
+                throw new ArgumentNullException("connection");
+            }
+
+            Dictionary<string, DbModelType> dbTypes = new Dictionary<string, DbModelType>();
+
+            DataTable dataTypes = connection.GetSchema("DataTypes");
+
+            foreach (DataRow row in dataTypes.Rows)
+            {
+                string typeName = SafeGetString(row, "TypeName");
+                int columnSize = SafeGetInt(row, "ColumnSize");
+                DbModelType dbType = new DbModelType(typeName, columnSize);
+
+                // Some providers may double up on schema info, check first:
+                if (!dbTypes.ContainsKey(typeName.ToLower()))
+                {
+                    dbTypes.Add(typeName.ToLower(), dbType);
+
+                    dbType.CreateFormat = SafeGetString(row, "CreateFormat");
+                    dbType.CreateParameters = SafeGetString(row, "CreateParameters");
+                    dbType.LiteralPrefix = SafeGetString(row, "LiteralPrefix");
+                    dbType.LiteralSuffix = SafeGetString(row, "LiteralSuffix");
+                    dbType.SystemType = Type.GetType(SafeGetString(row, "DataType"));
+                    dbType.ProviderDbType = SafeGetString(row, "ProviderDbType");
+                }
+            }
+
+            return dbTypes;
+        }
+
+        /// <returns>The get description of the database.</returns>
+        public string GetDescription()
+        {
+            return "todo";
+        }
+
+        /// <summary>The get columns for table.</summary>
+        /// <param name="dbTable">The db table.</param>
+        /// <param name="schemaTableKeyInfo">The schema table key info.</param>
+        /// <param name="dbTypes">The db types.</param>
+        protected virtual void GetColumnsForTable(DbModelTable dbTable, DataTable schemaTableKeyInfo, Dictionary<string, DbModelType> dbTypes)
+        {
+            if (schemaTableKeyInfo == null)
+            {
+                return;
+            }
+
+            foreach (DataRow columnRow in schemaTableKeyInfo.Rows)
+            {
+                if (SafeGetBool(columnRow, "IsHidden"))
+                {
+                    continue;
+                }
+
+                string columnName = SafeGetString(columnRow, "ColumnName");
+                string dataType = GetDataTypeNameForColumn(dbTable, schemaTableKeyInfo, columnRow);
+
+                // note - need a better work around for columns missing the data type info (e.g. access)
+                if (string.IsNullOrEmpty(dataType))
+                {
+                    // try using the "ProviderDbType" to match
+                    string providerDbType = SafeGetString(columnRow, "ProviderType");
+                    foreach (var type in dbTypes.Values)
+                    {
+                        if (type.ProviderDbType == providerDbType)
+                        {
+                            dataType = type.Name;
+                            break;
+                        }
+                    }
+                }
+
+                DbModelType dbType = DbModelType.Create(
+                    dbTypes,
+                    dataType,
+                    SafeGetInt(columnRow, "ColumnSize"),
+                    SafeGetInt(columnRow, "Precision"),
+                    SafeGetInt(columnRow, "Scale"),
+                    SafeGetString(columnRow, "DataType"));
+
+                // todo - FK info
+                DbModelColumn dbColumn = new DbModelColumn
+                {
+                    Name = columnName,
+                    // Name = MakeSqlFriendly(columnName),
+                    Nullable = SafeGetBool(columnRow, "AllowDBNull"),
+                    IsKey = SafeGetBool(columnRow, "IsKey"),
+                    IsUnique = SafeGetBool(columnRow, "IsUnique"),
+                    IsRowVersion = SafeGetBool(columnRow, "IsRowVersion"),
+                    IsIdentity = SafeGetBool(columnRow, "IsIdentity"),
+                    IsAutoIncrement = SafeGetBool(columnRow, "IsAutoIncrement"),
+                    IsReadOnly = SafeGetBool(columnRow, "IsReadOnly"),
+                    DbType = dbType,
+                };
+                dbTable.Add(dbColumn);
+            }
+        }
+
+        /// <summary>The get data type name for column.</summary>
+        /// <param name="dbTable">The db table.</param>
+        /// <param name="schemaTableKeyInfo">The schema table key info.</param>
+        /// <param name="columnRow">The column row.</param>
+        /// <returns>The get data type name for column.</returns>
+        protected virtual string GetDataTypeNameForColumn(DbModelTable dbTable, DataTable schemaTableKeyInfo, DataRow columnRow)
+        {
+            return SafeGetString(columnRow, "DataTypeName");
+        }
+
+        /// <summary>The get foreign key references for table.</summary>
+        /// <param name="dbConn">The db conn.</param>
+        /// <param name="dbTable">The db table.</param>
+        protected virtual void GetForeignKeyReferencesForTable(DbConnection dbConn, DbModelTable dbTable)
+        {
+            // foreach (DbModelColumn column in dbTable.Columns)
+            // {
+            // // KF info for DB's varies widley, needs to be implemented by derived class
+            // column.ForeignKeyReference = DbModelForeignKeyReference.NullForeignKeyReference;
+            // }
+        }
+
+        /// <summary>The get table key information.</summary>
+        /// <param name="dbConn">The database connection.</param>
+        /// <param name="schema">The schema.</param>
+        /// <param name="name">The name of the table.</param>
+        /// <returns>A <see cref="DataTable"/> describing the tables columns and key information.</returns>
+        protected virtual DataTable GetTableKeyInfo(DbConnection dbConn, string schema, string name)
+        {
+            DataTable schemaTableKeyInfo = null;
+            try
+            {
+                using (DbCommand command = dbConn.CreateCommand())
+                {
+                    string tableName = Utility.RenderSafeSchemaObjectName(schema, name);
+                    command.CommandText = "SELECT * FROM " + MakeSqlFriendly(tableName);
+                    using (DbDataReader reader = command.ExecuteReader(CommandBehavior.SchemaOnly | CommandBehavior.KeyInfo))
+                    {
+                        schemaTableKeyInfo = reader.GetSchemaTable();
+                    }
+                }
+            }
+            catch (Exception exp)
+            {
+                // Generic catch all - not all provoders stick to the DbException base:
+                Debug.WriteLine(GetType().FullName + " ERROR: " + exp.Message);
+            }
+
+            return schemaTableKeyInfo;
+        }
+
+        /// <summary>The make sql friendly.</summary>
+        /// <param name="name">The name.</param>
+        /// <returns>The make sql friendly.</returns>
+        protected virtual string MakeSqlFriendly(string name)
+        {
+            return Utility.MakeSqlFriendly(name);
+        }
+
+        /// <summary>The process foreign key references for table.</summary>
+        /// <param name="dbConn">The db conn.</param>
+        /// <param name="dbTable">The db table.</param>
+        protected virtual void ProcessForeignKeyReferencesForTable(DbConnection dbConn, DbModelTable dbTable)
+        {
+        }
+
+
+        /// <summary>The safe get bool.</summary>
+        /// <param name="row">The row.</param>
+        /// <param name="columnName">The column name.</param>
+        /// <returns>The safe get bool.</returns>
+        protected bool SafeGetBool(DataRow row, string columnName)
+        {
+            if (row.Table.Columns.Contains(columnName) && !row.IsNull(columnName))
+            {
+                string value = row[columnName].ToString();
+                switch (value.ToLower())
+                {
+                    case "no":
+                    case "false":
+                        return false;
+
+                    case "yes":
+                    case "true":
+                        return true;
+                }
+            }
+
+            return false;
+        }
+
+        /// <summary>The safe get int.</summary>
+        /// <param name="row">The row.</param>
+        /// <param name="columnName">The column name.</param>
+        /// <returns>The safe get int.</returns>
+        protected virtual int SafeGetInt(DataRow row, string columnName)
+        {
+            try
+            {
+                int result = -1;
+
+                if (row.Table.Columns.Contains(columnName) && !row.IsNull(columnName))
+                {
+                    result = Convert.ToInt32(row[columnName]);
+                }
+
+                return result;
+            }
+            catch (OverflowException)
+            {
+                // In Oracle Maximum size for column is larger than Max Int32, instead of changing return value, just coerce on Max.Int32.
+
+                return Int32.MaxValue;
+
+            }
+
+        }
+
+        /// <summary>The safe get string.</summary>
+        /// <param name="row">The row.</param>
+        /// <param name="columnName">The column name.</param>
+        /// <returns>The safe get string.</returns>
+        protected string SafeGetString(DataRow row, string columnName)
+        {
+            string result = string.Empty;
+
+            if (row.Table.Columns.Contains(columnName) && !row.IsNull(columnName))
+            {
+                result = row[columnName].ToString();
+            }
+
+            return result;
+        }
+    }
+}
\ No newline at end of file
Added +67 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/ISqlWriter.cs b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/ISqlWriter.cs
new file mode 100644
index 0000000..fcb11da
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/ISqlWriter.cs
@@ -0,0 +1,67 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System.IO;
+
+namespace MiniSqlQuery.Core.DbModel
+{
+    /// <summary>An SQL Writer interface.</summary>
+    public interface ISqlWriter
+    {
+        /// <summary>Gets or sets a value indicating whether IncludeComments.</summary>
+        /// <value>The include comments.</value>
+        bool IncludeComments { get; set; }
+
+        /// <summary>
+        /// Gets or sets a value indicating whether to include read-only columns in the export SQL.
+        /// </summary>
+        /// <value>
+        /// 	<c>true</c> if including read-only columns in the export; otherwise, <c>false</c>.
+        /// </value>
+        bool IncludeReadOnlyColumnsInExport { get; set; }
+
+        /// <summary>Gets or sets a value indicating whether InsertLineBreaksBetweenColumns.</summary>
+        /// <value>The insert line breaks between columns.</value>
+        bool InsertLineBreaksBetweenColumns { get; set; }
+
+        /// <summary>The write create.</summary>
+        /// <param name="writer">The writer.</param>
+        /// <param name="column">The column.</param>
+        void WriteCreate(TextWriter writer, DbModelColumn column);
+
+        /// <summary>The write delete.</summary>
+        /// <param name="writer">The writer.</param>
+        /// <param name="tableOrView">The table or view.</param>
+        void WriteDelete(TextWriter writer, DbModelTable tableOrView);
+
+        /// <summary>The write insert.</summary>
+        /// <param name="writer">The writer.</param>
+        /// <param name="tableOrView">The table or view.</param>
+        void WriteInsert(TextWriter writer, DbModelTable tableOrView);
+
+        /// <summary>The write select.</summary>
+        /// <param name="writer">The writer.</param>
+        /// <param name="tableOrView">The table or view.</param>
+        void WriteSelect(TextWriter writer, DbModelTable tableOrView);
+
+        /// <summary>The write select count.</summary>
+        /// <param name="writer">The writer.</param>
+        /// <param name="tableOrView">The table or view.</param>
+        void WriteSelectCount(TextWriter writer, DbModelTable tableOrView);
+
+        /// <summary>The write summary.</summary>
+        /// <param name="writer">The writer.</param>
+        /// <param name="column">The column.</param>
+        void WriteSummary(TextWriter writer, DbModelColumn column);
+
+        /// <summary>The write update.</summary>
+        /// <param name="writer">The writer.</param>
+        /// <param name="tableOrView">The table or view.</param>
+        void WriteUpdate(TextWriter writer, DbModelTable tableOrView);
+    }
+}
\ No newline at end of file
Added +43 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/OleDbSchemaService.cs b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/OleDbSchemaService.cs
new file mode 100644
index 0000000..9054018
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/OleDbSchemaService.cs
@@ -0,0 +1,43 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Collections.Generic;
+using System.Data.Common;
+
+namespace MiniSqlQuery.Core.DbModel
+{
+    /// <summary>The ole db schema service.</summary>
+    public class OleDbSchemaService : GenericSchemaService
+    {
+        /// <summary>The get db types.</summary>
+        /// <param name="connection">The connection.</param>
+        /// <returns></returns>
+        public override Dictionary<string, DbModelType> GetDbTypes(DbConnection connection)
+        {
+            var types = base.GetDbTypes(connection);
+
+            foreach (var dbType in types.Values)
+            {
+                if (dbType.CreateFormat.Length == 0)
+                {
+                    // probably MS Access
+                    switch (dbType.Name)
+                    {
+                        case "VarChar":
+                            dbType.CreateFormat = "VarChar({0})";
+                            break;
+                        case "VarBinary":
+                            dbType.CreateFormat = "VarBinary({0})";
+                            break;
+                    }
+                }
+            }
+
+            return types;
+        }
+    }
+}
\ No newline at end of file
Added +101 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/OracleSchemaService.cs b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/OracleSchemaService.cs
new file mode 100644
index 0000000..74f9472
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/OracleSchemaService.cs
@@ -0,0 +1,101 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.Common;
+
+namespace MiniSqlQuery.Core.DbModel
+{
+    public class OracleSchemaService : GenericSchemaService
+    {
+
+        protected override int SafeGetInt(DataRow row, string columnName)
+        {
+            try
+            {
+                return base.SafeGetInt(row, columnName);
+            }
+            catch (OverflowException)
+            {
+                // Coerce to Max.Int32
+                return Int32.MaxValue;
+            }
+        }
+
+        public override DbModelInstance GetDbObjectModel(string connection)
+        {
+
+            //_connection = connection;
+
+            DbModelInstance model = new DbModelInstance();
+            DbProviderFactory factory = DbProviderFactories.GetFactory(ProviderName);
+
+            using (DbConnection dbConn = factory.CreateConnection())
+            {
+                dbConn.ConnectionString = connection;
+                dbConn.Open();
+
+                DataTable tables = dbConn.GetSchema("Tables");
+                Dictionary<string, DbModelType> dbTypes = GetDbTypes(dbConn);
+                model.Types = dbTypes;
+                model.ProviderName = ProviderName;
+                model.ConnectionString = connection;
+
+                if (tables == null)
+                {
+                    return model;
+                }
+
+                DataView tablesDV = new DataView(tables, "", "OWNER, TABLE_NAME", DataViewRowState.CurrentRows);
+
+                foreach (DataRowView row in tablesDV)
+                {
+                    string schemaName = SafeGetString(row.Row, "OWNER");
+                    string tableName = SafeGetString(row.Row, "TABLE_NAME");
+
+                    DbModelTable dbTable = new DbModelTable { Schema = schemaName, Name = tableName };
+                    model.Add(dbTable);
+
+                    DataTable schemaTableKeyInfo = GetTableKeyInfo(dbConn, schemaName, tableName);
+                    GetColumnsForTable(dbTable, schemaTableKeyInfo, dbTypes);
+                }
+
+                DataTable views = dbConn.GetSchema("Views");
+                DataView viewsDV = new DataView(views, "", "OWNER, VIEW_NAME", DataViewRowState.CurrentRows);
+                foreach (DataRowView row in viewsDV)
+                {
+                    string schemaName = SafeGetString(row.Row, "OWNER");
+                    string tableName = SafeGetString(row.Row, "VIEW_NAME");
+
+                    DbModelView dbTable = new DbModelView { Schema = schemaName, Name = tableName };
+                    model.Add(dbTable);
+
+                    DataTable schemaTableKeyInfo = GetTableKeyInfo(dbConn, schemaName, tableName);
+                    GetColumnsForTable(dbTable, schemaTableKeyInfo, dbTypes);
+                }
+
+                // build FK relationships 
+                if (model.Tables != null)
+                {
+                    foreach (DbModelTable table in model.Tables)
+                    {
+                        GetForeignKeyReferencesForTable(dbConn, table);
+                        ProcessForeignKeyReferencesForTable(dbConn, table);
+                    }
+                }
+
+                // build FK relationships
+                if (model.Views != null)
+                {
+                    foreach (DbModelView view in model.Views)
+                    {
+                        GetForeignKeyReferencesForTable(dbConn, view);
+                        ProcessForeignKeyReferencesForTable(dbConn, view);
+                    }
+                }
+            }
+
+            return model;
+        }
+
+    }
+}
Added +323 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/SqlCeSchemaService.cs b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/SqlCeSchemaService.cs
new file mode 100644
index 0000000..65fec8a
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/SqlCeSchemaService.cs
@@ -0,0 +1,323 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.Common;
+
+namespace MiniSqlQuery.Core.DbModel
+{
+    /// <summary>SQL Compact Edition schema service.
+    /// Made possible with contributions form ExportSQLCE project.
+    /// http://exportsqlce.codeplex.com/
+    /// http://erikej.blogspot.com/</summary>
+    public class SqlCeSchemaService : GenericSchemaService
+    {
+        /// <summary>The ma x_ binar y_ colum n_ size.</summary>
+        internal static readonly int MAX_BINARY_COLUMN_SIZE = 8000;
+
+        /// <summary>The ma x_ imag e_ colum n_ size.</summary>
+        internal static readonly int MAX_IMAGE_COLUMN_SIZE = 1073741823;
+
+        /// <summary>The ma x_ ncha r_ colum n_ size.</summary>
+        internal static readonly int MAX_NCHAR_COLUMN_SIZE = 4000;
+
+        /// <summary>The ma x_ ntex t_ colum n_ size.</summary>
+        internal static readonly int MAX_NTEXT_COLUMN_SIZE = 536870911;
+
+        /// <summary>The _connection.</summary>
+        private string _connection;
+
+        /// <summary>The get db object model.</summary>
+        /// <param name="connection">The connection.</param>
+        /// <returns></returns>
+        public override DbModelInstance GetDbObjectModel(string connection)
+        {
+            _connection = connection;
+
+            DbModelInstance model = new DbModelInstance();
+            DbProviderFactory factory = DbProviderFactories.GetFactory(ProviderName);
+
+            using (DbConnection dbConn = factory.CreateConnection())
+            {
+                dbConn.ConnectionString = connection;
+                dbConn.Open();
+
+                QueryTableNames(dbConn, model);
+                Dictionary<string, DbModelType> dbTypes = GetDbTypes(dbConn);
+                model.Types = dbTypes;
+                model.ProviderName = ProviderName;
+                model.ConnectionString = _connection;
+
+                // build all table info
+                foreach (DbModelTable table in model.Tables)
+                {
+                    DataTable schemaTableKeyInfo = GetTableKeyInfo(dbConn, null, table.Name);
+                    GetColumnsForTable(table, schemaTableKeyInfo, dbTypes);
+                }
+
+                // build FK relationships
+                foreach (DbModelTable table in model.Tables)
+                {
+                    GetForeignKeyReferencesForTable(dbConn, table);
+                    ProcessForeignKeyReferencesForTable(dbConn, table);
+                }
+
+                return model;
+            }
+        }
+
+        /// <summary>Gets the db types for the SQL CE provider.</summary>
+        /// <param name="connection">The connection (not required).</param>
+        /// <returns></returns>
+        public override Dictionary<string, DbModelType> GetDbTypes(DbConnection connection)
+        {
+            Dictionary<string, DbModelType> dbTypes = new Dictionary<string, DbModelType>();
+            string dataTypesSql = "SELECT * FROM information_schema.provider_types";
+            using (var cmd = connection.CreateCommand())
+            {
+                cmd.CommandText = dataTypesSql;
+                cmd.CommandType = CommandType.Text;
+                using (var reader = cmd.ExecuteReader())
+                {
+                    while (reader.Read())
+                    {
+                        string typeName = (string)reader["TYPE_NAME"];
+                        int columnSize = Convert.ToInt32(reader["COLUMN_SIZE"]);
+                        DbModelType dbType = new DbModelType(typeName, columnSize);
+
+                        dbType.CreateParameters = Convert.ToString(reader["CREATE_PARAMS"]);
+                        dbType.LiteralPrefix = Convert.ToString(reader["LITERAL_PREFIX"]);
+                        dbType.LiteralSuffix = Convert.ToString(reader["LITERAL_SUFFIX"]);
+                        dbType.ProviderDbType = Convert.ToString(reader["DATA_TYPE"]);
+
+                        FixCreateFormat(dbType);
+                        FixMaxLengths(dbType);
+                        AssignSystemTypes(dbType);
+
+                        dbTypes.Add(typeName, dbType);
+                    }
+                }
+            }
+
+            return dbTypes;
+        }
+
+        /// <summary>The get data type name for column.</summary>
+        /// <param name="dbTable">The db table.</param>
+        /// <param name="schemaTableKeyInfo">The schema table key info.</param>
+        /// <param name="columnRow">The column row.</param>
+        /// <returns>The get data type name for column.</returns>
+        protected override string GetDataTypeNameForColumn(DbModelTable dbTable, DataTable schemaTableKeyInfo, DataRow columnRow)
+        {
+            return SafeGetString(columnRow, "ProviderType");
+        }
+
+        /// <summary>The get foreign key references for table.</summary>
+        /// <param name="dbConn">The db conn.</param>
+        /// <param name="dbTable">The db table.</param>
+        protected override void GetForeignKeyReferencesForTable(DbConnection dbConn, DbModelTable dbTable)
+        {
+            ForeignKeyInformationAvailable = true;
+            try
+            {
+                using (var cmd = dbConn.CreateCommand())
+                {
+                    cmd.CommandText =
+                        string.Format(
+                            @"SELECT 
+	KCU1.TABLE_NAME AS FK_TABLE_NAME,  
+	KCU1.CONSTRAINT_NAME AS FK_CONSTRAINT_NAME, 
+	KCU1.COLUMN_NAME AS FK_COLUMN_NAME,
+	KCU2.TABLE_NAME AS UQ_TABLE_NAME, 
+	KCU2.CONSTRAINT_NAME AS UQ_CONSTRAINT_NAME, 
+	KCU2.COLUMN_NAME AS UQ_COLUMN_NAME, 
+	RC.UPDATE_RULE, 
+	RC.DELETE_RULE, 
+	KCU2.ORDINAL_POSITION AS UQ_ORDINAL_POSITION, 
+	KCU1.ORDINAL_POSITION AS FK_ORDINAL_POSITION
+FROM 
+	INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC 
+		JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU1 ON KCU1.CONSTRAINT_NAME = RC.CONSTRAINT_NAME 
+			JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU2 ON  KCU2.CONSTRAINT_NAME =  RC.UNIQUE_CONSTRAINT_NAME AND KCU2.ORDINAL_POSITION = KCU1.ORDINAL_POSITION AND KCU2.TABLE_NAME = RC.UNIQUE_CONSTRAINT_TABLE_NAME 
+WHERE KCU1.TABLE_NAME = '{0}'
+ORDER BY 
+	FK_TABLE_NAME, 
+	FK_CONSTRAINT_NAME, 
+	FK_ORDINAL_POSITION
+",
+                            dbTable.Name);
+                    cmd.CommandType = CommandType.Text;
+                    using (var dr = cmd.ExecuteReader())
+                    {
+                        while (dr.Read())
+                        {
+                            dbTable.Constraints.Add(new DbModelConstraint
+                            {
+                                ConstraintTableName = dr.GetString(0),
+                                ConstraintName = dr.GetString(1),
+                                ColumnName = dr.GetString(2),
+                                UniqueConstraintTableName = dr.GetString(3),
+                                UniqueConstraintName = dr.GetString(4),
+                                UniqueColumnName = dr.GetString(5),
+                                UpdateRule = dr.GetString(6),
+                                DeleteRule = dr.GetString(7)
+                            });
+                        }
+                    }
+                }
+            }
+            catch (DbException)
+            {
+                ForeignKeyInformationAvailable = false;
+            }
+        }
+
+        /// <summary>The process foreign key references for table.</summary>
+        /// <param name="dbConn">The db conn.</param>
+        /// <param name="dbTable">The db table.</param>
+        protected override void ProcessForeignKeyReferencesForTable(DbConnection dbConn, DbModelTable dbTable)
+        {
+            // todo - check GetGroupForeingKeys
+            foreach (DbModelConstraint constraint in dbTable.Constraints)
+            {
+                var column = dbTable.Columns.Find(c => c.Name == constraint.ColumnName);
+                var refTable = dbTable.ParentDb.FindTable(
+                    Utility.RenderSafeSchemaObjectName(constraint.UniqueConstraintTableSchema, constraint.UniqueConstraintTableName));
+                var refColumn = refTable.Columns.Find(c => c.Name == constraint.UniqueColumnName);
+                DbModelForeignKeyReference fk = new DbModelForeignKeyReference(column, refTable, refColumn);
+                fk.UpdateRule = constraint.UpdateRule;
+                fk.DeleteRule = constraint.DeleteRule;
+                column.ForeignKeyReference = fk;
+            }
+        }
+
+        /// <summary>The assign system types.</summary>
+        /// <param name="dbType">The db type.</param>
+        private void AssignSystemTypes(DbModelType dbType)
+        {
+            switch (dbType.Name.ToLower())
+            {
+                case "smallint":
+                    dbType.SystemType = typeof(byte);
+                    break;
+
+                case "int":
+                    dbType.SystemType = typeof(int);
+                    break;
+
+                case "tinyint":
+                    dbType.SystemType = typeof(byte);
+                    break;
+
+                case "bigint":
+                    dbType.SystemType = typeof(long);
+                    break;
+
+                case "float":
+                    dbType.SystemType = typeof(double); // yes, float is double ;-)
+                    break;
+
+                case "numeric":
+                case "money":
+                case "real":
+                    dbType.SystemType = typeof(decimal);
+                    break;
+
+                case "bit":
+                    dbType.SystemType = typeof(bool);
+                    break;
+
+                case "uniqueidentifier":
+                    dbType.SystemType = typeof(Guid);
+                    break;
+
+                case "nvarchar":
+                case "nchar":
+                case "ntext":
+                    dbType.SystemType = typeof(string);
+                    break;
+
+                case "datetime":
+                    dbType.SystemType = typeof(DateTime);
+                    break;
+
+                case "varbinary":
+                case "binary":
+                case "image":
+                case "rowversion":
+                    dbType.SystemType = typeof(byte[]);
+                    break;
+            }
+        }
+
+        /// <summary>The fix create format.</summary>
+        /// <param name="dbType">The db type.</param>
+        private void FixCreateFormat(DbModelType dbType)
+        {
+            switch (dbType.Name.ToLower())
+            {
+                case "nchar":
+                case "nvarchar":
+                case "binary":
+                case "varbinary":
+                    dbType.CreateFormat = dbType.Name.ToLower() + "({0})";
+                    break;
+
+                case "decimal":
+                case "numeric":
+                    dbType.CreateFormat = dbType.Name.ToLower() + "({0}, {1})";
+                    break;
+            }
+        }
+
+        /// <summary>The fix max lengths.</summary>
+        /// <param name="dbType">The db type.</param>
+        private void FixMaxLengths(DbModelType dbType)
+        {
+            switch (dbType.Name.ToLower())
+            {
+                case "nchar":
+                case "nvarchar":
+                    dbType.Length = MAX_NCHAR_COLUMN_SIZE;
+                    break;
+                case "ntext":
+                    dbType.Length = MAX_NTEXT_COLUMN_SIZE;
+                    break;
+                case "binary":
+                case "varbinary":
+                    dbType.Length = MAX_BINARY_COLUMN_SIZE;
+                    break;
+                case "image":
+                    dbType.Length = MAX_IMAGE_COLUMN_SIZE;
+                    break;
+            }
+        }
+
+        /// <summary>The query table names.</summary>
+        /// <param name="dbConn">The db conn.</param>
+        /// <param name="model">The model.</param>
+        private void QueryTableNames(DbConnection dbConn, DbModelInstance model)
+        {
+            using (var cmd = dbConn.CreateCommand())
+            {
+                cmd.CommandText = "SELECT table_name FROM information_schema.tables WHERE TABLE_TYPE = N'TABLE'";
+                cmd.CommandType = CommandType.Text;
+                using (var reader = cmd.ExecuteReader())
+                {
+                    while (reader.Read())
+                    {
+                        DbModelTable table = new DbModelTable();
+                        table.Name = (string)reader["table_name"];
+                        model.Add(table);
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
Added +105 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/SqlClientSchemaService.cs b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/SqlClientSchemaService.cs
new file mode 100644
index 0000000..13a98ac
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/SqlClientSchemaService.cs
@@ -0,0 +1,105 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Collections.Generic;
+using System.Data;
+using System.Data.Common;
+using System.Data.SqlClient;
+
+namespace MiniSqlQuery.Core.DbModel
+{
+    /// <summary>The sql client schema service.</summary>
+    public class SqlClientSchemaService : GenericSchemaService
+    {
+        /// <summary>The get db types.</summary>
+        /// <param name="connection">The connection.</param>
+        /// <returns></returns>
+        public override Dictionary<string, DbModelType> GetDbTypes(DbConnection connection)
+        {
+            var types = base.GetDbTypes(connection);
+
+            var date = types["datetime"];
+            date.LiteralPrefix = "'";
+            date.LiteralSuffix = "'";
+
+            return types;
+        }
+
+        /// <summary>The get foreign key references for table.</summary>
+        /// <param name="dbConn">The db conn.</param>
+        /// <param name="dbTable">The db table.</param>
+        protected override void GetForeignKeyReferencesForTable(DbConnection dbConn, DbModelTable dbTable)
+        {
+            ForeignKeyInformationAvailable = true;
+            try
+            {
+                using (var cmd = dbConn.CreateCommand())
+                {
+                    cmd.CommandText = string.Format(
+                        @"SELECT 
+	OBJECT_SCHEMA_NAME(f.parent_object_id) AS TableSchemaName,
+	OBJECT_NAME(f.parent_object_id) AS TableName,
+	COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
+	f.name AS ForeignKeyName,
+	OBJECT_SCHEMA_NAME(f.referenced_object_id) AS ReferenceTableSchemaName,
+	OBJECT_NAME(f.referenced_object_id) AS ReferenceTableName,
+	COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName,
+	f.update_referential_action_desc,
+	f.delete_referential_action_desc
+FROM 
+	sys.foreign_keys AS f INNER JOIN sys.foreign_key_columns AS fc
+		ON f.OBJECT_ID = fc.constraint_object_id
+WHERE OBJECT_SCHEMA_NAME(f.parent_object_id) = '{0}' AND OBJECT_NAME(f.parent_object_id) = '{1}'
+",
+                        dbTable.Schema, dbTable.Name);
+                    cmd.CommandType = CommandType.Text;
+                    using (var dr = cmd.ExecuteReader())
+                    {
+                        while (dr.Read())
+                        {
+                            dbTable.Constraints.Add(new DbModelConstraint
+                            {
+                                ConstraintTableSchema = (string)dr["TableSchemaName"],
+                                ConstraintTableName = (string)dr["TableName"],
+                                ColumnName = (string)dr["ColumnName"],
+                                ConstraintName = (string)dr["ForeignKeyName"],
+                                UniqueConstraintTableSchema = (string)dr["ReferenceTableSchemaName"],
+                                UniqueConstraintTableName = (string)dr["ReferenceTableName"],
+                                UniqueColumnName = (string)dr["ReferenceColumnName"],
+                                UpdateRule = (string)dr["update_referential_action_desc"],
+                                DeleteRule = (string)dr["delete_referential_action_desc"],
+                            });
+                        }
+                    }
+                }
+            }
+            catch (SqlException)
+            {
+                ForeignKeyInformationAvailable = false;
+            }
+        }
+
+        /// <summary>The process foreign key references for table.</summary>
+        /// <param name="dbConn">The db conn.</param>
+        /// <param name="dbTable">The db table.</param>
+        protected override void ProcessForeignKeyReferencesForTable(DbConnection dbConn, DbModelTable dbTable)
+        {
+            // todo - check GetGroupForeingKeys
+            foreach (DbModelConstraint constraint in dbTable.Constraints)
+            {
+                var column = dbTable.Columns.Find(c => c.Name == constraint.ColumnName);
+                var refTable = dbTable.ParentDb.FindTable(
+                    Utility.RenderSafeSchemaObjectName(constraint.UniqueConstraintTableSchema, constraint.UniqueConstraintTableName));
+                var refColumn = refTable.Columns.Find(c => c.Name == constraint.UniqueColumnName);
+                DbModelForeignKeyReference fk = new DbModelForeignKeyReference(column, refTable, refColumn);
+                fk.UpdateRule = constraint.UpdateRule;
+                fk.DeleteRule = constraint.DeleteRule;
+                column.ForeignKeyReference = fk;
+            }
+        }
+    }
+}
\ No newline at end of file
Added +261 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/SqlWriter.cs b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/SqlWriter.cs
new file mode 100644
index 0000000..9b2be5f
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DbModel/SqlWriter.cs
@@ -0,0 +1,261 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Collections.Generic;
+using System.IO;
+
+namespace MiniSqlQuery.Core.DbModel
+{
+    /// <summary>The sql writer.</summary>
+    public class SqlWriter : ISqlWriter
+    {
+        /// <summary>Initializes a new instance of the <see cref="SqlWriter"/> class.</summary>
+        public SqlWriter()
+        {
+            // todo - format options?
+            IncludeComments = true;
+            InsertLineBreaksBetweenColumns = true;
+        }
+
+        /// <summary>Gets or sets a value indicating whether IncludeComments.</summary>
+        /// <value>The include comments.</value>
+        public bool IncludeComments { get; set; }
+
+        /// <summary>Gets or sets a value indicating whether InsertLineBreaksBetweenColumns.</summary>
+        /// <value>The insert line breaks between columns.</value>
+        public bool InsertLineBreaksBetweenColumns { get; set; }
+
+        /// <summary>
+        /// Gets or sets a value indicating whether to include read-only columns in the export SQL.
+        /// </summary>
+        /// <value>
+        /// 	<c>true</c> if including read-only columns in the export; otherwise, <c>false</c>.
+        /// </value>
+		public bool IncludeReadOnlyColumnsInExport { get; set; }
+
+        /// <summary>The write create.</summary>
+        /// <param name="writer">The writer.</param>
+        /// <param name="column">The column.</param>
+        public virtual void WriteCreate(TextWriter writer, DbModelColumn column)
+        {
+            writer.Write("{0} {1} ", MakeSqlFriendly(column.Name), column.DbType.Summary);
+
+            if (!column.Nullable)
+            {
+                writer.Write("not ");
+            }
+
+            writer.Write("null");
+        }
+
+        /// <summary>The write delete.</summary>
+        /// <param name="writer">The writer.</param>
+        /// <param name="tableOrView">The table or view.</param>
+        public virtual void WriteDelete(TextWriter writer, DbModelTable tableOrView)
+        {
+            writer.WriteLine("DELETE FROM");
+            writer.Write("\t");
+            writer.WriteLine(MakeSqlFriendly(tableOrView.FullName));
+            writer.WriteLine("WHERE");
+
+            for (int i = 0; i < tableOrView.PrimaryKeyColumns.Count; i++)
+            {
+                var column = tableOrView.PrimaryKeyColumns[i];
+                writer.Write("\t{0} = ", MakeSqlFriendly(column.Name));
+                if (i < tableOrView.PrimaryKeyColumns.Count - 1)
+                {
+                    writer.Write(" /*value:{0}*/ AND", column.Name);
+                    writer.WriteLine();
+                }
+                else
+                {
+                    writer.Write("/*value:{0}*/", column.Name);
+                }
+            }
+
+            writer.WriteLine();
+        }
+
+        /// <summary>The write insert.</summary>
+        /// <param name="writer">The writer.</param>
+        /// <param name="tableOrView">The table or view.</param>
+        public virtual void WriteInsert(TextWriter writer, DbModelTable tableOrView)
+        {
+            writer.Write("INSERT INTO ");
+            writer.Write(MakeSqlFriendly(tableOrView.FullName));
+            if (InsertLineBreaksBetweenColumns)
+            {
+                writer.WriteLine();
+                writer.Write("\t");
+            }
+
+            writer.Write("(");
+
+            // get all columns that are "writable" including PKs that are not auto generated (unless specified)
+            List<DbModelColumn> writableColumns = null;
+            if (IncludeReadOnlyColumnsInExport)
+            {
+                writableColumns = tableOrView.Columns;
+            }
+            else
+            {
+                writableColumns = tableOrView.Columns.FindAll(c => c.IsWritable);
+            }
+
+            for (int i = 0; i < writableColumns.Count; i++)
+            {
+                var column = writableColumns[i];
+                writer.Write(MakeSqlFriendly(column.Name));
+                if (i < writableColumns.Count - 1)
+                {
+                    if (InsertLineBreaksBetweenColumns)
+                    {
+                        writer.WriteLine(",");
+                        writer.Write("\t");
+                    }
+                    else
+                    {
+                        writer.Write(", ");
+                    }
+                }
+            }
+
+            writer.WriteLine(")");
+            writer.Write("VALUES");
+            if (InsertLineBreaksBetweenColumns)
+            {
+                writer.WriteLine();
+                writer.Write("\t");
+            }
+
+            writer.Write("(");
+
+            for (int i = 0; i < writableColumns.Count; i++)
+            {
+                var column = writableColumns[i];
+                writer.Write(column.DbType.ToDDLValue(column.Nullable));
+                if (IncludeComments)
+                {
+                    writer.Write(" /*{0},{1}*/", column.Name, column.DbType.Summary);
+                }
+
+                if (i < writableColumns.Count - 1)
+                {
+                    if (InsertLineBreaksBetweenColumns)
+                    {
+                        writer.WriteLine(",");
+                        writer.Write("\t");
+                    }
+                    else
+                    {
+                        writer.Write(", ");
+                    }
+                }
+            }
+
+            writer.WriteLine(")");
+        }
+
+        /// <summary>The write select.</summary>
+        /// <param name="writer">The writer.</param>
+        /// <param name="tableOrView">The table or view.</param>
+        public virtual void WriteSelect(TextWriter writer, DbModelTable tableOrView)
+        {
+            writer.Write("SELECT");
+            writer.WriteLine();
+            for (int i = 0; i < tableOrView.Columns.Count; i++)
+            {
+                writer.Write("\t");
+                writer.Write(MakeSqlFriendly(tableOrView.Columns[i].Name));
+                if (i < tableOrView.Columns.Count - 1)
+                {
+                    writer.Write(",");
+                    writer.WriteLine();
+                }
+            }
+
+            writer.WriteLine();
+            writer.Write("FROM {0}", MakeSqlFriendly(tableOrView.FullName));
+            writer.WriteLine();
+        }
+
+        /// <summary>The write select count.</summary>
+        /// <param name="writer">The writer.</param>
+        /// <param name="tableOrView">The table or view.</param>
+        public virtual void WriteSelectCount(TextWriter writer, DbModelTable tableOrView)
+        {
+            writer.Write("SELECT COUNT(*) FROM {0}", MakeSqlFriendly(tableOrView.FullName));
+            writer.WriteLine();
+        }
+
+        /// <summary>The write summary.</summary>
+        /// <param name="writer">The writer.</param>
+        /// <param name="column">The column.</param>
+        public void WriteSummary(TextWriter writer, DbModelColumn column)
+        {
+            writer.Write("{0} ({1} ", MakeSqlFriendly(column.Name), column.DbType.Summary);
+
+            if (!column.Nullable)
+            {
+                writer.Write("not ");
+            }
+
+            writer.Write("null)");
+        }
+
+        /// <summary>The write update.</summary>
+        /// <param name="writer">The writer.</param>
+        /// <param name="tableOrView">The table or view.</param>
+        public virtual void WriteUpdate(TextWriter writer, DbModelTable tableOrView)
+        {
+            writer.Write("UPDATE ");
+            writer.WriteLine(MakeSqlFriendly(tableOrView.FullName));
+            writer.WriteLine("SET");
+
+            // get all columns that are "writable" excluding keys that are not auto generated
+            var writableColumns = tableOrView.Columns.FindAll(c => c.IsWritable && !c.IsKey);
+            for (int i = 0; i < writableColumns.Count; i++)
+            {
+                var column = writableColumns[i];
+                writer.Write("\t{0} = {1}", MakeSqlFriendly(column.Name), column.DbType.ToDDLValue(column.Nullable));
+                if (i < writableColumns.Count - 1)
+                {
+                    writer.Write(",");
+                    writer.WriteLine();
+                }
+            }
+
+            writer.WriteLine();
+            writer.WriteLine("WHERE");
+
+            for (int i = 0; i < tableOrView.PrimaryKeyColumns.Count; i++)
+            {
+                var column = tableOrView.PrimaryKeyColumns[i];
+                writer.Write("\t{0} = ", MakeSqlFriendly(column.Name));
+                if (i < tableOrView.PrimaryKeyColumns.Count - 1)
+                {
+                    writer.Write(" /*value:{0},{1}*/ AND", column.Name, column.DbType.Summary);
+                    writer.WriteLine();
+                }
+                else
+                {
+                    writer.Write("/*value:{0},{1}*/", column.Name, column.DbType.Summary);
+                }
+            }
+
+            writer.WriteLine();
+        }
+
+        /// <summary>The make the sql friendly, e.g. "[TableName]".</summary>
+        /// <param name="name">The name of the object.</param>
+        /// <returns>The make sql friendly name.</returns>
+        protected string MakeSqlFriendly(string name)
+        {
+            return Utility.MakeSqlFriendly(name);
+        }
+    }
+}
\ No newline at end of file
Added +22 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/DefaultConnectionDefinitionFile.xml b/minisqlquery-master/src/MiniSqlQuery.Core/DefaultConnectionDefinitionFile.xml
new file mode 100644
index 0000000..a9019f0
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/DefaultConnectionDefinitionFile.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<DbConnectionDefinitionList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+	<Definitions>
+		<DbConnectionDefinition>
+			<Name>Default - MSSQL Master@localhost</Name>
+			<ProviderName>System.Data.SqlClient</ProviderName>
+			<ConnectionString>Server=.; Database=master; Integrated Security=SSPI</ConnectionString>
+		</DbConnectionDefinition>
+		<DbConnectionDefinition>
+			<Name>Sample MSSQL Northwind SQL Express</Name>
+			<ProviderName>System.Data.SqlClient</ProviderName>
+			<ConnectionString>Server=.\sqlexpress; Database=Northwind; Integrated Security=SSPI</ConnectionString>
+		</DbConnectionDefinition>
+		<DbConnectionDefinition>
+			<Name>Sample Access DB Connection</Name>
+			<ProviderName>System.Data.OleDb</ProviderName>
+			<ConnectionString>Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\SomeDirectory\access.mdb</ConnectionString>
+		</DbConnectionDefinition>
+	</Definitions>
+	<DefaultName>Default - MSSQL Master@localhost</DefaultName>
+</DbConnectionDefinitionList>
\ No newline at end of file
Added +57 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/FileEditorDescriptor.cs b/minisqlquery-master/src/MiniSqlQuery.Core/FileEditorDescriptor.cs
new file mode 100644
index 0000000..97c66be
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/FileEditorDescriptor.cs
@@ -0,0 +1,57 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// <para>The file editor descriptor.</para>
+    /// <para>Creates a relationship between file extensions and a type of editor that supports for example XML syntax highlighting.</para>
+    /// </summary>
+    public class FileEditorDescriptor
+    {
+        /// <summary>Initializes a new instance of the <see cref="FileEditorDescriptor"/> class.</summary>
+        public FileEditorDescriptor()
+        {
+        }
+
+        /// <summary>Initializes a new instance of the <see cref="FileEditorDescriptor"/> class.</summary>
+        /// <param name="name">The name for display purposes, e.g. "HTML Editor".</param>
+        /// <param name="editorKeyName">The editor key name, can be used by the application to resolve an editor by name.</param>
+        /// <param name="extensions">The file extensions to support for this editor (e.g. "txt").</param>
+        /// <remarks>
+        /// <example>
+        /// <code>var fd = new FileEditorDescriptor("HTML Editor", "htm-editor", "htm", "html");</code>
+        /// </example>
+        /// </remarks>
+        public FileEditorDescriptor(string name, string editorKeyName, params string[] extensions)
+        {
+            Name = name;
+            EditorKeyName = editorKeyName;
+            Extensions = extensions;
+        }
+
+        /// <summary>Gets or sets EditorKeyName.</summary>
+        /// <value>The editor key name.</value>
+        public string EditorKeyName { get; set; }
+
+        /// <summary>Gets or sets Extensions.</summary>
+        /// <value>The extensions.</value>
+        public string[] Extensions { get; set; }
+
+        /// <summary>Gets or sets Name.</summary>
+        /// <value>The display name of the descriptor.</value>
+        public string Name { get; set; }
+
+        /// <summary>Converts the descriptor to a string.</summary>
+        /// <returns>A string represntation of the descriptor.</returns>
+        public override string ToString()
+        {
+            return string.Format("{0} ({1})", Name, string.Join("; ", Extensions));
+        }
+    }
+}
\ No newline at end of file
Added +126 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/FileEditorResolverService.cs b/minisqlquery-master/src/MiniSqlQuery.Core/FileEditorResolverService.cs
new file mode 100644
index 0000000..c176954
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/FileEditorResolverService.cs
@@ -0,0 +1,126 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System.Collections.Generic;
+using System.IO;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	Given a file name or extention the service will work out the most appropriate editor to use.
+    /// </summary>
+    /// <remarks>
+    /// 	The editors need to be registered using the <see cref = "Register" /> method.
+    /// 	<example>
+    /// 		<code>
+    /// 			IEditor editor = resolver.ResolveEditorInstance("c:\data.sql");
+    /// 			// will resolve to the SQL editor
+    /// 
+    /// 			IEditor editor = resolver.ResolveEditorInstance("c:\foo.txt");
+    /// 			// will resolve to the basic text editor</code>
+    /// 	</example>
+    /// </remarks>
+    public class FileEditorResolverService : IFileEditorResolver
+    {
+        /// <summary>
+        /// 	The extention map of files types to descriptors.
+        /// </summary>
+        private readonly Dictionary<string, FileEditorDescriptor> _extentionMap;
+
+        /// <summary>
+        /// 	The file editor descriptors.
+        /// </summary>
+        private readonly List<FileEditorDescriptor> _fileEditorDescriptors;
+
+        /// <summary>
+        /// 	The application services.
+        /// </summary>
+        private readonly IApplicationServices _services;
+
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "FileEditorResolverService" /> class.
+        /// </summary>
+        /// <param name = "services">The application services.</param>
+        public FileEditorResolverService(IApplicationServices services)
+        {
+            _services = services;
+            _extentionMap = new Dictionary<string, FileEditorDescriptor>();
+            _fileEditorDescriptors = new List<FileEditorDescriptor>();
+        }
+
+        /// <summary>
+        /// 	Gets an array of the file descriptiors.
+        /// </summary>
+        /// <returns>An array of <see cref = "FileEditorDescriptor" /> objects.</returns>
+        public FileEditorDescriptor[] GetFileTypes()
+        {
+            return _fileEditorDescriptors.ToArray();
+        }
+
+        /// <summary>
+        /// 	Registers the specified file editor descriptor.
+        /// 	It is recommended to use the <see cref = "IApplicationServices.RegisterEditor{TEditor}" /> method to
+        /// 	set up the container correctly.
+        /// </summary>
+        /// <param name = "fileEditorDescriptor">The file editor descriptor.</param>
+        public void Register(FileEditorDescriptor fileEditorDescriptor)
+        {
+            _fileEditorDescriptors.Add(fileEditorDescriptor);
+            if (fileEditorDescriptor.Extensions == null || fileEditorDescriptor.Extensions.Length == 0)
+            {
+                _extentionMap.Add("*", fileEditorDescriptor);
+            }
+            else
+            {
+                // create a map of all ext to editors
+                foreach (string extention in fileEditorDescriptor.Extensions)
+                {
+                    _extentionMap.Add(extention, fileEditorDescriptor);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 	Resolves the editor instance from the container based on the filename.
+        /// </summary>
+        /// <param name = "filename">The filename.</param>
+        /// <returns>An editor.</returns>
+        public IEditor ResolveEditorInstance(string filename)
+        {
+            string ext = Path.GetExtension(filename);
+            string editorName = ResolveEditorNameByExtension(ext);
+            return _services.Resolve<IEditor>(editorName);
+        }
+
+        /// <summary>
+        /// 	Works out the "name" of the editor to use based on the <paramref name = "extension" />.
+        /// </summary>
+        /// <param name = "extension">The extention ("sql", "txt"/".txt" etc).</param>
+        /// <returns>The name of an editor in the container.</returns>
+        public string ResolveEditorNameByExtension(string extension)
+        {
+            string editorName = _extentionMap["*"].EditorKeyName;
+
+            if (extension != null)
+            {
+                if (extension.StartsWith("."))
+                {
+                    extension = extension.Substring(1);
+                }
+
+                // is there a specific editor for this file type
+                if (_extentionMap.ContainsKey(extension))
+                {
+                    editorName = _extentionMap[extension].EditorKeyName;
+                }
+            }
+
+            return editorName;
+        }
+    }
+}
\ No newline at end of file
Added +101 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/FindReplaceTextRequest.cs b/minisqlquery-master/src/MiniSqlQuery.Core/FindReplaceTextRequest.cs
new file mode 100644
index 0000000..8aed6fe
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/FindReplaceTextRequest.cs
@@ -0,0 +1,101 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	A class that encapsulates a "find text" request, storing the position
+    /// </summary>
+    public class FindTextRequest
+    {
+        /// <summary>
+        /// 	The _replace value.
+        /// </summary>
+        private static string _replaceValue;
+
+        /// <summary>
+        /// 	The _search value.
+        /// </summary>
+        private static string _searchValue;
+
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "FindTextRequest" /> class. Creates a new request using the specified <paramref name = "textProvider" /> for searching.
+        /// </summary>
+        /// <param name = "textProvider">The search provider for this request,</param>
+        public FindTextRequest(IFindReplaceProvider textProvider)
+            : this(textProvider, null)
+        {
+        }
+
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "FindTextRequest" /> class. Creates a new request using the specified <paramref name = "textProvider" /> for searching.
+        /// </summary>
+        /// <param name = "textProvider">The search provider for this request,</param>
+        /// <param name = "searchValue">The text to be searched on.</param>
+        public FindTextRequest(IFindReplaceProvider textProvider, string searchValue)
+        {
+            TextProvider = textProvider;
+            if (searchValue != null)
+            {
+                SearchValue = searchValue;
+            }
+
+            Position = 0;
+            StringComparison = StringComparison.CurrentCultureIgnoreCase;
+        }
+
+        /// <summary>
+        /// 	Gets or sets the position of the currently "found" text (or the starting position of the search).
+        /// </summary>
+        /// <value>The position.</value>
+        public int Position { get; set; }
+
+        /// <summary>
+        /// 	Gets or sets the text replace value (shared value).
+        /// </summary>
+        /// <value>The replace value.</value>
+        public string ReplaceValue
+        {
+            get { return _replaceValue; }
+            set { _replaceValue = value; }
+        }
+
+        /// <summary>
+        /// 	Gets or sets the search text (shared value).
+        /// </summary>
+        /// <value>The search value.</value>
+        public string SearchValue
+        {
+            get { return _searchValue; }
+            set { _searchValue = value; }
+        }
+
+        /*
+		/// <summary>
+		/// If true, signals the <see cref="TextProvider"/> to search "up", otherwise "down".
+		/// </summary>
+		/// <value>True to search up, false for down (the default).</value>
+		public bool SearchUp { get; set; }
+		*/
+
+        /// <summary>
+        /// 	Gets or sets the string comparison settings, e.g. case insensitive.
+        /// </summary>
+        /// <value>The string comparison.</value>
+        public StringComparison StringComparison { get; set; }
+
+        /// <summary>
+        /// 	Gets or sets the search provider. A search request is conducted by the provider, different providers
+        /// 	can yield different results, for example plain text or a regular expression searcher.
+        /// </summary>
+        /// <value>The text provider.</value>
+        public IFindReplaceProvider TextProvider { get; set; }
+    }
+}
\ No newline at end of file
Added +50 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Forms/BatchQuerySelectForm.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Forms/BatchQuerySelectForm.cs
new file mode 100644
index 0000000..3d3cffa
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Forms/BatchQuerySelectForm.cs
@@ -0,0 +1,50 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System;
+using System.Windows.Forms;
+
+namespace MiniSqlQuery.Core.Forms
+{
+    /// <summary>Used as a modal dialog, a <see cref="QueryBatch"/> is supplied and the used can 
+    /// select one of the result sets. <see cref="DialogResult"/> is set to <see cref="DialogResult.OK"/> on an OK exit.</summary>
+    public partial class BatchQuerySelectForm : Form
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="BatchQuerySelectForm"/> class.
+        /// </summary>
+        public BatchQuerySelectForm()
+        {
+            InitializeComponent();
+        }
+
+        /// <summary>
+        /// Gets a refernce to the selected query.
+        /// </summary>
+        /// <value>The selected query.</value>
+        public Query SelectedQuery
+        {
+            get { return batchQuerySelectControl1.SelectedQuery; }
+        }
+
+        /// <summary>Fills the list with the named batch results.</summary>
+        /// <param name="batch">The batch.</param>
+        public void Fill(QueryBatch batch)
+        {
+            batchQuerySelectControl1.Fill(batch);
+        }
+
+        /// <summary>The btn ok_ click.</summary>
+        /// <param name="sender">The sender.</param>
+        /// <param name="e">The e.</param>
+        private void btnOk_Click(object sender, EventArgs e)
+        {
+            DialogResult = DialogResult.OK;
+            Close();
+        }
+    }
+}
\ No newline at end of file
Added +107 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Forms/BatchQuerySelectForm.Designer.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Forms/BatchQuerySelectForm.Designer.cs
new file mode 100644
index 0000000..4fac25e
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Forms/BatchQuerySelectForm.Designer.cs
@@ -0,0 +1,107 @@
+namespace MiniSqlQuery.Core.Forms
+{
+	partial class BatchQuerySelectForm
+	{
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if (disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
+
+		#region Windows Form Designer generated code
+
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.batchQuerySelectControl1 = new MiniSqlQuery.Core.Controls.BatchQuerySelectControl();
+			this.label1 = new System.Windows.Forms.Label();
+			this.btnOk = new System.Windows.Forms.Button();
+			this.btnCancel = new System.Windows.Forms.Button();
+			this.SuspendLayout();
+			// 
+			// batchQuerySelectControl1
+			// 
+			this.batchQuerySelectControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+						| System.Windows.Forms.AnchorStyles.Left)
+						| System.Windows.Forms.AnchorStyles.Right)));
+			this.batchQuerySelectControl1.Location = new System.Drawing.Point(12, 25);
+			this.batchQuerySelectControl1.Name = "batchQuerySelectControl1";
+			this.batchQuerySelectControl1.Size = new System.Drawing.Size(322, 180);
+			this.batchQuerySelectControl1.TabIndex = 0;
+			// 
+			// label1
+			// 
+			this.label1.AutoSize = true;
+			this.label1.Location = new System.Drawing.Point(9, 9);
+			this.label1.Name = "label1";
+			this.label1.Size = new System.Drawing.Size(138, 13);
+			this.label1.TabIndex = 1;
+			this.label1.Text = "Select a result set to export:";
+			// 
+			// btnOk
+			// 
+			this.btnOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+			this.btnOk.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this.btnOk.Location = new System.Drawing.Point(178, 211);
+			this.btnOk.Name = "btnOk";
+			this.btnOk.Size = new System.Drawing.Size(75, 23);
+			this.btnOk.TabIndex = 2;
+			this.btnOk.Text = "&OK";
+			this.btnOk.UseVisualStyleBackColor = true;
+			this.btnOk.Click += new System.EventHandler(this.btnOk_Click);
+			// 
+			// btnCancel
+			// 
+			this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+			this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this.btnCancel.Location = new System.Drawing.Point(259, 211);
+			this.btnCancel.Name = "btnCancel";
+			this.btnCancel.Size = new System.Drawing.Size(75, 23);
+			this.btnCancel.TabIndex = 3;
+			this.btnCancel.Text = "&Cancel";
+			this.btnCancel.UseVisualStyleBackColor = true;
+			// 
+			// BatchQuerySelectForm
+			// 
+			this.AcceptButton = this.btnOk;
+			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.CancelButton = this.btnCancel;
+			this.ClientSize = new System.Drawing.Size(346, 246);
+			this.Controls.Add(this.btnCancel);
+			this.Controls.Add(this.btnOk);
+			this.Controls.Add(this.label1);
+			this.Controls.Add(this.batchQuerySelectControl1);
+			this.MaximizeBox = false;
+			this.MinimizeBox = false;
+			this.Name = "BatchQuerySelectForm";
+			this.ShowIcon = false;
+			this.Text = "Batch Query Selection";
+			this.ResumeLayout(false);
+			this.PerformLayout();
+
+		}
+
+		#endregion
+
+		private MiniSqlQuery.Core.Controls.BatchQuerySelectControl batchQuerySelectControl1;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.Button btnOk;
+		private System.Windows.Forms.Button btnCancel;
+	}
+}
\ No newline at end of file
Added +120 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Forms/BatchQuerySelectForm.resx b/minisqlquery-master/src/MiniSqlQuery.Core/Forms/BatchQuerySelectForm.resx
new file mode 100644
index 0000000..19dc0dd
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Forms/BatchQuerySelectForm.resx
@@ -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>
\ No newline at end of file
Added +134 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/IApplicationServices.cs b/minisqlquery-master/src/MiniSqlQuery.Core/IApplicationServices.cs
new file mode 100644
index 0000000..7fae43c
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/IApplicationServices.cs
@@ -0,0 +1,134 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using Ninject;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	The core services of the application.
+    /// </summary>
+    public interface IApplicationServices
+    {
+        /// <summary>
+        /// 	Occurs when a system message is posted.
+        /// </summary>
+        event EventHandler<SystemMessageEventArgs> SystemMessagePosted;
+
+        /// <summary>
+        /// 	Gets the Dependency Injection container.
+        /// 	This container holds all major application components and plugins.
+        /// 	See the "Configuration.xml" file in the main application for settings.
+        /// </summary>
+        /// <value>The container.</value>
+        IKernel Container { get; }
+
+        /// <summary>
+        /// 	Gets the application host window.
+        /// </summary>
+        /// <value>The application host window - a <see cref = "System.Windows.Forms.Form" />.</value>
+        IHostWindow HostWindow { get; }
+
+        /// <summary>
+        /// 	Gets a dictionary of the current plugins for this application.
+        /// </summary>
+        /// <value>A reference to the plugin dictionary.</value>
+        Dictionary<Type, IPlugIn> Plugins { get; }
+
+        /// <summary>
+        /// 	Gets the application settings instance.
+        /// </summary>
+        /// <value>A reference to the settings handler.</value>
+        IApplicationSettings Settings { get; }
+
+        /// <summary>
+        /// 	The get configuration object types.
+        /// </summary>
+        /// <returns>An array of configuration objects.</returns>
+        Type[] GetConfigurationObjectTypes();
+
+        /// <summary>
+        /// 	Initializes the plugins that have been loaded during application startup.
+        /// </summary>
+        void InitializePlugIns();
+
+        /// <summary>
+        /// 	Loads the <paramref name = "plugIn" /> (calling its <see cref = "IPlugIn.LoadPlugIn" /> method) and
+        /// 	adds it to the <see cref = "Plugins" /> dictionary for access by other services.
+        /// </summary>
+        /// <param name = "plugIn">The plugin to load.</param>
+        /// <exception cref = "ArgumentNullException">If <paramref name = "plugIn" /> is null.</exception>
+        void LoadPlugIn(IPlugIn plugIn);
+
+        /// <summary>
+        /// 	Posts a system message for listeners.
+        /// </summary>
+        /// <param name = "message">A system message type.</param>
+        /// <param name = "data">The asssociated data.</param>
+        void PostMessage(SystemMessage message, object data);
+
+        /// <summary>
+        /// 	Registers the component service type <typeparamref name = "TService" /> with and implemetation of type <typeparamref name = "TImp" />.
+        /// </summary>
+        /// <typeparam name = "TService">The contract type.</typeparam>
+        /// <typeparam name = "TImp">The implementing type.</typeparam>
+        /// <param name = "key">The key or name of the service.</param>
+        void RegisterComponent<TService, TImp>(string key);
+
+        /// <summary>
+        /// 	Registers the component implemetation of type <typeparamref name = "TImp" />.
+        /// </summary>
+        /// <typeparam name = "TImp">The implementing type.</typeparam>
+        /// <param name = "key">The key or name of the service.</param>
+        void RegisterComponent<TImp>(string key);
+
+        /// <summary>
+        /// 	The register configuration object.
+        /// </summary>
+        /// <typeparam name = "TConfig">A configuration class.</typeparam>
+        void RegisterConfigurationObject<TConfig>() where TConfig : IConfigurationObject;
+
+        /// <summary>
+        /// 	Registers the editor of type <typeparamref name = "TEditor" /> using the <see cref = "FileEditorDescriptor.EditorKeyName" />.
+        /// </summary>
+        /// <typeparam name = "TEditor">The editor type.</typeparam>
+        /// <param name = "fileEditorDescriptor">The file editor descriptor.</param>
+        void RegisterEditor<TEditor>(FileEditorDescriptor fileEditorDescriptor) where TEditor : IEditor;
+
+        /// <summary>
+        /// 	Registers the component service type <typeparamref name = "TService" /> with and implemetation of type <typeparamref name = "TImp" /> as a singleton.
+        /// </summary>
+        /// <typeparam name = "TService">The contract type.</typeparam>
+        /// <typeparam name = "TImp">The implementing type.</typeparam>
+        /// <param name = "key">The key or name of the service.</param>
+        void RegisterSingletonComponent<TService, TImp>(string key);
+
+        /// <summary>
+        /// 	Resolves an instance of <typeparamref name = "T" /> from the container.
+        /// </summary>
+        /// <typeparam name = "T">The type to find in the container.</typeparam>
+        /// <param name = "key">The key (can be null if not applicable).</param>
+        /// <returns>An instance of the type depending on the containters configuration.</returns>
+        T Resolve<T>(string key);
+
+        /// <summary>
+        /// 	The resolve.
+        /// </summary>
+        /// <typeparam name = "T">The type to find in the container.</typeparam>
+        /// <returns>An instance of the type depending on the containters configuration.</returns>
+        T Resolve<T>();
+
+        /// <summary>
+        /// Remove the component by name.
+        /// </summary>
+        /// <returns>True on success.</returns>
+	    void RemoveComponent<TImp>();
+    }
+}
\ No newline at end of file
Added +149 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/IApplicationSettings.cs b/minisqlquery-master/src/MiniSqlQuery.Core/IApplicationSettings.cs
new file mode 100644
index 0000000..a11ae12
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/IApplicationSettings.cs
@@ -0,0 +1,149 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+using System.Collections.Specialized;
+using System.Data.Common;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	An interface for the application settings.
+    /// </summary>
+    public interface IApplicationSettings
+    {
+        /// <summary>
+        /// 	Fired when the list of connection definitions is modified.
+        /// </summary>
+        /// <seealso cref = "SetConnectionDefinitions" />
+        /// <seealso cref = "GetConnectionDefinitions" />
+        event EventHandler ConnectionDefinitionsChanged;
+
+        /// <summary>
+        /// 	Fired when the database connection (provider and/or connection string) are modified.
+        /// </summary>
+        /// <seealso cref = "ResetConnection" />
+        event EventHandler DatabaseConnectionReset;
+
+        /// <summary>
+        /// 	Gets an instance of <see cref = "DbConnection" /> depending on the value of <see cref = "ConnectionDefinition" />.
+        /// </summary>
+        /// <value>The connection.</value>
+        DbConnection Connection { get; }
+
+        /// <summary>
+        /// 	Gets or sets a reference to the current connection definiton class.
+        /// </summary>
+        /// <value>The connection definition.</value>
+        DbConnectionDefinition ConnectionDefinition { get; set; }
+
+        /// <summary>
+        /// 	Gets or sets the date time format for grid item results (e.g. "yyyy-MM-dd HH:mm:ss.fff").
+        /// </summary>
+        /// <value>The date time format.</value>
+        string DateTimeFormat { get; set; }
+
+        /// <summary>
+        /// 	Gets or sets the default connection definition filename. I blank the default is the users profile area.
+        /// </summary>
+        /// <value>The default connection definition filename.</value>
+        string DefaultConnectionDefinitionFilename { get; set; }
+
+        /// <summary>
+        /// 	Gets the default filter string for dialog boxes.
+        /// </summary>
+        /// <value>The default file filter.</value>
+        string DefaultFileFilter { get; }
+
+        /// <summary>
+        /// 	Gets or sets a value indicating whether to enable query batching using the "GO" keyword.
+        /// </summary>
+        /// <value><c>true</c> if query batching is enabled; otherwise, <c>false</c>.</value>
+        bool EnableQueryBatching { get; set; }
+
+        /// <summary>
+        ///		Gets or sets a value indicating the command timeout.
+        /// </summary>
+        /// <value>The command timeout.</value>
+        int CommandTimeout { get; set; }
+
+        /// <summary>
+        /// 	Gets or sets a value indicating whether to include read-only columns in the export SQL.
+        /// </summary>
+        /// <value>
+        /// 	<c>true</c> if including read-only columns in the export; otherwise, <c>false</c>.
+        /// </value>
+        bool IncludeReadOnlyColumnsInExport { get; set; }
+
+        /// <summary>
+        /// 	Gets or sets a value indicating whether to load plugins or not.
+        /// </summary>
+        /// <value><c>true</c> if [load plugins]; otherwise, <c>false</c>. The default is <c>true</c>.</value>
+        bool LoadExternalPlugins { get; set; }
+
+        /// <summary>
+        /// 	Gets or sets the null text of a result (e.g. "&lt;NULL&gt;").
+        /// </summary>
+        /// <value>The null text.</value>
+        string NullText { get; set; }
+
+        /// <summary>
+        /// 	Gets or sets the plug in file filter for finding the external plugins (e.g. "*.plugin.dll").
+        /// </summary>
+        /// <value>The plug in file filter.</value>
+        string PlugInFileFilter { get; set; }
+
+        /// <summary>
+        /// Gets or sets the most recent files.
+        /// </summary>
+        /// <value>The most recent files.</value>
+        StringCollection MostRecentFiles { get; set; }
+
+        /// <summary>
+        /// 	Gets an instance of <see cref = "DbProviderFactory" /> depending on the value of <see cref = "ConnectionDefinition" />.
+        /// </summary>
+        /// <value>The provider factory.</value>
+        DbProviderFactory ProviderFactory { get; }
+
+        /// <summary>
+        /// 	Closes the current connection (if any).
+        /// </summary>
+        void CloseConnection();
+
+        /// <summary>
+        /// 	Gets the current connection definitions for this user.
+        /// </summary>
+        /// <returns>Connection definitions.</returns>
+        DbConnectionDefinitionList GetConnectionDefinitions();
+
+        /// <summary>
+        /// 	Helper method to get an open connection.
+        /// </summary>
+        /// <returns>A <see cref = "DbConnection" /> object.</returns>
+        DbConnection GetOpenConnection();
+
+        /// <summary>
+        /// 	Gets, and increments, the "untitled document counter" starting at 1 for the "session".
+        /// </summary>
+        /// <value>The untitled document value.</value>
+        /// <returns>The get untitled document counter.</returns>
+        int GetUntitledDocumentCounter();
+
+        /// <summary>
+        /// 	Resets the connection details firing the <see cref = "DatabaseConnectionReset" /> event.
+        /// </summary>
+        /// <seealso cref = "DatabaseConnectionReset" />
+        void ResetConnection();
+
+        /// <summary>
+        /// 	Resets the list of connection definitions that are stored in the user profile.
+        /// </summary>
+        /// <param name = "definitionList">The definition List.</param>
+        void SetConnectionDefinitions(DbConnectionDefinitionList definitionList);
+    }
+}
\ No newline at end of file
Added +77 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/ICommand.cs b/minisqlquery-master/src/MiniSqlQuery.Core/ICommand.cs
new file mode 100644
index 0000000..a8cdfab
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/ICommand.cs
@@ -0,0 +1,77 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	Represents a "command", typically a user action such as saving a file or executing a query.
+    /// </summary>
+    public interface ICommand
+    {
+        /// <summary>
+        /// 	Gets a value indicating whether this <see cref = "ICommand" /> is enabled.
+        /// </summary>
+        /// <value><c>true</c> if enabled; otherwise, <c>false</c>.</value>
+        bool Enabled { get; }
+
+        /// <summary>
+        /// Gets or sets the host, typically the button holding the command.
+        /// </summary>
+        /// <value>The host control.</value>
+        object Host { get; set; }
+
+        /// <summary>
+        /// 	Gets the name of the command, used in menus and buttons.
+        /// </summary>
+        /// <value>The name of the command.</value>
+        string Name { get; }
+
+        /// <summary>
+        /// 	Gets or sets a reference to the application services to allow access to the other components.
+        /// </summary>
+        /// <value>A reference to the <see cref = "IApplicationServices" /> instance.</value>
+        IApplicationServices Services { get; set; }
+
+        /// <summary>
+        /// 	Gets or sets a reference to the application settings.
+        /// </summary>
+        /// <value>The application settings.</value>
+        IApplicationSettings Settings { get; set; }
+
+        /// <summary>
+        /// 	Gets the menu shortcut keys for this command (e.g. Keys.F5).
+        /// </summary>
+        /// <value>The shortcut keys for this command.</value>
+        Keys ShortcutKeys { get; }
+
+        /// <summary>
+        /// 	Gets the shortcut key text to be displayed as help.
+        /// </summary>
+        /// <value>The shortcut keys text.</value>
+        string ShortcutKeysText { get; }
+
+        /// <summary>
+        /// 	Gets the "small image" associated with this control (for use on buttons or menu items).
+        /// 	Use null (or Nothing in Visual Basic) if there is no image.
+        /// </summary>
+        /// <value>The small image representing this command (or null for none).</value>
+        Image SmallImage { get; }
+
+        /// <summary>
+        /// 	Executes the command based on the current settings.
+        /// </summary>
+        /// <remarks>
+        /// 	If a commands <see cref = "Enabled" /> value is false, a call to <see cref = "Execute" /> should have no effect
+        /// 	(and not throw an exception).
+        /// </remarks>
+        void Execute();
+    }
+}
\ No newline at end of file
Added +29 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/ICompletionProvider.cs b/minisqlquery-master/src/MiniSqlQuery.Core/ICompletionProvider.cs
new file mode 100644
index 0000000..584d39f
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/ICompletionProvider.cs
@@ -0,0 +1,29 @@
+namespace MiniSqlQuery.Core
+{
+    public interface ICompletionProvider
+    {
+        bool Enabled { get; set; }
+        bool KeyEventHandlerFired(char ch);
+    }
+
+    public class NullCompletionProvider : ICompletionProvider
+    {
+        private readonly bool _enabled;
+
+        public NullCompletionProvider()
+        {
+            _enabled = false;
+        }
+
+        public bool Enabled
+        {
+            get { return _enabled; }
+            set { }
+        }
+
+        public bool KeyEventHandlerFired(char ch)
+        {
+            return false;
+        }
+    }
+}
\ No newline at end of file
Added +41 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/IConfigurationObject.cs b/minisqlquery-master/src/MiniSqlQuery.Core/IConfigurationObject.cs
new file mode 100644
index 0000000..6a56d20
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/IConfigurationObject.cs
@@ -0,0 +1,41 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System.ComponentModel;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	A configuration object for use with the options form.
+    /// </summary>
+    public interface IConfigurationObject : INotifyPropertyChanged
+    {
+        /// <summary>
+        /// 	Gets a value indicating whether the settings are dirty.
+        /// </summary>
+        /// <value>The is dirty.</value>
+        bool IsDirty { get; }
+
+        /// <summary>
+        /// 	Gets the Name of the settings.
+        /// </summary>
+        /// <value>The name of the settings.</value>
+        string Name { get; }
+
+        /// <summary>
+        /// 	Gets a Settings object.
+        /// </summary>
+        /// <value>The settings.</value>
+        object Settings { get; }
+
+        /// <summary>
+        /// 	Saves the settings.
+        /// </summary>
+        void Save();
+    }
+}
\ No newline at end of file
Added +65 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/IDatabaseInspector.cs b/minisqlquery-master/src/MiniSqlQuery.Core/IDatabaseInspector.cs
new file mode 100644
index 0000000..941a8e3
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/IDatabaseInspector.cs
@@ -0,0 +1,65 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System.Windows.Forms;
+using MiniSqlQuery.Core.DbModel;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	An interface to the query windows database inspector.
+    /// </summary>
+    public interface IDatabaseInspector
+    {
+        /// <summary>
+        /// 	Gets ColumnMenu.
+        /// </summary>
+        /// <value>The column menu.</value>
+        ContextMenuStrip ColumnMenu { get; }
+
+        /// <summary>
+        /// 	Gets the current database schema info (if any).
+        /// </summary>
+        /// <value>The db schema.</value>
+        DbModelInstance DbSchema { get; }
+
+        /// <summary>
+        /// 	Gets RightClickedModelObject.
+        /// </summary>
+        /// <value>The right clicked model object.</value>
+        IDbModelNamedObject RightClickedModelObject { get; }
+
+        /// <summary>
+        /// 	Gets the name of the curent table (or view) with schema if applicable in the tree view that is being clicked.
+        /// </summary>
+        /// <value>The table or view name or null if none selected.</value>
+        string RightClickedTableName { get; }
+
+        /// <summary>
+        /// 	Gets the Table context menu strip. Alows an easy method to add menu items.
+        /// </summary>
+        /// <value>The table menu.</value>
+        ContextMenuStrip TableMenu { get; }
+
+        /// <summary>
+        /// 	Close the window.
+        /// </summary>
+        void Close();
+
+        /// <summary>
+        /// 	Reloads the meta-data and re-builds the tree.
+        /// </summary>
+        void LoadDatabaseDetails();
+
+        /// <summary>
+        /// 	The navigate to.
+        /// </summary>
+        /// <param name = "modelObject">The model object.</param>
+        void NavigateTo(IDbModelNamedObject modelObject);
+    }
+}
\ No newline at end of file
Added +46 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/IDatabaseSchemaService.cs b/minisqlquery-master/src/MiniSqlQuery.Core/IDatabaseSchemaService.cs
new file mode 100644
index 0000000..9af188e
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/IDatabaseSchemaService.cs
@@ -0,0 +1,46 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System.Collections.Generic;
+using System.Data.Common;
+using MiniSqlQuery.Core.DbModel;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	The database schema service interface.
+    /// </summary>
+    public interface IDatabaseSchemaService
+    {
+        /// <summary>
+        /// 	Gets or sets ProviderName.
+        /// </summary>
+        /// <value>The provider name.</value>
+        string ProviderName { get; set; }
+
+        /// <summary>
+        /// 	Gets a database object model that represents the items defined by the <paramref name = "connection" />.
+        /// </summary>
+        /// <param name = "connection">The connection string.</param>
+        /// <returns>A database model instance object describing the database.</returns>
+        DbModelInstance GetDbObjectModel(string connection);
+
+        /// <summary>
+        /// 	Gets database types by querying the schema.
+        /// </summary>
+        /// <param name = "connection">The database connection.</param>
+        /// <returns>A dictionary of database types, the key is the SQL type and the value is the full detail of the type.</returns>
+        Dictionary<string, DbModelType> GetDbTypes(DbConnection connection);
+
+        /// <summary>
+        /// 	Get the description of the database.
+        /// </summary>
+        /// <returns>The database description.</returns>
+        string GetDescription();
+    }
+}
\ No newline at end of file
Added +41 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/IDbModelNamedObject.cs b/minisqlquery-master/src/MiniSqlQuery.Core/IDbModelNamedObject.cs
new file mode 100644
index 0000000..7c44767
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/IDbModelNamedObject.cs
@@ -0,0 +1,41 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	A database model object, e.g. a column, table etc can implement this interface.
+    /// </summary>
+    public interface IDbModelNamedObject
+    {
+        /// <summary>
+        /// Gets the full name of the object, e.g. "dbo.FistName".
+        /// </summary>
+        /// <value>The full name.</value>
+        string FullName { get; }
+
+        /// <summary>
+        /// Gets the name of the object, e.g. "FistName".
+        /// </summary>
+        /// <value>The object name.</value>
+        string Name { get; }
+
+        /// <summary>
+        /// Gets the type of the object, e.g. "VARCHAR".
+        /// </summary>
+        /// <value>The type of the object.</value>
+        string ObjectType { get; }
+
+        /// <summary>
+        /// Gets the schema name, e.g. "dbo".
+        /// </summary>
+        /// <value>The schema name if any.</value>
+        string Schema { get; }
+    }
+}
\ No newline at end of file
Added +81 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/IEditor.cs b/minisqlquery-master/src/MiniSqlQuery.Core/IEditor.cs
new file mode 100644
index 0000000..62c9281
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/IEditor.cs
@@ -0,0 +1,81 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	The editor interface. Defines the core behaviours for interacting with the core application.
+    /// </summary>
+    public interface IEditor
+    {
+        /// <summary>
+        /// 	Gets or sets the contetnts of the editor.
+        /// </summary>
+        /// <value>All the text in the window.</value>
+        string AllText { get; set; }
+
+        /// <summary>
+        /// 	Gets the file filter for this editor (e.g. "SQL Files (*.sql)|*.sql|All Files (*.*)|*.*").
+        /// </summary>
+        /// <value>The file filter.</value>
+        string FileFilter { get; }
+
+        /// <summary>
+        /// 	Gets or sets the filename of the docuemnt being edited (can be null, as in not saved yet).
+        /// </summary>
+        /// <value>The file name.</value>
+        string FileName { get; set; }
+
+        /// <summary>
+        /// 	Gets a value indicating whether this instance is dirty or not.
+        /// </summary>
+        /// <value>The value of <c>true</c> if this instance is dirty; otherwise, <c>false</c>.</value>
+        bool IsDirty { get; }
+
+        /// <summary>
+        /// 	Gets the currently selected text (if any) in the editor.
+        /// </summary>
+        /// <value>The selected text.</value>
+        string SelectedText { get; }
+
+        /// <summary>
+        /// 	Clears the selection (deletes selected text if any).
+        /// </summary>
+        void ClearSelection();
+
+        /// <summary>
+        /// 	Highlights the string starting at <paramref name = "offset" /> for <paramref name = "length" /> characters.
+        /// </summary>
+        /// <param name = "offset">The offset to start at.</param>
+        /// <param name = "length">The length.</param>
+        void HighlightString(int offset, int length);
+
+        /// <summary>
+        /// 	Inserts <paramref name = "text" /> at the current cursor position (selected text is overwritten).
+        /// </summary>
+        /// <param name = "text">The text to insert at the current position.</param>
+        void InsertText(string text);
+
+        /// <summary>
+        /// 	Loads the file by the path in <see cref = "FileName" />.
+        /// </summary>
+        void LoadFile();
+
+        /// <summary>
+        /// 	Saves the file by the path in <see cref = "FileName" />.
+        /// </summary>
+        void SaveFile();
+
+        /// <summary>
+        /// 	Sets the syntax mode off the editor.
+        /// </summary>
+        /// <param name = "syntaxName">The mode, e.g. "sql", "cs", "txt" etc.</param>
+        void SetSyntax(string syntaxName);
+    }
+}
\ No newline at end of file
Added +44 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/IFileEditorResolver.cs b/minisqlquery-master/src/MiniSqlQuery.Core/IFileEditorResolver.cs
new file mode 100644
index 0000000..ef5383f
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/IFileEditorResolver.cs
@@ -0,0 +1,44 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	The file editor resolver interface.
+    ///		Given a file name or extention the service will work out the most appropriate editor to use.
+    /// </summary>
+    public interface IFileEditorResolver
+    {
+        /// <summary>
+        /// 	Gets an array of the file descriptiors.
+        /// </summary>
+        /// <returns>An array of <see cref = "FileEditorDescriptor" /> objects.</returns>
+        FileEditorDescriptor[] GetFileTypes();
+
+        /// <summary>
+        /// 	Registers the specified file editor descriptor.
+        /// </summary>
+        /// <param name = "fileEditorDescriptor">The file editor descriptor.</param>
+        void Register(FileEditorDescriptor fileEditorDescriptor);
+
+        /// <summary>
+        /// 	Resolves the editor instance from the container based on the filename.
+        /// </summary>
+        /// <param name = "filename">The filename.</param>
+        /// <returns>An editor.</returns>
+        IEditor ResolveEditorInstance(string filename);
+
+        /// <summary>
+        /// 	Works out the "name" of the editor to use based on the <paramref name = "extension" />.
+        /// </summary>
+        /// <param name = "extension">The extention ("sql", "txt"/".txt" etc).</param>
+        /// <returns>The name of an editor in the container.</returns>
+        string ResolveEditorNameByExtension(string extension);
+    }
+}
\ No newline at end of file
Added +59 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/IFindReplaceProvider.cs b/minisqlquery-master/src/MiniSqlQuery.Core/IFindReplaceProvider.cs
new file mode 100644
index 0000000..bd241c6
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/IFindReplaceProvider.cs
@@ -0,0 +1,59 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	A control that allows its text to be "found" and optionally "replaced".
+    /// 	The query editor is an obvious provider but other windows can also provide
+    /// 	find/replace functionality by implementing this interface (tools, output windows etc).
+    /// </summary>
+    public interface IFindReplaceProvider : ISupportCursorOffset
+    {
+        /// <summary>
+        /// 	Gets a value indicating whether the text can be replaced, otherwise false.
+        /// </summary>
+        /// <value>The can replace text.</value>
+        bool CanReplaceText { get; }
+
+        /// <summary>
+        /// 	Gets a reference to the text finding service.
+        /// </summary>
+        /// <seealso cref = "SetTextFindService" />
+        /// <value>The text find service.</value>
+        ITextFindService TextFindService { get; }
+
+        /// <summary>
+        /// 	Attemps to find <paramref name = "value" /> in the controls text.
+        /// </summary>
+        /// <param name = "value">The string to search for.</param>
+        /// <param name = "startIndex">The starting position within the buffer.</param>
+        /// <param name = "comparisonType">The string comparison type to use, e.g. <see cref="StringComparison.InvariantCultureIgnoreCase"/></param>
+        /// <returns>The find string.</returns>
+        int FindString(string value, int startIndex, StringComparison comparisonType);
+
+        /// <summary>
+        /// 	Replaces the text from <paramref name = "startIndex" /> for <paramref name = "length" /> characters 
+        /// 	with <paramref name = "value" />.
+        /// </summary>
+        /// <param name = "value">The new string.</param>
+        /// <param name = "startIndex">the starting position.</param>
+        /// <param name = "length">The length (0 implies an insert).</param>
+        /// <returns>True if successful, otherwise false.</returns>
+        /// <seealso cref = "CanReplaceText" />
+        bool ReplaceString(string value, int startIndex, int length);
+
+        /// <summary>
+        /// 	Overrides the default text find service with <paramref name = "textFindService" /> (e.g. a RegEx service).
+        /// </summary>
+        /// <param name = "textFindService">The service to use.</param>
+        void SetTextFindService(ITextFindService textFindService);
+    }
+}
\ No newline at end of file
Added +56 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/IFindReplaceWindow.cs b/minisqlquery-master/src/MiniSqlQuery.Core/IFindReplaceWindow.cs
new file mode 100644
index 0000000..6b67bd1
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/IFindReplaceWindow.cs
@@ -0,0 +1,56 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System.Windows.Forms;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	An interface for the form that provides the find replace functionality.
+    /// </summary>
+    public interface IFindReplaceWindow
+    {
+        /// <summary>
+        /// 	Gets or sets the "find string".
+        /// </summary>
+        /// <value>The find string.</value>
+        string FindString { get; set; }
+
+        /// <summary>
+        /// 	Gets a value indicating whether this instance is disposed.
+        /// </summary>
+        /// <value>
+        /// 	<c>true</c> if this instance is disposed; otherwise, <c>false</c>.
+        /// </value>
+        bool IsDisposed { get; }
+
+        /// <summary>
+        /// 	Gets or sets the "replace string".
+        /// </summary>
+        /// <value>The replace string.</value>
+        string ReplaceString { get; set; }
+
+        /// <summary>
+        /// 	Gets or sets a value indicating whether the form is "top most" in the window stack.
+        /// </summary>
+        /// <value><c>true</c> if it's top most; otherwise, <c>false</c>.</value>
+        bool TopMost { get; set; }
+
+        /// <summary>
+        /// 	Gets or sets a value indicating whether this form is visible.
+        /// </summary>
+        /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value>
+        bool Visible { get; set; }
+
+        /// <summary>
+        /// 	Shows the window.
+        /// </summary>
+        /// <param name = "owner">The owner form.</param>
+        void Show(IWin32Window owner);
+    }
+}
\ No newline at end of file
Added +148 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/IHostWindow.cs b/minisqlquery-master/src/MiniSqlQuery.Core/IHostWindow.cs
new file mode 100644
index 0000000..bc880d1
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/IHostWindow.cs
@@ -0,0 +1,148 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System.Windows.Forms;
+using WeifenLuo.WinFormsUI.Docking;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	Core functions of the main MDI application host Form.
+    /// </summary>
+    public interface IHostWindow
+    {
+        /// <summary>
+        /// 	Gets a reference to the active child form.
+        /// </summary>
+        /// <value>The active form or null.</value>
+        Form ActiveChildForm { get; }
+
+        /// <summary>
+        /// 	Gets a reference to the database inspector window if open.
+        /// </summary>
+        /// <value>A <see cref = "IDatabaseInspector" /> object or null.</value>
+        IDatabaseInspector DatabaseInspector { get; }
+
+        /// <summary>
+        /// 	Gets the instance of the hosting form.
+        /// </summary>
+        /// <value>The host instance.</value>
+        Form Instance { get; }
+
+        /// <summary>
+        /// 	Gets a reference to the host windows tool strip control.
+        /// </summary>
+        /// <value>The window tool strip.</value>
+        ToolStrip ToolStrip { get; }
+
+        /// <summary>
+        /// 	Adds an <see cref = "ICommand" /> to the plugins menu.
+        /// </summary>
+        /// <typeparam name = "TCommand">The command implementation to direct the name, image etc of the new menu item.</typeparam>
+        void AddPluginCommand<TCommand>() where TCommand : ICommand, new();
+
+        /// <summary>
+        /// 	Adds a command based button to the tool strip by <paramref name = "index" />.
+        /// </summary>
+        /// <typeparam name = "TCommand">The command implementation to direct the name, image etc of the new tool strip item.</typeparam>
+        /// <param name = "index">The position for the tool strip button, if null the item is appended to the end.</param>
+        void AddToolStripCommand<TCommand>(int? index) where TCommand : ICommand, new();
+
+        /// <summary>
+        /// 	Adds a seperator to the tool strip by <paramref name = "index" />.
+        /// </summary>
+        /// <param name = "index">The position for the seperator, if null the item is appended to the end.</param>
+        void AddToolStripSeperator(int? index);
+
+        /// <summary>
+        /// 	Displays the <paramref name = "frm" /> in the host window.
+        /// </summary>
+        /// <param name = "frm">The child form to dock.</param>
+        void DisplayDockedForm(DockContent frm);
+
+        /// <summary>
+        /// 	Displays a message box with the specified text, caption, buttons, icon, default button, options, and Help button, using the specified Help file and Help keyword.
+        /// </summary>
+        /// <param name = "source">The source form of the message.</param>
+        /// <param name = "text">The text to display in the message box. </param>
+        /// <param name = "caption">The text to display in the title bar of the message box. </param>
+        /// <param name = "buttons">One of the <see cref = "T:System.Windows.Forms.MessageBoxButtons" /> values that specifies which buttons to display in the message box. </param>
+        /// <param name = "icon">One of the <see cref = "T:System.Windows.Forms.MessageBoxIcon" /> values that specifies which icon to display in the message box. </param>
+        /// <param name = "defaultButton">One of the <see cref = "T:System.Windows.Forms.MessageBoxDefaultButton" /> values that specifies the default button for the message box. </param>
+        /// <param name = "options">One of the <see cref = "T:System.Windows.Forms.MessageBoxOptions" /> values that specifies which display and association options will be used for the message box. You may pass in 0 if you wish to use the defaults.</param>
+        /// <param name = "helpFilePath">The path and name of the Help file to display when the user clicks the Help button. </param>
+        /// <param name = "keyword">The Help keyword to display when the user clicks the Help button. </param>
+        /// <returns>One of the <see cref = "T:System.Windows.Forms.DialogResult" /> values.</returns>
+        /// <exception cref = "T:System.ComponentModel.InvalidEnumArgumentException"><paramref name = "buttons" /> is not a member of <see cref = "T:System.Windows.Forms.MessageBoxButtons" />.-or- <paramref name = "icon" /> is not a member of <see cref = "T:System.Windows.Forms.MessageBoxIcon" />.-or- The <paramref name = "defaultButton" /> specified is not a member of <see cref = "T:System.Windows.Forms.MessageBoxDefaultButton" />. </exception>
+        /// <exception cref = "T:System.InvalidOperationException">An attempt was made to display the <see cref = "T:System.Windows.Forms.MessageBox" /> in a process that is not running in User Interactive mode. This is specified by the <see cref = "P:System.Windows.Forms.SystemInformation.UserInteractive" /> property. </exception>
+        /// <exception cref = "T:System.ArgumentException"><paramref name = "options" /> specified both <see cref = "F:System.Windows.Forms.MessageBoxOptions.DefaultDesktopOnly" /> and <see cref = "F:System.Windows.Forms.MessageBoxOptions.ServiceNotification" />.-or- <paramref name = "buttons" /> specified an invalid combination of <see cref = "T:System.Windows.Forms.MessageBoxButtons" />. </exception>
+        DialogResult DisplayMessageBox(
+            Form source, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, MessageBoxOptions options, string helpFilePath, string keyword);
+
+        /// <summary>
+        /// 	Displays an "OK" message box with the specified text and caption.
+        /// </summary>
+        /// <param name = "source">The source form of the message.</param>
+        /// <param name = "text">The text to display in the message box. </param>
+        /// <param name = "caption">The text to display in the title bar of the message box. </param>
+        /// <returns>One of the <see cref = "T:System.Windows.Forms.DialogResult" /> values.</returns>
+        DialogResult DisplaySimpleMessageBox(Form source, string text, string caption);
+
+        /// <summary>
+        /// 	Gets the relevent menu item by name.
+        /// </summary>
+        /// <param name = "name">The name of the menu to get, e.g. "Plugins" or "File" (no amphersand required).</param>
+        /// <returns>The menu item object by <paramref name = "name" />.</returns>
+        ToolStripMenuItem GetMenuItem(string name);
+
+        ///// <summary>
+        ///// Plays the system beep.
+        ///// </summary>
+        // void Beep();
+
+        /// <summary>
+        /// 	A testable way to pass command line arguements to the application.
+        /// </summary>
+        /// <param name = "args">An array of command line arguements.</param>
+        void SetArguments(string[] args);
+
+        /// <summary>
+        /// 	Sets the application cursor to <paramref name = "cursor" />.
+        /// </summary>
+        /// <param name = "cursor">The new cursor mode.</param>
+        void SetPointerState(Cursor cursor);
+
+        /// <summary>
+        /// 	Sets the status text of the host.
+        /// </summary>
+        /// <param name = "source">The source form, for tracking MDI children.</param>
+        /// <param name = "text">The text to set.</param>
+        void SetStatus(Form source, string text);
+
+        /// <summary>
+        /// Sets the result count.
+        /// </summary>
+        /// <param name="source">The source.</param>
+        /// <param name="count">The count.</param>
+        void SetResultCount(Form source, int? count);
+
+        /// <summary>
+        /// 	Displays (and replaces if required) the database inspactor window.
+        /// </summary>
+        /// <param name = "databaseInspector">The window to display.</param>
+        /// <param name = "dockState">The state for the window.</param>
+        void ShowDatabaseInspector(IDatabaseInspector databaseInspector, DockState dockState);
+
+        /// <summary>
+        /// 	Displays a "tool" window, like the database inspector etc.
+        /// </summary>
+        /// <param name = "form">The window to display, it must be a <see cref = "DockContent" /> form.</param>
+        /// <param name = "dockState">The initial docking state of the window, e.g. <see cref = "DockState.DockLeftAutoHide" />.</param>
+        void ShowToolWindow(DockContent form, DockState dockState);
+    }
+}
\ No newline at end of file
Added +833 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/ImageResource.Designer.cs b/minisqlquery-master/src/MiniSqlQuery.Core/ImageResource.Designer.cs
new file mode 100644
index 0000000..7b24ade
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/ImageResource.Designer.cs
@@ -0,0 +1,833 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace MiniSqlQuery.Core {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    public class ImageResource {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal ImageResource() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        public static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MiniSqlQuery.Core.ImageResource", typeof(ImageResource).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        public static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap accept {
+            get {
+                object obj = ResourceManager.GetObject("accept", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap add {
+            get {
+                object obj = ResourceManager.GetObject("add", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
+        /// </summary>
+        public static System.Drawing.Icon App {
+            get {
+                object obj = ResourceManager.GetObject("App", resourceCulture);
+                return ((System.Drawing.Icon)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap ApplicationIcon {
+            get {
+                object obj = ResourceManager.GetObject("ApplicationIcon", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap around_text {
+            get {
+                object obj = ResourceManager.GetObject("around_text", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap cancel {
+            get {
+                object obj = ResourceManager.GetObject("cancel", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap cog {
+            get {
+                object obj = ResourceManager.GetObject("cog", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap column {
+            get {
+                object obj = ResourceManager.GetObject("column", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap column_row_version {
+            get {
+                object obj = ResourceManager.GetObject("column_row_version", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap comments {
+            get {
+                object obj = ResourceManager.GetObject("comments", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap cross {
+            get {
+                object obj = ResourceManager.GetObject("cross", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap database {
+            get {
+                object obj = ResourceManager.GetObject("database", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap database_add {
+            get {
+                object obj = ResourceManager.GetObject("database_add", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap database_delete {
+            get {
+                object obj = ResourceManager.GetObject("database_delete", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap database_edit {
+            get {
+                object obj = ResourceManager.GetObject("database_edit", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
+        /// </summary>
+        public static System.Drawing.Icon database_edit_icon {
+            get {
+                object obj = ResourceManager.GetObject("database_edit_icon", resourceCulture);
+                return ((System.Drawing.Icon)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap database_error {
+            get {
+                object obj = ResourceManager.GetObject("database_error", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap database_refresh {
+            get {
+                object obj = ResourceManager.GetObject("database_refresh", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
+        /// </summary>
+        public static System.Drawing.Icon disconnect_icon {
+            get {
+                object obj = ResourceManager.GetObject("disconnect_icon", resourceCulture);
+                return ((System.Drawing.Icon)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap disk {
+            get {
+                object obj = ResourceManager.GetObject("disk", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap disk_multiple {
+            get {
+                object obj = ResourceManager.GetObject("disk_multiple", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap email {
+            get {
+                object obj = ResourceManager.GetObject("email", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap email_go {
+            get {
+                object obj = ResourceManager.GetObject("email_go", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap error {
+            get {
+                object obj = ResourceManager.GetObject("error", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap exclamation {
+            get {
+                object obj = ResourceManager.GetObject("exclamation", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap feed {
+            get {
+                object obj = ResourceManager.GetObject("feed", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap find {
+            get {
+                object obj = ResourceManager.GetObject("find", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap folder_bug {
+            get {
+                object obj = ResourceManager.GetObject("folder_bug", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap folder_page {
+            get {
+                object obj = ResourceManager.GetObject("folder_page", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap help {
+            get {
+                object obj = ResourceManager.GetObject("help", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap house {
+            get {
+                object obj = ResourceManager.GetObject("house", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap information {
+            get {
+                object obj = ResourceManager.GetObject("information", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap key {
+            get {
+                object obj = ResourceManager.GetObject("key", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap key_disabled {
+            get {
+                object obj = ResourceManager.GetObject("key_disabled", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap key_go {
+            get {
+                object obj = ResourceManager.GetObject("key_go", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap key_go_disabled {
+            get {
+                object obj = ResourceManager.GetObject("key_go_disabled", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap lightning {
+            get {
+                object obj = ResourceManager.GetObject("lightning", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap page {
+            get {
+                object obj = ResourceManager.GetObject("page", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap page_white {
+            get {
+                object obj = ResourceManager.GetObject("page_white", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap page_white_csharp {
+            get {
+                object obj = ResourceManager.GetObject("page_white_csharp", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap plugin {
+            get {
+                object obj = ResourceManager.GetObject("plugin", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap plugin_go {
+            get {
+                object obj = ResourceManager.GetObject("plugin_go", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap plugin_link {
+            get {
+                object obj = ResourceManager.GetObject("plugin_link", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap printer {
+            get {
+                object obj = ResourceManager.GetObject("printer", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap script {
+            get {
+                object obj = ResourceManager.GetObject("script", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap script_code {
+            get {
+                object obj = ResourceManager.GetObject("script_code", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap server {
+            get {
+                object obj = ResourceManager.GetObject("server", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap server_add {
+            get {
+                object obj = ResourceManager.GetObject("server_add", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap server_connect {
+            get {
+                object obj = ResourceManager.GetObject("server_connect", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap server_database {
+            get {
+                object obj = ResourceManager.GetObject("server_database", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap server_delete {
+            get {
+                object obj = ResourceManager.GetObject("server_delete", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap server_edit {
+            get {
+                object obj = ResourceManager.GetObject("server_edit", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap server_error {
+            get {
+                object obj = ResourceManager.GetObject("server_error", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap stop {
+            get {
+                object obj = ResourceManager.GetObject("stop", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap table {
+            get {
+                object obj = ResourceManager.GetObject("table", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap table_add {
+            get {
+                object obj = ResourceManager.GetObject("table_add", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap table_delete {
+            get {
+                object obj = ResourceManager.GetObject("table_delete", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap table_edit {
+            get {
+                object obj = ResourceManager.GetObject("table_edit", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap table_error {
+            get {
+                object obj = ResourceManager.GetObject("table_error", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap table_gear {
+            get {
+                object obj = ResourceManager.GetObject("table_gear", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap table_go {
+            get {
+                object obj = ResourceManager.GetObject("table_go", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap table_key {
+            get {
+                object obj = ResourceManager.GetObject("table_key", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap table_lightning {
+            get {
+                object obj = ResourceManager.GetObject("table_lightning", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap table_link {
+            get {
+                object obj = ResourceManager.GetObject("table_link", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap table_multiple {
+            get {
+                object obj = ResourceManager.GetObject("table_multiple", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap table_refresh {
+            get {
+                object obj = ResourceManager.GetObject("table_refresh", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap table_relationship {
+            get {
+                object obj = ResourceManager.GetObject("table_relationship", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap table_row_delete {
+            get {
+                object obj = ResourceManager.GetObject("table_row_delete", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap table_row_insert {
+            get {
+                object obj = ResourceManager.GetObject("table_row_insert", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap table_save {
+            get {
+                object obj = ResourceManager.GetObject("table_save", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap table_sort {
+            get {
+                object obj = ResourceManager.GetObject("table_sort", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap tick {
+            get {
+                object obj = ResourceManager.GetObject("tick", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap view {
+            get {
+                object obj = ResourceManager.GetObject("view", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap view_multiple {
+            get {
+                object obj = ResourceManager.GetObject("view_multiple", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap world_link {
+            get {
+                object obj = ResourceManager.GetObject("world_link", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap wrench {
+            get {
+                object obj = ResourceManager.GetObject("wrench", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap wrench_orange {
+            get {
+                object obj = ResourceManager.GetObject("wrench_orange", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}
Added +352 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/ImageResource.resx b/minisqlquery-master/src/MiniSqlQuery.Core/ImageResource.resx
new file mode 100644
index 0000000..98a82f3
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/ImageResource.resx
@@ -0,0 +1,352 @@
+<?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>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="accept" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\accept.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="add" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\add.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="App" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ApplicationIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\applicationicon.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="around_text" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\around_text.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="cancel" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\cancel.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="cog" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\cog.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="column" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\column.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="comments" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\comments.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="cross" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\cross.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="database" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\database.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="database_add" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\database_add.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="database_delete" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\database_delete.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="database_edit" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\database_edit.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="database_error" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\database_error.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="database_refresh" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\database_refresh.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="disk" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\disk.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="disk_multiple" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\disk_multiple.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="email" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\email.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="email_go" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\email_go.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="error" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\error.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="exclamation" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\exclamation.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="feed" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\feed.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="find" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\find.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="folder_bug" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\folder_bug.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="folder_page" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\folder_page.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="help" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\help.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="house" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\house.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="information" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\information.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="key" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\key.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="lightning" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\lightning.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="page" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\page.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="page_white" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\page_white.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="page_white_csharp" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\page_white_csharp.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="plugin" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\plugin.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="plugin_go" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\plugin_go.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="plugin_link" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\plugin_link.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="printer" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\printer.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="script" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\script.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="script_code" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\script_code.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="server" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\server.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="server_add" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\server_add.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="server_connect" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\server_connect.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="server_database" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\server_database.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="server_delete" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\server_delete.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="server_edit" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\server_edit.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="server_error" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\server_error.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="stop" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\stop.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="table" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\table.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="table_add" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\table_add.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="table_delete" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\table_delete.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="table_edit" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\table_edit.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="table_error" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\table_error.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="table_gear" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\table_gear.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="table_go" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\table_go.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="table_key" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\table_key.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="table_lightning" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\table_lightning.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="table_link" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\table_link.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="table_multiple" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\table_multiple.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="table_refresh" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\table_refresh.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="table_relationship" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\table_relationship.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="table_row_delete" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\table_row_delete.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="table_row_insert" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\table_row_insert.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="table_save" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\table_save.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="table_sort" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\table_sort.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="tick" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\tick.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="view" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\view.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="view_multiple" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\view_multiple.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="world_link" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\world_link.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="wrench" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\wrench.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="wrench_orange" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Images\wrench_orange.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="database_edit_icon" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\database_edit.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="disconnect_icon" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\disconnect.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="key_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\key_disabled.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="key_go_disabled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\key_go_disabled.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="column_row_version" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\column_row_version.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="key_go" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>images\key_go.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
\ No newline at end of file
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/accept.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/accept.png
new file mode 100644
index 0000000..89c8129
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/accept.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/add.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/add.png
new file mode 100644
index 0000000..6332fef
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/add.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/App.ico b/minisqlquery-master/src/MiniSqlQuery.Core/Images/App.ico
new file mode 100644
index 0000000..50d3b41
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/App.ico differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/ApplicationIcon.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/ApplicationIcon.png
new file mode 100644
index 0000000..6c1c6ce
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/ApplicationIcon.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/around_text.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/around_text.png
new file mode 100644
index 0000000..c47ddd8
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/around_text.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/cancel.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/cancel.png
new file mode 100644
index 0000000..c149c2b
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/cancel.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/cog.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/cog.png
new file mode 100644
index 0000000..67de2c6
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/cog.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/column.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/column.png
new file mode 100644
index 0000000..5ab5189
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/column.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/column_row_version.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/column_row_version.png
new file mode 100644
index 0000000..4c23b22
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/column_row_version.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/comments.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/comments.png
new file mode 100644
index 0000000..39433cf
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/comments.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/cross.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/cross.png
new file mode 100644
index 0000000..1514d51
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/cross.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/database.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/database.png
new file mode 100644
index 0000000..3d09261
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/database.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/database_add.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/database_add.png
new file mode 100644
index 0000000..802bd6c
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/database_add.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/database_delete.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/database_delete.png
new file mode 100644
index 0000000..cce652e
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/database_delete.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/database_edit.ico b/minisqlquery-master/src/MiniSqlQuery.Core/Images/database_edit.ico
new file mode 100644
index 0000000..12101a1
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/database_edit.ico differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/database_edit.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/database_edit.png
new file mode 100644
index 0000000..e501b66
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/database_edit.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/database_error.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/database_error.png
new file mode 100644
index 0000000..578221a
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/database_error.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/database_refresh.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/database_refresh.png
new file mode 100644
index 0000000..ff803be
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/database_refresh.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/disconnect.ico b/minisqlquery-master/src/MiniSqlQuery.Core/Images/disconnect.ico
new file mode 100644
index 0000000..9e5d4c2
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/disconnect.ico differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/disconnect.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/disconnect.png
new file mode 100644
index 0000000..b335cb1
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/disconnect.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/disk.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/disk.png
new file mode 100644
index 0000000..99d532e
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/disk.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/disk_multiple.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/disk_multiple.png
new file mode 100644
index 0000000..fc5a52f
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/disk_multiple.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/email.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/email.png
new file mode 100644
index 0000000..7348aed
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/email.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/email_go.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/email_go.png
new file mode 100644
index 0000000..4a6c5d3
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/email_go.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/error.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/error.png
new file mode 100644
index 0000000..628cf2d
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/error.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/exclamation.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/exclamation.png
new file mode 100644
index 0000000..c37bd06
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/exclamation.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/feed.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/feed.png
new file mode 100644
index 0000000..315c4f4
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/feed.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/find.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/find.png
new file mode 100644
index 0000000..1547479
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/find.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/folder_bug.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/folder_bug.png
new file mode 100644
index 0000000..4f791b6
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/folder_bug.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/folder_page.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/folder_page.png
new file mode 100644
index 0000000..1ef6e11
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/folder_page.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/help.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/help.png
new file mode 100644
index 0000000..5c87017
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/help.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/house.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/house.png
new file mode 100644
index 0000000..fed6221
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/house.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/information.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/information.png
new file mode 100644
index 0000000..12cd1ae
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/information.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/key.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/key.png
new file mode 100644
index 0000000..4ec1a92
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/key.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/key_disabled.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/key_disabled.png
new file mode 100644
index 0000000..c6b3cff
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/key_disabled.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/key_go.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/key_go.png
new file mode 100644
index 0000000..30b0dc3
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/key_go.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/key_go_disabled.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/key_go_disabled.png
new file mode 100644
index 0000000..2274d93
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/key_go_disabled.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/lightning.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/lightning.png
new file mode 100644
index 0000000..9680afd
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/lightning.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/page.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/page.png
new file mode 100644
index 0000000..03ddd79
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/page.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/page_white.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/page_white.png
new file mode 100644
index 0000000..8b8b1ca
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/page_white.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/page_white_csharp.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/page_white_csharp.png
new file mode 100644
index 0000000..ffb8fc9
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/page_white_csharp.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/plugin.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/plugin.png
new file mode 100644
index 0000000..6187b15
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/plugin.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/plugin_go.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/plugin_go.png
new file mode 100644
index 0000000..41da991
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/plugin_go.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/plugin_link.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/plugin_link.png
new file mode 100644
index 0000000..445c188
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/plugin_link.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/printer.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/printer.png
new file mode 100644
index 0000000..a350d18
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/printer.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/script.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/script.png
new file mode 100644
index 0000000..0f9ed4d
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/script.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/script_code.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/script_code.png
new file mode 100644
index 0000000..63fe6ce
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/script_code.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/server.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/server.png
new file mode 100644
index 0000000..720a237
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/server.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/server_add.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/server_add.png
new file mode 100644
index 0000000..3f10a3a
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/server_add.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/server_connect.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/server_connect.png
new file mode 100644
index 0000000..49b2691
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/server_connect.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/server_database.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/server_database.png
new file mode 100644
index 0000000..b24e826
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/server_database.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/server_delete.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/server_delete.png
new file mode 100644
index 0000000..61e740f
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/server_delete.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/server_edit.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/server_edit.png
new file mode 100644
index 0000000..dc76253
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/server_edit.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/server_error.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/server_error.png
new file mode 100644
index 0000000..f640256
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/server_error.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/stop.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/stop.png
new file mode 100644
index 0000000..0cfd585
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/stop.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/table.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table.png
new file mode 100644
index 0000000..abcd936
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_add.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_add.png
new file mode 100644
index 0000000..2a3e5c4
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_add.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_delete.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_delete.png
new file mode 100644
index 0000000..b85916d
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_delete.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_edit.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_edit.png
new file mode 100644
index 0000000..bfcb024
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_edit.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_error.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_error.png
new file mode 100644
index 0000000..589e92b
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_error.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_gear.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_gear.png
new file mode 100644
index 0000000..cfc2702
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_gear.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_go.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_go.png
new file mode 100644
index 0000000..0528dfa
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_go.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_key.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_key.png
new file mode 100644
index 0000000..34e23e2
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_key.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_lightning.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_lightning.png
new file mode 100644
index 0000000..612612b
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_lightning.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_link.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_link.png
new file mode 100644
index 0000000..decac8a
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_link.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_multiple.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_multiple.png
new file mode 100644
index 0000000..d76448e
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_multiple.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_refresh.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_refresh.png
new file mode 100644
index 0000000..ab92010
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_refresh.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_relationship.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_relationship.png
new file mode 100644
index 0000000..28b8505
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_relationship.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_row_delete.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_row_delete.png
new file mode 100644
index 0000000..54c6969
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_row_delete.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_row_insert.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_row_insert.png
new file mode 100644
index 0000000..ff5925e
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_row_insert.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_save.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_save.png
new file mode 100644
index 0000000..25b74d1
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_save.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_sort.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_sort.png
new file mode 100644
index 0000000..ed6785a
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/table_sort.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/Thumbs.db b/minisqlquery-master/src/MiniSqlQuery.Core/Images/Thumbs.db
new file mode 100644
index 0000000..9684838
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/Thumbs.db differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/tick.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/tick.png
new file mode 100644
index 0000000..a9925a0
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/tick.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/view.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/view.png
new file mode 100644
index 0000000..b14f218
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/view.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/view_multiple.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/view_multiple.png
new file mode 100644
index 0000000..3d36321
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/view_multiple.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/world_link.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/world_link.png
new file mode 100644
index 0000000..b8edc12
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/world_link.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/wrench.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/wrench.png
new file mode 100644
index 0000000..5c8213f
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/wrench.png differ
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Images/wrench_orange.png b/minisqlquery-master/src/MiniSqlQuery.Core/Images/wrench_orange.png
new file mode 100644
index 0000000..565a933
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/Images/wrench_orange.png differ
Added +48 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/IMostRecentFilesService.cs b/minisqlquery-master/src/MiniSqlQuery.Core/IMostRecentFilesService.cs
new file mode 100644
index 0000000..5ac1cfe
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/IMostRecentFilesService.cs
@@ -0,0 +1,48 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	Tracks a list of filenames with promotion etc.
+    /// </summary>
+    public interface IMostRecentFilesService
+    {
+        /// <summary>
+        /// Occurs when a change to the most recent files list is made.
+        /// </summary>
+        event EventHandler<MostRecentFilesChangedEventArgs> MostRecentFilesChanged;
+
+        /// <summary>
+        /// Gets the filenames on the MRU list.
+        /// </summary>
+        /// <value>The filenames.</value>
+        IList<string> Filenames { get; }
+
+        /// <summary>
+        /// Gets the maximum number of MRU commands.
+        /// </summary>
+        /// <value>The maximum number of MRU commands.</value>
+        int MaxCommands { get; }
+
+        /// <summary>
+        /// Registers the specified <paramref name="filename"/>.
+        /// </summary>
+        /// <param name="filename">The <paramref name="filename"/> to register.</param>
+        void Register(string filename);
+
+        /// <summary>
+        /// Removes the specified <paramref name="filename"/> from the list.
+        /// </summary>
+        /// <param name="filename">The <paramref name="filename"/> to remove.</param>
+        void Remove(string filename);
+    }
+}
\ No newline at end of file
Added +9 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/INamedObject.cs b/minisqlquery-master/src/MiniSqlQuery.Core/INamedObject.cs
new file mode 100644
index 0000000..e0ca98d
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/INamedObject.cs
@@ -0,0 +1,9 @@
+using System;
+
+namespace MiniSqlQuery.Core
+{
+	public interface INamedObject
+	{
+		string Name { get; }
+	}
+}
\ No newline at end of file
Added +50 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/INavigatableDocument.cs b/minisqlquery-master/src/MiniSqlQuery.Core/INavigatableDocument.cs
new file mode 100644
index 0000000..d5cb377
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/INavigatableDocument.cs
@@ -0,0 +1,50 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	An interface for a "document" that can be navigated with a cursor, e.g. position at line 1, column 4 etc.
+    /// </summary>
+    public interface INavigatableDocument : ISupportCursorOffset
+    {
+        /// <summary>
+        /// 	Gets the current column the cursor is in.
+        /// </summary>
+        /// <value>The cursor column.</value>
+        int CursorColumn { get; }
+
+        /// <summary>
+        /// 	Gets the current line the cursor is on.
+        /// </summary>
+        /// <value>The cursor line.</value>
+        int CursorLine { get; }
+
+        /// <summary>
+        /// 	Gets the the total number of lines in the editor.
+        /// </summary>
+        /// <value>The total lines.</value>
+        int TotalLines { get; }
+
+        /// <summary>
+        /// 	Sets the cursor by <paramref name = "line" /> and <paramref name = "column" />.
+        /// </summary>
+        /// <param name = "line">The line number.</param>
+        /// <param name = "column">The column number.</param>
+        /// <returns>The set cursor by location.</returns>
+        bool SetCursorByLocation(int line, int column);
+
+        /// <summary>
+        /// 	Sets the cursor position by offset.
+        /// </summary>
+        /// <param name = "offset">The offset for the cursor.</param>
+        /// <returns>The set cursor by offset.</returns>
+        bool SetCursorByOffset(int offset);
+    }
+}
\ No newline at end of file
Added +33 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/IPerformTask.cs b/minisqlquery-master/src/MiniSqlQuery.Core/IPerformTask.cs
new file mode 100644
index 0000000..bcf4beb
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/IPerformTask.cs
@@ -0,0 +1,33 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	Intended as a window level task such as executing a query (like applying ICommand to a window).
+    /// </summary>
+    public interface IPerformTask
+    {
+        /// <summary>
+        /// 	Gets a value indicating whether this instance is busy.
+        /// </summary>
+        /// <value>True if busy.</value>
+        bool IsBusy { get; }
+
+        /// <summary>
+        /// 	Cancels the current task.
+        /// </summary>
+        void CancelTask();
+
+        /// <summary>
+        /// 	Executes the current task.
+        /// </summary>
+        void ExecuteTask();
+    }
+}
\ No newline at end of file
Added +65 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/IPlugIn.cs b/minisqlquery-master/src/MiniSqlQuery.Core/IPlugIn.cs
new file mode 100644
index 0000000..86215b6
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/IPlugIn.cs
@@ -0,0 +1,65 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	An interface for simple plugins for use in extending Mini SQL Query.
+    /// 	Plugins are loaded from DLL's in the working directory matching the pattern "*.PlugIn.dll"
+    /// </summary>
+    /// <remarks>
+    /// 	<para>Plugins are created during the load process.
+    /// 		After all plugins are loaded they are sorted by the <see cref = "RequestedLoadOrder" /> property.
+    /// 		Next the <see cref = "LoadPlugIn" /> method is called on each in turn supplying a reference to<see cref = "IApplicationServices" />. 
+    /// 		Next the main application form is displayed and after all control creation is complete (i.e. after the Form
+    /// 		Shown event) a call to <see cref = "InitializePlugIn" /> is made for each loaded plugin.
+    /// 		This is where <see cref = "ICommand" /> instances should be created and assigned to buttons, menus etc.
+    /// 		These services provide access to the rest of the editor.
+    /// 		As the main form is closing down, each plugins <see cref = "UnloadPlugIn" /> method is called.</para>
+    /// 	<para>The <see cref = "PluginLoaderBase" /> class can be used to handle the basics of a plugin class to speed development.</para>
+    /// </remarks>
+    public interface IPlugIn
+    {
+        /// <summary>
+        /// 	Gets a brief description of the plugin.
+        /// </summary>
+        /// <value>The plugin description.</value>
+        string PluginDescription { get; }
+
+        /// <summary>
+        /// 	Gets the descriptive name of the plugin.
+        /// </summary>
+        /// <value>The plugin name.</value>
+        string PluginName { get; }
+
+        /// <summary>
+        /// 	Gets the plugin load order. For external plugins start with values over 1000. 
+        /// 	This is a simple way of handling dependencies of other services etc.
+        /// </summary>
+        /// <value>The requested load order.</value>
+        int RequestedLoadOrder { get; }
+
+        /// <summary>
+        /// 	Initializes the plug in, called after the main form is displayed.
+        /// </summary>
+        void InitializePlugIn();
+
+        /// <summary>
+        /// 	Loads the plugin and stores a reference to the service container.
+        /// 	Called at application startup time.
+        /// </summary>
+        /// <param name = "services">The service container, allows access to other serivces in the application.</param>
+        void LoadPlugIn(IApplicationServices services);
+
+        /// <summary>
+        /// 	Called when the plugin is unloading (typically application shutdown).
+        /// </summary>
+        void UnloadPlugIn();
+    }
+}
\ No newline at end of file
Added +24 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/IPrintableContent.cs b/minisqlquery-master/src/MiniSqlQuery.Core/IPrintableContent.cs
new file mode 100644
index 0000000..f6d8373
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/IPrintableContent.cs
@@ -0,0 +1,24 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System.Drawing.Printing;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	If implemented it signals that the class supports printing of the "contents" of the object.
+    /// </summary>
+    public interface IPrintableContent
+    {
+        /// <summary>
+        /// 	Gets the "document" to print (or null if not supported in the current context).
+        /// </summary>
+        /// <value>The print document.</value>
+        PrintDocument PrintDocument { get; }
+    }
+}
\ No newline at end of file
Added +24 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/IQueryBatchProvider.cs b/minisqlquery-master/src/MiniSqlQuery.Core/IQueryBatchProvider.cs
new file mode 100644
index 0000000..8bf6000
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/IQueryBatchProvider.cs
@@ -0,0 +1,24 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	A query batch provider is a class (typically a window) that manages a 
+    /// 	batch query and therefore has a data result etc.
+    /// </summary>
+    public interface IQueryBatchProvider
+    {
+        /// <summary>
+        /// 	Gets a reference to the batch.
+        /// </summary>
+        /// <value>The query batch.</value>
+        QueryBatch Batch { get; }
+    }
+}
\ No newline at end of file
Added +36 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/IQueryEditor.cs b/minisqlquery-master/src/MiniSqlQuery.Core/IQueryEditor.cs
new file mode 100644
index 0000000..559c483
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/IQueryEditor.cs
@@ -0,0 +1,36 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System.Windows.Forms;
+using ICSharpCode.TextEditor.Gui.CompletionWindow;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	The functions of the editing window.
+    /// </summary>
+    public interface IQueryEditor : IPerformTask, IFindReplaceProvider, INavigatableDocument, IQueryBatchProvider, IEditor
+    {
+        /// <summary>
+        /// 	Gets a reference to the actual editor control.
+        /// </summary>
+        /// <value>The editor control.</value>
+        Control EditorControl { get; }
+
+        /// <summary>
+        /// 	Sets the "status" text for the form.
+        /// </summary>
+        /// <param name = "text">The message to appear in the status bar.</param>
+        void SetStatus(string text);
+
+        /// <summary>
+        /// Access to the code completion window.
+        /// </summary>
+        CodeCompletionWindow CodeCompletionWindow { get; set; }
+    }
+}
\ No newline at end of file
Added +23 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/ISupportCursorOffset.cs b/minisqlquery-master/src/MiniSqlQuery.Core/ISupportCursorOffset.cs
new file mode 100644
index 0000000..0bb899e
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/ISupportCursorOffset.cs
@@ -0,0 +1,23 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	A "document" that supports reporting the position of it's cursor.
+    /// </summary>
+    public interface ISupportCursorOffset
+    {
+        /// <summary>
+        /// 	Gets the cursor offset.
+        /// </summary>
+        /// <value>The cursor offset.</value>
+        int CursorOffset { get; }
+    }
+}
\ No newline at end of file
Added +24 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/ITextFindService.cs b/minisqlquery-master/src/MiniSqlQuery.Core/ITextFindService.cs
new file mode 100644
index 0000000..b02cb69
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/ITextFindService.cs
@@ -0,0 +1,24 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	A text finding serice interface. A window can implement this interface and sit will allow searching of its text.
+    /// </summary>
+    public interface ITextFindService
+    {
+        /// <summary>
+        /// 	Finds the next string of text depending on the contrnts of the <paramref name = "request" />.
+        /// </summary>
+        /// <param name = "request">The request.</param>
+        /// <returns>A find request with position updated.</returns>
+        FindTextRequest FindNext(FindTextRequest request);
+    }
+}
\ No newline at end of file
Added +35 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/IViewTable.cs b/minisqlquery-master/src/MiniSqlQuery.Core/IViewTable.cs
new file mode 100644
index 0000000..9d17cd6
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/IViewTable.cs
@@ -0,0 +1,35 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	Interface for viewing table and view data.
+    /// </summary>
+    public interface IViewTable : IPerformTask, IQueryBatchProvider, INavigatableDocument
+    {
+        /// <summary>
+        /// 	Gets a value indicating whether AutoReload.
+        /// </summary>
+        /// <value>The auto reload.</value>
+        bool AutoReload { get; }
+
+        /// <summary>
+        /// 	Gets or sets TableName.
+        /// </summary>
+        /// <value>The table name.</value>
+        string TableName { get; set; }
+
+        /// <summary>
+        /// 	Gets or sets Text of the window, i.e. the table name.
+        /// </summary>
+        /// <value>The text of the window.</value>
+        string Text { get; set; }
+    }
+}
\ No newline at end of file
Added +7 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Migrated rules for MiniSqlQuery.Core (2).ruleset b/minisqlquery-master/src/MiniSqlQuery.Core/Migrated rules for MiniSqlQuery.Core (2).ruleset
new file mode 100644
index 0000000..c90c35b
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Migrated rules for MiniSqlQuery.Core (2).ruleset
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RuleSet Name="Migrated rules for MiniSqlQuery.Core (2).ruleset" Description="This rule set was created from the CodeAnalysisRules property for the &quot;Debug (Any CPU)&quot; configuration in project &quot;C:\Projects\MiniSqlQuery\trunk\MiniSqlQuery.Core\MiniSqlQuery.Core.csproj&quot;." ToolsVersion="10.0">
+  <IncludeAll Action="Warning" />
+  <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">
+    <Rule Id="CA1004" Action="None" />
+  </Rules>
+</RuleSet>
\ No newline at end of file
Added +376 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/MiniSqlQuery.Core.csproj b/minisqlquery-master/src/MiniSqlQuery.Core/MiniSqlQuery.Core.csproj
new file mode 100644
index 0000000..dee3305
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/MiniSqlQuery.Core.csproj
@@ -0,0 +1,376 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{B819CF6A-B5FD-4E85-842D-FD855F856A5A}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>MiniSqlQuery.Core</RootNamespace>
+    <AssemblyName>MiniSqlQuery.Core</AssemblyName>
+    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>MiniSqlQuery.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\Build\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>..\Build\Debug\MiniSqlQuery.Core.XML</DocumentationFile>
+    <RunCodeAnalysis>false</RunCodeAnalysis>
+    <NoWarn>1591</NoWarn>
+    <CodeAnalysisRules>
+    </CodeAnalysisRules>
+    <CodeAnalysisRuleSet>Migrated rules for MiniSqlQuery.Core (2).ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\MiniSqlQuery.Core.xml</DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <NoWarn>1591</NoWarn>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release - No Tests|AnyCPU' ">
+    <OutputPath>bin\Release - No Tests\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>bin\Release\MiniSqlQuery.Core.xml</DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+    <NoWarn>1591</NoWarn>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Web" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="BasicTextFindService.cs" />
+    <Compile Include="BatchProgressEventArgs.cs" />
+    <Compile Include="CommandManager.cs" />
+    <Compile Include="Commands\CancelTaskCommand.cs" />
+    <Compile Include="Commands\CloseActiveWindowCommand.cs" />
+    <Compile Include="Commands\CloseAllWindowsCommand.cs" />
+    <Compile Include="Commands\CommandBase.cs" />
+    <Compile Include="ApplicationServices.cs" />
+    <Compile Include="Commands\CloseDatabaseConnectionCommand.cs" />
+    <Compile Include="Commands\ConvertTextToLowerCaseCommand.cs" />
+    <Compile Include="Commands\ConvertTextToTitleCaseCommand.cs" />
+    <Compile Include="Commands\ConvertTextToUpperCaseCommand.cs" />
+    <Compile Include="Commands\CopyQueryEditorFileNameCommand.cs" />
+    <Compile Include="Commands\DisplayDbModelDependenciesCommand.cs" />
+    <Compile Include="Commands\EmailAuthorCommand.cs" />
+    <Compile Include="Commands\ExecuteTaskCommand.cs" />
+    <Compile Include="Commands\ExitApplicationCommand.cs" />
+    <Compile Include="Commands\GenerateCommandCodeCommand.cs" />
+    <Compile Include="Commands\InsertGuidCommand.cs" />
+    <Compile Include="Commands\NewQueryFormCommand.cs" />
+    <Compile Include="Commands\OpenConnectionFileCommand.cs" />
+    <Compile Include="Commands\PasteAroundSelectionCommand.cs" />
+    <Compile Include="Commands\PrintCommand.cs" />
+    <Compile Include="Commands\RefreshDatabaseConnectionCommand.cs" />
+    <Compile Include="Commands\SetLeftPasteAroundSelectionCommand.cs" />
+    <Compile Include="Commands\SetRightPasteAroundSelectionCommand.cs" />
+    <Compile Include="Commands\ShowHelpCommand.cs" />
+    <Compile Include="Commands\ShowUrlCommand.cs" />
+    <Compile Include="Commands\ShowWebPageCommand.cs" />
+    <Compile Include="Controls\BatchQuerySelectControl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Controls\BatchQuerySelectControl.Designer.cs">
+      <DependentUpon>BatchQuerySelectControl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Controls\ExceptionControl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Controls\ExceptionControl.Designer.cs">
+      <DependentUpon>ExceptionControl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Controls\PluginListControl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Controls\PluginListControl.Designer.cs">
+      <DependentUpon>PluginListControl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="DatabaseMetaDataService.cs" />
+    <Compile Include="DbModel\DbModelConstraint.cs" />
+    <Compile Include="DbModel\DbModelDependencyWalker.cs" />
+    <Compile Include="DbModel\DbModelForeignKeyReference.cs" />
+    <Compile Include="DbModel\DbModelObjectBase.cs" />
+    <Compile Include="DbModel\DbModelInstance.cs" />
+    <Compile Include="DbModel\DbModelColumn.cs" />
+    <Compile Include="DbConnectionDefinition.cs" />
+    <Compile Include="DbConnectionDefinitionList.cs" />
+    <Compile Include="DbModel\DbModelTable.cs" />
+    <Compile Include="DbModel\DbModelType.cs" />
+    <Compile Include="DbModel\DbModelView.cs" />
+    <Compile Include="DbModel\GenericSchemaService.cs" />
+    <Compile Include="DbModel\ISqlWriter.cs" />
+    <Compile Include="DbModel\OleDbSchemaService.cs" />
+    <Compile Include="DbModel\OracleSchemaService.cs" />
+    <Compile Include="DbModel\SqlCeSchemaService.cs" />
+    <Compile Include="DbModel\SqlClientSchemaService.cs" />
+    <Compile Include="DbModel\SqlWriter.cs" />
+    <Compile Include="FileEditorDescriptor.cs" />
+    <Compile Include="FileEditorResolverService.cs" />
+    <Compile Include="Forms\BatchQuerySelectForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Forms\BatchQuerySelectForm.Designer.cs">
+      <DependentUpon>BatchQuerySelectForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="IApplicationServices.cs" />
+    <Compile Include="ICompletionProvider.cs" />
+    <Compile Include="IDatabaseSchemaService.cs" />
+    <Compile Include="IEditor.cs" />
+    <Compile Include="IFileEditorResolver.cs" />
+    <Compile Include="IFindReplaceProvider.cs" />
+    <Compile Include="FindReplaceTextRequest.cs" />
+    <Compile Include="IApplicationSettings.cs" />
+    <Compile Include="ICommand.cs" />
+    <Compile Include="IDatabaseInspector.cs" />
+    <Compile Include="IFindReplaceWindow.cs" />
+    <Compile Include="IHostWindow.cs" />
+    <Compile Include="ImageResource.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>ImageResource.resx</DependentUpon>
+    </Compile>
+    <Compile Include="IDbModelNamedObject.cs" />
+    <Compile Include="IMostRecentFilesService.cs" />
+    <Compile Include="INavigatableDocument.cs" />
+    <Compile Include="IPerformTask.cs" />
+    <Compile Include="IPlugIn.cs" />
+    <Compile Include="IPrintableContent.cs" />
+    <Compile Include="IQueryBatchProvider.cs" />
+    <Compile Include="IQueryEditor.cs" />
+    <Compile Include="CommandControlBuilder.cs" />
+    <Compile Include="IConfigurationObject.cs" />
+    <Compile Include="ISupportCursorOffset.cs" />
+    <Compile Include="ITextFindService.cs" />
+    <Compile Include="IViewTable.cs" />
+    <Compile Include="MostRecentFilesChangedEventArgs.cs" />
+    <Compile Include="MostRecentFilesService.cs" />
+    <Compile Include="NotifyPropertyChangedBase.cs" />
+    <Compile Include="ObjectTypes.cs" />
+    <Compile Include="PlugInComparer.cs" />
+    <Compile Include="PluginLoaderBase.cs" />
+    <Compile Include="PlugInUtility.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="Query.cs" />
+    <Compile Include="QueryBatch.cs" />
+    <Compile Include="QueryRunner.cs" />
+    <Compile Include="SqlQueryRunner.cs" />
+    <Compile Include="StringWriterWithEncoding.cs" />
+    <Compile Include="SystemMessage.cs" />
+    <Compile Include="SystemMessageEventArgs.cs" />
+    <Compile Include="Template\NVelocityWrapper.cs" />
+    <Compile Include="Template\TemplateException.cs" />
+    <Compile Include="Template\TextFormatter.cs" />
+    <Compile Include="Utility.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="DefaultConnectionDefinitionFile.xml" />
+    <Content Include="Images\accept.png" />
+    <None Include="Images\add.png" />
+    <Content Include="Images\App.ico" />
+    <Content Include="Images\ApplicationIcon.png" />
+    <Content Include="Images\around_text.png" />
+    <Content Include="Images\cancel.png" />
+    <Content Include="Images\cog.png" />
+    <None Include="Images\column.png" />
+    <None Include="Images\comments.png" />
+    <None Include="Images\key_disabled.png" />
+    <None Include="Images\key_go_disabled.png" />
+    <Content Include="Images\column_row_version.png" />
+    <Content Include="Images\cross.png" />
+    <Content Include="Images\database.png" />
+    <Content Include="Images\database_add.png" />
+    <Content Include="Images\database_delete.png" />
+    <Content Include="Images\database_edit.ico" />
+    <Content Include="Images\database_edit.png" />
+    <Content Include="Images\database_error.png" />
+    <Content Include="Images\database_refresh.png" />
+    <Content Include="Images\disconnect.ico" />
+    <Content Include="Images\disconnect.png" />
+    <Content Include="Images\disk.png" />
+    <Content Include="Images\disk_multiple.png" />
+    <Content Include="Images\email.png" />
+    <Content Include="Images\email_go.png" />
+    <None Include="Images\feed.png" />
+    <None Include="Images\exclamation.png" />
+    <None Include="Images\error.png" />
+    <Content Include="Images\find.png" />
+    <None Include="Images\folder_bug.png" />
+    <Content Include="Images\folder_page.png" />
+    <None Include="Images\help.png" />
+    <None Include="Images\house.png" />
+    <None Include="Images\information.png" />
+    <None Include="Images\key.png" />
+    <Content Include="Images\key_go.png" />
+    <Content Include="Images\lightning.png" />
+    <Content Include="Images\page.png" />
+    <Content Include="Images\page_white.png" />
+    <None Include="Images\page_white_csharp.png" />
+    <Content Include="Images\plugin.png" />
+    <Content Include="Images\plugin_go.png" />
+    <Content Include="Images\plugin_link.png" />
+    <None Include="Images\printer.png" />
+    <Content Include="Images\script.png" />
+    <Content Include="Images\script_code.png" />
+    <None Include="Images\stop.png" />
+    <None Include="Images\server.png" />
+    <None Include="Images\server_add.png" />
+    <None Include="Images\server_connect.png" />
+    <None Include="Images\server_database.png" />
+    <None Include="Images\server_delete.png" />
+    <None Include="Images\server_edit.png" />
+    <None Include="Images\server_error.png" />
+    <Content Include="Images\table.png" />
+    <None Include="Images\table_add.png" />
+    <Content Include="Images\table_delete.png" />
+    <None Include="Images\table_edit.png" />
+    <None Include="Images\table_error.png" />
+    <None Include="Images\table_gear.png" />
+    <Content Include="Images\table_go.png" />
+    <None Include="Images\table_key.png" />
+    <None Include="Images\table_row_insert.png" />
+    <None Include="Images\table_row_delete.png" />
+    <None Include="Images\table_relationship.png" />
+    <None Include="Images\table_refresh.png" />
+    <None Include="Images\table_multiple.png" />
+    <None Include="Images\table_link.png" />
+    <None Include="Images\table_lightning.png" />
+    <Content Include="Images\table_save.png" />
+    <None Include="Images\wrench.png" />
+    <None Include="Images\world_link.png" />
+    <None Include="Images\view_multiple.png" />
+    <None Include="Images\tick.png" />
+    <None Include="Images\wrench_orange.png" />
+    <None Include="Images\view.png" />
+    <None Include="Images\table_sort.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Controls\BatchQuerySelectControl.resx">
+      <DependentUpon>BatchQuerySelectControl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Controls\ExceptionControl.resx">
+      <DependentUpon>ExceptionControl.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Controls\PluginListControl.resx">
+      <DependentUpon>PluginListControl.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Forms\BatchQuerySelectForm.resx">
+      <DependentUpon>BatchQuerySelectForm.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ImageResource.resx">
+      <Generator>PublicResXFileCodeGenerator</Generator>
+      <LastGenOutput>ImageResource.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>PublicResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Migrated rules for MiniSqlQuery.Core %282%29.ruleset" />
+    <None Include="MiniSqlQuery.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <PackageReference Include="DockPanelSuite">
+      <Version>2.9.0</Version>
+    </PackageReference>
+    <PackageReference Include="ICSharpCode.TextEditor">
+      <Version>3.2.1.6466</Version>
+    </PackageReference>
+    <PackageReference Include="Ninject">
+      <Version>3.3.4</Version>
+    </PackageReference>
+    <PackageReference Include="NVelocity">
+      <Version>1.2.0</Version>
+    </PackageReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
Added +0 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/MiniSqlQuery.snk b/minisqlquery-master/src/MiniSqlQuery.Core/MiniSqlQuery.snk
new file mode 100644
index 0000000..9b2560f
Binary files /dev/null and b/minisqlquery-master/src/MiniSqlQuery.Core/MiniSqlQuery.snk differ
Added +18 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/MostRecentFilesChangedEventArgs.cs b/minisqlquery-master/src/MiniSqlQuery.Core/MostRecentFilesChangedEventArgs.cs
new file mode 100644
index 0000000..d06d30c
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/MostRecentFilesChangedEventArgs.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	A system wide message event.
+    /// </summary>
+    public class MostRecentFilesChangedEventArgs : EventArgs
+    {
+        public MostRecentFilesChangedEventArgs(ICollection<string> filenames)
+        {
+            Filenames = filenames;
+        }
+
+        public ICollection<string> Filenames { get; private set; }
+    }
+}
\ No newline at end of file
Added +83 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/MostRecentFilesService.cs b/minisqlquery-master/src/MiniSqlQuery.Core/MostRecentFilesService.cs
new file mode 100644
index 0000000..dedcddb
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/MostRecentFilesService.cs
@@ -0,0 +1,83 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+
+namespace MiniSqlQuery.Core
+{
+    public class MostRecentFilesService : IMostRecentFilesService
+    {
+        private readonly List<string> _filenames;
+
+        public MostRecentFilesService()
+        {
+            _filenames = new List<string>();
+        }
+
+        public event EventHandler<MostRecentFilesChangedEventArgs> MostRecentFilesChanged;
+
+        public IList<string> Filenames
+        {
+            get { return _filenames; }
+        }
+
+        public void OnMostRecentFilesChanged(MostRecentFilesChangedEventArgs e)
+        {
+            var handler = MostRecentFilesChanged;
+            if (handler != null)
+            {
+                handler(this, e);
+            }
+        }
+
+        public void Register(string filename)
+        {
+            if (!_filenames.Contains(filename))
+            {
+                _filenames.Insert(0, filename);
+            }
+            else
+            {
+                // move to top of list
+                if (_filenames.Count > 1)
+                {
+                    _filenames.Remove(filename);
+                    _filenames.Insert(0, filename);
+                }
+            }
+
+            // enure the list is capped
+            while (_filenames.Count > MaxCommands)
+            {
+                _filenames.RemoveAt(_filenames.Count - 1);
+            }
+
+            NotifyListenersOfChange();
+        }
+
+        public void Remove(string filename)
+        {
+            if (_filenames.Contains(filename))
+            {
+                _filenames.Remove(filename);
+            }
+            NotifyListenersOfChange();
+        }
+
+        public int MaxCommands
+        {
+            get { return 10; }
+        }
+
+        protected void NotifyListenersOfChange()
+        {
+            OnMostRecentFilesChanged(new MostRecentFilesChangedEventArgs(_filenames));
+        }
+    }
+}
\ No newline at end of file
Added +49 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/NotifyPropertyChangedBase.cs b/minisqlquery-master/src/MiniSqlQuery.Core/NotifyPropertyChangedBase.cs
new file mode 100644
index 0000000..a23bd5b
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/NotifyPropertyChangedBase.cs
@@ -0,0 +1,49 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System.ComponentModel;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	The notify property changed base class.
+    /// </summary>
+    public abstract class NotifyPropertyChangedBase : INotifyPropertyChanged
+    {
+        /// <summary>
+        /// 	The property changed event, fired when a propety is modified.
+        /// </summary>
+        public virtual event PropertyChangedEventHandler PropertyChanged;
+
+        /// <summary>
+        /// 	The on property changed method (by property name).
+        /// </summary>
+        /// <param name = "propertyName">The property name that has been modified.</param>
+        protected void OnPropertyChanged(string propertyName)
+        {
+            PropertyChangedEventHandler changed = PropertyChanged;
+            if (changed != null)
+            {
+                changed(this, new PropertyChangedEventArgs(propertyName));
+            }
+        }
+
+        /// <summary>
+        /// 	The on property changed method.
+        /// </summary>
+        /// <param name = "e">The events.</param>
+        protected void OnPropertyChanged(PropertyChangedEventArgs e)
+        {
+            PropertyChangedEventHandler changed = PropertyChanged;
+            if (changed != null)
+            {
+                changed(this, e);
+            }
+        }
+    }
+}
\ No newline at end of file
Added +32 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/ObjectTypes.cs b/minisqlquery-master/src/MiniSqlQuery.Core/ObjectTypes.cs
new file mode 100644
index 0000000..4762dbc
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/ObjectTypes.cs
@@ -0,0 +1,32 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	The object types.
+    /// </summary>
+    public class ObjectTypes
+    {
+        /// <summary>
+        /// 	A column type.
+        /// </summary>
+        public const string Column = "Column";
+
+        /// <summary>
+        /// 	A table type.
+        /// </summary>
+        public const string Table = "Table";
+
+        /// <summary>
+        /// 	A view type.
+        /// </summary>
+        public const string View = "View";
+    }
+}
\ No newline at end of file
Added +51 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/PlugInComparer.cs b/minisqlquery-master/src/MiniSqlQuery.Core/PlugInComparer.cs
new file mode 100644
index 0000000..f06e796
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/PlugInComparer.cs
@@ -0,0 +1,51 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System.Collections.Generic;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	Used for sorting plugins at load time, a very simple ordering system for the plugins.
+    /// </summary>
+    public class PlugInComparer : IComparer<IPlugIn>
+    {
+        /// <summary>
+        /// 	Orders two plugin classes.
+        /// </summary>
+        /// <param name = "x">The left side object.</param>
+        /// <param name = "y">The right side object.</param>
+        /// <returns>The compare result.</returns>
+        public int Compare(IPlugIn x, IPlugIn y)
+        {
+            int result;
+
+            if (x == null && y == null)
+            {
+                result = 0;
+            }
+            else if (y == null)
+            {
+                result = -1;
+            }
+            else if (x == null)
+            {
+                result = 1;
+            }
+            else
+            {
+                int numX = x.RequestedLoadOrder;
+                int numY = y.RequestedLoadOrder;
+
+                result = numX - numY;
+            }
+
+            return result;
+        }
+    }
+}
\ No newline at end of file
Added +96 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/PluginLoaderBase.cs b/minisqlquery-master/src/MiniSqlQuery.Core/PluginLoaderBase.cs
new file mode 100644
index 0000000..79edeca
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/PluginLoaderBase.cs
@@ -0,0 +1,96 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	A simple base class to use for implementing the <see cref = "IPlugIn" /> interface.
+    /// </summary>
+    public abstract class PluginLoaderBase : IPlugIn
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "PluginLoaderBase" /> class. Creates a new instance of a plugin loader class.
+        /// </summary>
+        /// <param name = "name">The descriptive name of the plugin</param>
+        /// <param name = "description">A brief description of the plugin.</param>
+        /// <remarks>
+        /// 	The <see cref = "RequestedLoadOrder" /> defaults to 1000.
+        /// </remarks>
+        protected PluginLoaderBase(string name, string description)
+            : this(name, description, 1000)
+        {
+        }
+
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "PluginLoaderBase" /> class. Creates a new instance of a plugin loader class.
+        /// </summary>
+        /// <param name = "name">The descriptive name of the plugin</param>
+        /// <param name = "description">A brief description of the plugin.</param>
+        /// <param name = "requestedLoadOrder">The requested load order. See <see cref = "IPlugIn.RequestedLoadOrder" />.</param>
+        protected PluginLoaderBase(string name, string description, int requestedLoadOrder)
+        {
+            PluginName = name;
+            PluginDescription = description;
+            RequestedLoadOrder = requestedLoadOrder;
+        }
+
+        /// <summary>
+        /// 	Gets a brief description of the plugin.
+        /// </summary>
+        /// <value>The plugin description.</value>
+        public string PluginDescription { get; private set; }
+
+        /// <summary>
+        /// 	Gets the descriptive name of the plugin.
+        /// </summary>
+        /// <value>The plugin name.</value>
+        public string PluginName { get; private set; }
+
+        /// <summary>
+        /// 	Gets the "order" value for a lame ordering system. 
+        ///		TODO: needs to be replaced with Windsor containter etc.
+        /// </summary>
+        /// <value>The requested load order.</value>
+        public int RequestedLoadOrder { get; private set; }
+
+        /// <summary>
+        /// 	Gets a reference to the applications service manager.
+        /// </summary>
+        /// <value>The services.</value>
+        public IApplicationServices Services { get; private set; }
+
+        /// <summary>
+        /// 	Must be implemented by the inheriting class. 
+        /// 	Called after the application has started.
+        /// </summary>
+        public abstract void InitializePlugIn();
+
+        /// <summary>
+        /// 	Called when the plugins are loading during application startup. 
+        /// 	Stores the reference to <paramref name = "services" />.
+        /// </summary>
+        /// <param name = "services">The application services intance.</param>
+        public void LoadPlugIn(IApplicationServices services)
+        {
+            Services = services;
+        }
+
+        /// <summary>
+        /// 	Called as the application is shutting down.
+        /// </summary>
+        /// <remarks>
+        /// 	In most cases there is probably no need to do anything here, all controls etc created
+        /// 	will be disposed of implicitly. It would only be unmanaged references created explicitly
+        /// 	by the plugin that would need removal or cleanup.
+        /// </remarks>
+        public virtual void UnloadPlugIn()
+        {
+        }
+    }
+}
\ No newline at end of file
Added +68 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/PlugInUtility.cs b/minisqlquery-master/src/MiniSqlQuery.Core/PlugInUtility.cs
new file mode 100644
index 0000000..413821c
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/PlugInUtility.cs
@@ -0,0 +1,68 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	Helper class for loading external plugins.
+    /// </summary>
+    public class PlugInUtility
+    {
+        /// <summary>
+        /// 	Search <paramref name = "baseDir" /> for files that match the pattern <paramref name = "searchPattern" />
+        /// 	and return an array of instances.
+        /// </summary>
+        /// <returns>An array of instances of the plugins found.</returns>
+        /// <typeparam name = "T">The type (interface or class) to find instances of.</typeparam>
+        /// <param name = "baseDir">The search base.</param>
+        /// <param name = "searchPattern">Search pattern, e.g. "*.dll".</param>
+        public static T[] GetInstances<T>(string baseDir, string searchPattern)
+        {
+            var tmpInstances = new List<T>();
+            Assembly pluginAssembly;
+
+            try
+            {
+                // perform the file search
+                string[] files = Directory.GetFiles(baseDir, searchPattern, SearchOption.TopDirectoryOnly);
+
+                // load each asembly and inspect for instances of T
+                foreach (string file in files)
+                {
+                    pluginAssembly = Assembly.LoadFrom(file);
+                    Type[] assemblyTypes = pluginAssembly.GetTypes();
+
+                    // check each assembly to se it it implements the interface T
+                    foreach (Type assemblyType in assemblyTypes)
+                    {
+                        Type instanceType = assemblyType.GetInterface(typeof(T).FullName);
+                        if (instanceType != null)
+                        {
+                            // this instance type matches T, create an instance of the class and add it to the list
+                            tmpInstances.Add((T)Activator.CreateInstance(assemblyType));
+                        }
+                    }
+                }
+            }
+            catch (TargetInvocationException exp)
+            {
+                if (exp.InnerException != null)
+                {
+                    throw exp.InnerException;
+                }
+            }
+
+            return tmpInstances.ToArray();
+        }
+    }
+}
\ No newline at end of file
Added +16 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Properties/AssemblyInfo.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..56152c5
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Properties/AssemblyInfo.cs
@@ -0,0 +1,16 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Reflection;
+
+[assembly: AssemblyTitle("Mini SQL Query Core Services and Interfaces")]
+[assembly: AssemblyDescription("A Mini SQL Query Core interfaces and classes.")]
+[assembly: AssemblyProduct("MiniSqlQuery.Core")]
+[assembly: AssemblyVersion("1.19.11.03")]
+[assembly: AssemblyFileVersion("1.19.11.03")]
+
+// see also CommonAssemblyInfo.cs 
Added +100 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Properties/Resources.Designer.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..2c0445b
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Properties/Resources.Designer.cs
@@ -0,0 +1,100 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace MiniSqlQuery.Core.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    public class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        public static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MiniSqlQuery.Core.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        public static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
+        ///
+        ///&lt;DbConnectionDefinitionList xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot;&gt;
+        ///	&lt;Definitions&gt;
+        ///		&lt;DbConnectionDefinition&gt;
+        ///			&lt;Name&gt;Default - MSSQL Master@localhost&lt;/Name&gt;
+        ///			&lt;ProviderName&gt;System.Data.SqlClient&lt;/ProviderName&gt;
+        ///			&lt;ConnectionString&gt;Server=.; Database=master; Integrated Security=SSPI&lt;/ConnectionString&gt;
+        ///		&lt;/DbConnectionDefinition&gt;
+        ///		&lt;DbConnectionDefinition&gt;
+        ///			&lt;Name&gt;Sample MSSQL Northwind SQL Expres [rest of string was truncated]&quot;;.
+        /// </summary>
+        public static string DefaultConnectionDefinitionFile {
+            get {
+                return ResourceManager.GetString("DefaultConnectionDefinitionFile", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Mini SQLQuery.
+        /// </summary>
+        public static string FriendlyAppTitle {
+            get {
+                return ResourceManager.GetString("FriendlyAppTitle", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to MiniSqlQuery.
+        /// </summary>
+        public static string ShortAppTitle {
+            get {
+                return ResourceManager.GetString("ShortAppTitle", resourceCulture);
+            }
+        }
+    }
+}
Added +130 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Properties/Resources.resx b/minisqlquery-master/src/MiniSqlQuery.Core/Properties/Resources.resx
new file mode 100644
index 0000000..6089ada
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Properties/Resources.resx
@@ -0,0 +1,130 @@
+<?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>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="DefaultConnectionDefinitionFile" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\defaultconnectiondefinitionfile.xml;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
+  </data>
+  <data name="FriendlyAppTitle" xml:space="preserve">
+    <value>Mini SQLQuery</value>
+  </data>
+  <data name="ShortAppTitle" xml:space="preserve">
+    <value>MiniSqlQuery</value>
+  </data>
+</root>
\ No newline at end of file
Added +52 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Query.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Query.cs
new file mode 100644
index 0000000..b4c10fb
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Query.cs
@@ -0,0 +1,52 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+using System.Data;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	Represents an SQL query, some timings and the result (if executed).
+    /// </summary>
+    public class Query
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "Query" /> class.
+        /// </summary>
+        /// <param name = "sql">The SQL for the query.</param>
+        public Query(string sql)
+        {
+            Sql = sql;
+        }
+
+        /// <summary>
+        /// 	Gets or sets the end time.
+        /// </summary>
+        /// <value>The end time.</value>
+        public DateTime EndTime { get; set; }
+
+        /// <summary>
+        /// 	Gets or sets the result.
+        /// </summary>
+        /// <value>The result.</value>
+        public DataSet Result { get; set; }
+
+        /// <summary>
+        /// 	Gets the SQL query text.
+        /// </summary>
+        /// <value>The SQL query text.</value>
+        public string Sql { get; private set; }
+
+        /// <summary>
+        /// 	Gets or sets the start time.
+        /// </summary>
+        /// <value>The start time.</value>
+        public DateTime StartTime { get; set; }
+    }
+}
\ No newline at end of file
Added +125 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/QueryBatch.cs b/minisqlquery-master/src/MiniSqlQuery.Core/QueryBatch.cs
new file mode 100644
index 0000000..9c46bba
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/QueryBatch.cs
@@ -0,0 +1,125 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text.RegularExpressions;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	The query batch class represents a series of SQL statements to execute against a database.
+    /// </summary>
+    public class QueryBatch
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "QueryBatch" /> class.
+        /// 	A singular batch query.
+        /// </summary>
+        /// <param name = "sql">The SQL to create a single query from.</param>
+        /// <seealso cref="Parse"/>
+        public QueryBatch(string sql)
+            : this()
+        {
+            // OriginalSql = sql;
+            Add(new Query(sql));
+        }
+
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "QueryBatch" /> class.
+        /// </summary>
+        public QueryBatch()
+        {
+            Queries = new List<Query>();
+        }
+
+        /// <summary>
+        /// 	Gets or sets the end time of the batch.
+        /// </summary>
+        /// <value>The end time.</value>
+        public DateTime EndTime { get; set; }
+
+        /// <summary>
+        /// 	Gets or sets Messages.
+        /// </summary>
+        /// <value>The messages.</value>
+        public string Messages { get; set; }
+
+        /// <summary>
+        /// 	Gets the query list for this batch.
+        /// </summary>
+        /// <value>The queries.</value>
+        public List<Query> Queries { get; private set; }
+
+        /// <summary>
+        /// 	Gets or sets the start time of the batch.
+        /// </summary>
+        /// <value>The start time.</value>
+        public DateTime StartTime { get; set; }
+
+        /// <summary>
+        /// 	Parses an <paramref name="sql"/> string creating a <see cref="QueryBatch"/> as a result.
+        ///		If query batching is enabled, the <paramref name="sql"/> string is split into multiple <see cref="Query"/> objects.
+        /// </summary>
+        /// <param name = "sql">The SQL string.</param>
+        /// <returns>A <see cref="QueryBatch"/> object with 0, 1 or many <see cref="Query"/> objects.</returns>
+        public static QueryBatch Parse(string sql)
+        {
+            var batch = new QueryBatch();
+
+            // exit if nothing to do
+            if (sql == null || sql.Trim().Length == 0)
+            {
+                return batch;
+            }
+
+            foreach (string sqlPart in SplitByBatchIndecator(sql, "GO").Where(sqlPart => !string.IsNullOrEmpty(sqlPart)))
+            {
+                batch.Add(new Query(sqlPart));
+            }
+
+            return batch;
+        }
+
+        /// <summary>
+        /// 	Adds a query to this batch.
+        /// </summary>
+        /// <param name = "query">The query.</param>
+        public void Add(Query query)
+        {
+            Queries.Add(query);
+        }
+
+        /// <summary>
+        /// 	Clears all queries in this batch.
+        /// </summary>
+        public void Clear()
+        {
+            Queries.Clear();
+        }
+
+        /// <summary>
+        /// 	Splits a <paramref name="script"/> by the <paramref name="batchIndicator"/>, typically "GO".
+        ///		The batch indicator needs to be on a line by itself.
+        /// </summary>
+        /// <param name = "script">The SQL script.</param>
+        /// <param name = "batchIndicator">The batch indicator, e.g. "GO".</param>
+        /// <returns>An enumerable list of stings.</returns>
+        private static IEnumerable<string> SplitByBatchIndecator(string script, string batchIndicator)
+        {
+            string pattern = string.Concat("^\\s*", batchIndicator, "\\s*$");
+            RegexOptions options = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline;
+
+            foreach (string batch in Regex.Split(script, pattern, options))
+            {
+                yield return batch.Trim();
+            }
+        }
+    }
+}
\ No newline at end of file
Added +321 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/QueryRunner.cs b/minisqlquery-master/src/MiniSqlQuery.Core/QueryRunner.cs
new file mode 100644
index 0000000..b7c5438
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/QueryRunner.cs
@@ -0,0 +1,321 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+using System.Data;
+using System.Data.Common;
+using System.Data.SqlClient;
+using System.Diagnostics;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	Helper class to encapsulate query execution
+    /// </summary>
+    public class QueryRunner
+    {
+        /// <summary>
+        /// 	The connection string value.
+        /// </summary>
+        private readonly string _connectionString;
+
+        /// <summary>
+        /// 	The enable query batching value.
+        /// </summary>
+        private readonly bool _enableQueryBatching;
+
+        private readonly int _commandTimeout;
+
+        /// <summary>
+        /// 	The provider factory.
+        /// </summary>
+        private readonly DbProviderFactory _factory;
+
+        private DbCommand _command;
+
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "QueryRunner" /> class.
+        /// </summary>
+        /// <param name = "factory">The factory.</param>
+        /// <param name = "connectionString">The connection string.</param>
+        /// <param name = "enableQueryBatching">The enable query batching.</param>
+        /// <param name="commandTimeout"></param>
+        public QueryRunner(DbProviderFactory factory, string connectionString, bool enableQueryBatching, int commandTimeout)
+        {
+            _factory = factory;
+            _connectionString = connectionString;
+            _enableQueryBatching = enableQueryBatching;
+            _commandTimeout = commandTimeout;
+            Messages = string.Empty;
+        }
+
+        /// <summary>
+        /// 	The batch progress.
+        /// </summary>
+        public event EventHandler<BatchProgressEventArgs> BatchProgress;
+
+        /// <summary>
+        /// 	Gets or sets the <see cref="QueryBatch"/> for this query.
+        /// </summary>
+        /// <value>The query batch.</value>
+        public QueryBatch Batch { get; protected set; }
+
+        /// <summary>
+        /// 	Gets or sets Exception if any.
+        /// </summary>
+        /// <value>The exception.</value>
+        public DbException Exception { get; protected set; }
+
+        /// <summary>
+        /// 	Gets or sets a value indicating whether the query runner is busy.
+        /// </summary>
+        /// <value>The is busy value.</value>
+        public bool IsBusy { get; set; }
+
+        /// <summary>
+        /// 	Gets or sets the messages if any.
+        /// </summary>
+        /// <value>The messages.</value>
+        public string Messages { get; protected set; }
+
+        /// <summary>
+        /// Creates an instance of a query runner for the specified database.
+        /// </summary>
+        /// <param name="factory">The factory.</param>
+        /// <param name="connectionString">The connection string.</param>
+        /// <param name="enableQueryBatching">The enable query batching.</param>
+        /// <param name="commandTimeout">The command timeout.</param>
+        /// <returns>
+        /// A <see cref="QueryRunner"/> instance acording to the parameters.
+        /// </returns>
+        /// <remarks>
+        /// 	<example>
+        /// var runner = QueryRunner.Create(DbProviderFactories.GetFactory("System.Data.SqlClient"), connStr, true);
+        /// runner.ExecuteQuery("select * from Employees\r\nGO\r\nSelect * from Products");
+        /// // runner.Batch.Queries.Count == 2 //
+        /// </example>
+        /// </remarks>
+        public static QueryRunner Create(DbProviderFactory factory, string connectionString, bool enableQueryBatching, int commandTimeout)
+        {
+            if (factory.GetType().Name == "SqlClientFactory")
+            {
+                return new SqlQueryRunner(factory, connectionString, enableQueryBatching, commandTimeout);
+            }
+
+            // otherwise ise the default
+            return new QueryRunner(factory, connectionString, enableQueryBatching, commandTimeout);
+        }
+
+        /// <summary>
+        /// 	Tests the database connection using the specified provider.
+        /// </summary>
+        /// <param name = "providerName">Name of the provider.</param>
+        /// <param name = "connectionString">The connection string.</param>
+        /// <returns>If the connection was successful, null; otherwise the exception object.</returns>
+        public static Exception TestDbConnection(string providerName, string connectionString)
+        {
+            try
+            {
+                DbProviderFactory factory = DbProviderFactories.GetFactory(providerName);
+                using (DbConnection connection = factory.CreateConnection())
+                {
+                    connection.ConnectionString = connectionString;
+                    connection.Open();
+                    if (connection.State == ConnectionState.Open)
+                    {
+                        return null;
+                    }
+                }
+            }
+            catch (Exception e)
+            {
+                return e;
+            }
+
+            throw new InvalidOperationException("Connection test failed");
+        }
+
+        /// <summary>
+        /// 	Executes the <paramref name = "sql" /> query.
+        /// </summary>
+        /// <param name = "sql">The SQL to execute.</param>
+        public void ExecuteQuery(string sql)
+        {
+            ValidateState();
+
+            DbConnection dbConnection = null;
+            DbDataAdapter adapter = null;
+            _command = null;
+            Query query;
+
+            // In the case of connection errors the error messages were getting lost, provide a default batch object:
+            Batch = new QueryBatch(sql);
+
+            try
+            {
+                IsBusy = true;
+
+                dbConnection = _factory.CreateConnection();
+                dbConnection.ConnectionString = _connectionString;
+                dbConnection.Open();
+
+                Messages = string.Empty;
+                SubscribeToMessages(dbConnection);
+
+                if (_enableQueryBatching)
+                {
+                    Batch = QueryBatch.Parse(sql);
+                }
+                else
+                {
+                    Batch = new QueryBatch(sql);
+                }
+
+                Batch.StartTime = DateTime.Now;
+                adapter = _factory.CreateDataAdapter();
+                _command = dbConnection.CreateCommand();
+                _command.CommandType = CommandType.Text;
+                SetCommandTimeout(_command, _commandTimeout);
+                adapter.SelectCommand = _command;
+
+                int queryCount = Batch.Queries.Count;
+                for (int i = 0; i < queryCount; i++)
+                {
+                    query = Batch.Queries[i];
+                    _command.CommandText = query.Sql;
+                    query.Result = new DataSet("Batch " + (i + 1));
+                    query.StartTime = DateTime.Now;
+                    adapter.Fill(query.Result);
+                    query.EndTime = DateTime.Now;
+                    OnBatchProgress(new BatchProgressEventArgs(query, queryCount, i + 1));
+                }
+            }
+            catch (DbException dbException)
+            {
+                HandleBatchException(dbException);
+            }
+            finally
+            {
+                if (Batch != null)
+                {
+                    Batch.EndTime = DateTime.Now;
+                }
+
+                if (adapter != null)
+                {
+                    adapter.Dispose();
+                }
+
+                if (_command != null)
+                {
+                    _command.Dispose();
+                }
+
+                IsBusy = false;
+                UnsubscribeFromMessages(dbConnection);
+            }
+
+            if (Batch != null)
+            {
+                Batch.Messages = Messages;
+            }
+        }
+
+        /// <summary>
+        /// Cancel the executing command (if busy).
+        /// </summary>
+        /// <remarks>
+        /// Note that this relies on the implementation of the DbCommand.Cancel operation.
+        /// </remarks>
+	    public void Cancel()
+        {
+            if (IsBusy && _command != null)
+            {
+                _command.Cancel();
+            }
+        }
+
+        /// <summary>
+        /// Sets the command timeout, currently only tested against MSSQL.
+        /// </summary>
+        /// <param name="cmd">The command.</param>
+        /// <param name="commandTimeout">The command timeout.</param>
+        private void SetCommandTimeout(IDbCommand cmd, int commandTimeout)
+        {
+            if (_factory is SqlClientFactory)
+            {
+                if (cmd == null)
+                {
+                    throw new ArgumentNullException("cmd");
+                }
+                cmd.CommandTimeout = commandTimeout;
+            }
+            else
+            {
+                Trace.WriteLine("Command Timeout only supported by SQL Client (so far)");
+            }
+        }
+
+        /// <summary>
+        /// 	The handle batch exception.
+        /// </summary>
+        /// <param name = "dbException">The db exception.</param>
+        protected virtual void HandleBatchException(DbException dbException)
+        {
+            Exception = dbException;
+            Messages += dbException.Message + Environment.NewLine;
+        }
+
+        /// <summary>
+        /// 	The on batch progress.
+        /// </summary>
+        /// <param name = "e">The events.</param>
+        protected void OnBatchProgress(BatchProgressEventArgs e)
+        {
+            EventHandler<BatchProgressEventArgs> progress = BatchProgress;
+            if (progress != null)
+            {
+                progress(this, e);
+            }
+        }
+
+        /// <summary>
+        /// 	The subscribe to messages.
+        /// </summary>
+        /// <param name = "connection">The connection.</param>
+        protected virtual void SubscribeToMessages(DbConnection connection)
+        {
+        }
+
+        /// <summary>
+        /// 	The unsubscribe from messages.
+        /// </summary>
+        /// <param name = "connection">The connection.</param>
+        protected virtual void UnsubscribeFromMessages(DbConnection connection)
+        {
+        }
+
+        /// <summary>
+        /// 	Ensures that there is enough information available to the class to execute a query.
+        /// </summary>
+        /// <exception cref = "InvalidOperationException">If there is no connection, "Supply a connection."</exception>
+        /// <exception cref = "InvalidOperationException">If there is no connection, "Supply a provider."</exception>
+        private void ValidateState()
+        {
+            if (string.IsNullOrEmpty(_connectionString))
+            {
+                throw new InvalidOperationException("Supply a connection.");
+            }
+
+            if (_factory == null)
+            {
+                throw new InvalidOperationException("Supply a provider.");
+            }
+        }
+    }
+}
Added +85 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/SqlQueryRunner.cs b/minisqlquery-master/src/MiniSqlQuery.Core/SqlQueryRunner.cs
new file mode 100644
index 0000000..ade2447
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/SqlQueryRunner.cs
@@ -0,0 +1,85 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+using System.Data.Common;
+using System.Data.SqlClient;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	The sql query runner.
+    /// </summary>
+    public class SqlQueryRunner : QueryRunner
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="SqlQueryRunner"/> class.
+        /// </summary>
+        /// <param name="factory">The provider factory.</param>
+        /// <param name="connectionString">The connection string.</param>
+        /// <param name="enableQueryBatching">The enable query batching.</param>
+        /// <param name="commandTimeout"></param>
+        public SqlQueryRunner(DbProviderFactory factory, string connectionString, bool enableQueryBatching, int commandTimeout)
+            : base(factory, connectionString, enableQueryBatching, commandTimeout)
+        {
+        }
+
+        /// <summary>
+        /// 	The handle batch exception.
+        /// </summary>
+        /// <param name = "dbException">The db exception.</param>
+        protected override void HandleBatchException(DbException dbException)
+        {
+            Exception = dbException;
+            var exp = dbException as SqlException;
+            if (exp != null)
+            {
+                foreach (SqlError error in exp.Errors)
+                {
+                    Messages += string.Format("Error line {0}: {1}.{2}", error.LineNumber, error.Message, Environment.NewLine);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 	The subscribe to messages.
+        /// </summary>
+        /// <param name = "connection">The connection.</param>
+        protected override void SubscribeToMessages(DbConnection connection)
+        {
+            var conn = connection as SqlConnection;
+            if (conn != null)
+            {
+                conn.InfoMessage += ConnectionInfoMessage;
+            }
+        }
+
+        /// <summary>
+        /// 	The unsubscribe from messages.
+        /// </summary>
+        /// <param name = "connection">The connection.</param>
+        protected override void UnsubscribeFromMessages(DbConnection connection)
+        {
+            var conn = connection as SqlConnection;
+            if (conn != null)
+            {
+                conn.InfoMessage -= ConnectionInfoMessage;
+            }
+        }
+
+        /// <summary>
+        /// 	The connection information message collection method.
+        /// </summary>
+        /// <param name = "sender">The sender.</param>
+        /// <param name = "e">The events for the message.</param>
+        private void ConnectionInfoMessage(object sender, SqlInfoMessageEventArgs e)
+        {
+            Messages += e.Message + Environment.NewLine;
+        }
+    }
+}
\ No newline at end of file
Added +45 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/StringWriterWithEncoding.cs b/minisqlquery-master/src/MiniSqlQuery.Core/StringWriterWithEncoding.cs
new file mode 100644
index 0000000..b59534b
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/StringWriterWithEncoding.cs
@@ -0,0 +1,45 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System.IO;
+using System.Text;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	A <see cref = "StringWriter" /> that allows the setting of the <see cref = "Encoding" />.
+    /// </summary>
+    public class StringWriterWithEncoding : StringWriter
+    {
+        /// <summary>
+        /// 	The _encoding.
+        /// </summary>
+        private readonly Encoding _encoding;
+
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "StringWriterWithEncoding" /> class.
+        /// </summary>
+        /// <param name = "encoding">The encoding to use, e.g. Encoding.UTF8.</param>
+        public StringWriterWithEncoding(Encoding encoding)
+        {
+            _encoding = encoding;
+        }
+
+        /// <summary>
+        /// 	Gets the <see cref = "T:System.Text.Encoding" /> in which the output is written.
+        /// </summary>
+        /// <value>The encoding type.</value>
+        /// <returns>
+        /// 	The Encoding in which the output is written.
+        /// </returns>
+        public override Encoding Encoding
+        {
+            get { return _encoding; }
+        }
+    }
+}
\ No newline at end of file
Added +22 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/SystemMessage.cs b/minisqlquery-master/src/MiniSqlQuery.Core/SystemMessage.cs
new file mode 100644
index 0000000..c737bc6
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/SystemMessage.cs
@@ -0,0 +1,22 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	System messages posted by Mini SQL Query itself or other plugins.
+    /// </summary>
+    public enum SystemMessage
+    {
+        /// <summary>
+        /// 	A table was truncated.
+        /// </summary>
+        TableTruncated
+    }
+}
\ No newline at end of file
Added +41 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/SystemMessageEventArgs.cs b/minisqlquery-master/src/MiniSqlQuery.Core/SystemMessageEventArgs.cs
new file mode 100644
index 0000000..4982b00
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/SystemMessageEventArgs.cs
@@ -0,0 +1,41 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	A system wide message event.
+    /// </summary>
+    public class SystemMessageEventArgs : EventArgs
+    {
+        /// <summary>
+        /// 	Initializes a new instance of the <see cref = "SystemMessageEventArgs" /> class.
+        /// </summary>
+        /// <param name = "message">The system message.</param>
+        /// <param name = "data">The associated data.</param>
+        public SystemMessageEventArgs(SystemMessage message, object data)
+        {
+            Message = message;
+            Data = data;
+        }
+
+        /// <summary>
+        /// 	Gets the data for the event.
+        /// </summary>
+        /// <value>The event data.</value>
+        public object Data { get; private set; }
+
+        /// <summary>
+        /// 	Gets the system message type.
+        /// </summary>
+        /// <value>The system message type.</value>
+        public SystemMessage Message { get; private set; }
+    }
+}
\ No newline at end of file
Added +148 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Template/HenriFormatter.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Template/HenriFormatter.cs
new file mode 100644
index 0000000..87c3027
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Template/HenriFormatter.cs
@@ -0,0 +1,148 @@
+using System;
+using System.IO;
+using System.Text;
+using System.Web;
+using System.Web.UI;
+
+namespace MiniSqlQuery.Core.Template
+{
+	/// <summary>
+	/// From an online debate on parsing, original author todo....
+	/// </summary>
+	public class HenriFormatter : ITextFormatter
+	{
+		#region ITextFormatter Members
+
+		public string Format(string text, object dataSource)
+		{
+			if (text == null)
+			{
+				throw new ArgumentNullException("text");
+			}
+
+			StringBuilder result = new StringBuilder(text.Length*2);
+
+			using (var reader = new StringReader(text))
+			{
+				StringBuilder expression = new StringBuilder();
+				int @char = -1;
+
+				TemplateParseState templateParseState = TemplateParseState.OutsideExpression;
+				do
+				{
+					switch (templateParseState)
+					{
+						case TemplateParseState.OutsideExpression:
+							@char = reader.Read();
+							switch (@char)
+							{
+								case -1:
+									templateParseState = TemplateParseState.End;
+									break;
+								case '{':
+									templateParseState = TemplateParseState.OnOpenBracket;
+									break;
+								case '}':
+									templateParseState = TemplateParseState.OnCloseBracket;
+									break;
+								default:
+									result.Append((char) @char);
+									break;
+							}
+							break;
+						case TemplateParseState.OnOpenBracket:
+							@char = reader.Read();
+							switch (@char)
+							{
+								case -1:
+									throw new FormatException();
+								case '{':
+									result.Append('{');
+									templateParseState = TemplateParseState.OutsideExpression;
+									break;
+								default:
+									expression.Append((char) @char);
+									templateParseState = TemplateParseState.InsideExpression;
+									break;
+							}
+							break;
+						case TemplateParseState.InsideExpression:
+							@char = reader.Read();
+							switch (@char)
+							{
+								case -1:
+									throw new FormatException();
+								case '}':
+									result.Append(ResolveExpression(dataSource, expression.ToString()));
+									expression.Length = 0;
+									templateParseState = TemplateParseState.OutsideExpression;
+									break;
+								default:
+									expression.Append((char) @char);
+									break;
+							}
+							break;
+						case TemplateParseState.OnCloseBracket:
+							@char = reader.Read();
+							switch (@char)
+							{
+								case '}':
+									result.Append('}');
+									templateParseState = TemplateParseState.OutsideExpression;
+									break;
+								default:
+									throw new FormatException();
+							}
+							break;
+						default:
+							throw new InvalidOperationException("Invalid state.");
+					}
+				}
+				while (templateParseState != TemplateParseState.End);
+			}
+
+			return result.ToString();
+		}
+
+		#endregion
+
+		private string ResolveExpression(object source, string expression)
+		{
+			string format = "";
+
+			int colonIndex = expression.IndexOf(':');
+			if (colonIndex > 0)
+			{
+				format = expression.Substring(colonIndex + 1);
+				expression = expression.Substring(0, colonIndex);
+			}
+
+			try
+			{
+				// yes, it uses the databinder
+				if (String.IsNullOrEmpty(format))
+				{
+					return (DataBinder.Eval(source, expression) ?? "").ToString();
+				}
+				return DataBinder.Eval(source, expression, "{0:" + format + "}") ?? "";
+			}
+			catch (HttpException exp)
+			{
+				throw new FormatException(exp.Message);
+			}
+		}
+
+		#region Nested type: TemplateParseState
+
+		private enum TemplateParseState
+		{
+			OutsideExpression,
+			OnOpenBracket,
+			InsideExpression,
+			OnCloseBracket,
+			End
+		}
+
+		#endregion
+	}
+}
\ No newline at end of file
Added +57 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Template/NVelocityWrapper.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Template/NVelocityWrapper.cs
new file mode 100644
index 0000000..bce56d2
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Template/NVelocityWrapper.cs
@@ -0,0 +1,57 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Collections.Generic;
+using System.IO;
+using NVelocity;
+using NVelocity.App;
+using NVelocity.Exception;
+
+namespace MiniSqlQuery.Core.Template
+{
+    /// <summary>The n velocity wrapper.</summary>
+    public class NVelocityWrapper : ITextFormatter
+    {
+        /// <summary>The format.</summary>
+        /// <param name="text">The text.</param>
+        /// <param name="items">The items.</param>
+        /// <returns>The format.</returns>
+        /// <exception cref="TemplateException"></exception>
+        public string Format(string text, Dictionary<string, object> items)
+        {
+            try
+            {
+                VelocityContext velocityContext = new VelocityContext();
+
+                if (items != null)
+                {
+                    foreach (var pair in items)
+                    {
+                        velocityContext.Put(pair.Key, pair.Value);
+                    }
+                }
+
+                StringWriter sw = new StringWriter();
+                VelocityEngine velocityEngine = new VelocityEngine();
+                velocityEngine.Init();
+
+                bool ok = velocityEngine.Evaluate(velocityContext, sw, "ContextTest.CaseInsensitive", text);
+
+                if (!ok)
+                {
+                    throw new TemplateException("Template run error (try adding an extra newline at the end of the file)");
+                }
+
+                return sw.ToString();
+            }
+            catch (ParseErrorException parseErrorException)
+            {
+                throw new TemplateException(parseErrorException.Message, parseErrorException);
+            }
+        }
+    }
+}
\ No newline at end of file
Added +44 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Template/TemplateException.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Template/TemplateException.cs
new file mode 100644
index 0000000..db25dce
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Template/TemplateException.cs
@@ -0,0 +1,44 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System;
+using System.Runtime.Serialization;
+
+namespace MiniSqlQuery.Core.Template
+{
+    /// <summary>The template exception.</summary>
+    [Serializable]
+    public class TemplateException : Exception
+    {
+        /// <summary>Initializes a new instance of the <see cref="TemplateException"/> class.</summary>
+        public TemplateException()
+        {
+        }
+
+        /// <summary>Initializes a new instance of the <see cref="TemplateException"/> class.</summary>
+        /// <param name="message">The message.</param>
+        public TemplateException(string message) : base(message)
+        {
+        }
+
+        /// <summary>Initializes a new instance of the <see cref="TemplateException"/> class.</summary>
+        /// <param name="message">The message.</param>
+        /// <param name="inner">The inner.</param>
+        public TemplateException(string message, Exception inner) : base(message, inner)
+        {
+        }
+
+        /// <summary>Initializes a new instance of the <see cref="TemplateException"/> class.</summary>
+        /// <param name="info">The info.</param>
+        /// <param name="context">The context.</param>
+        protected TemplateException(
+            SerializationInfo info,
+            StreamingContext context) : base(info, context)
+        {
+        }
+    }
+}
\ No newline at end of file
Added +21 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Template/TextFormatter.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Template/TextFormatter.cs
new file mode 100644
index 0000000..0afec69
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Template/TextFormatter.cs
@@ -0,0 +1,21 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System.Collections.Generic;
+
+namespace MiniSqlQuery.Core.Template
+{
+    /// <summary>The i text formatter.</summary>
+    public interface ITextFormatter
+    {
+        /// <summary>The format.</summary>
+        /// <param name="text">The text.</param>
+        /// <param name="items">The items.</param>
+        /// <returns>The format.</returns>
+        string Format(string text, Dictionary<string, object> items);
+    }
+}
\ No newline at end of file
Added +197 -0
diff --git a/minisqlquery-master/src/MiniSqlQuery.Core/Utility.cs b/minisqlquery-master/src/MiniSqlQuery.Core/Utility.cs
new file mode 100644
index 0000000..67d89a2
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery.Core/Utility.cs
@@ -0,0 +1,197 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.Common;
+using System.Diagnostics;
+using System.IO;
+using System.Text;
+using System.Xml.Serialization;
+using MiniSqlQuery.Core.Properties;
+
+namespace MiniSqlQuery.Core
+{
+    /// <summary>
+    /// 	Some basic helper functions.
+    /// </summary>
+    public static class Utility
+    {
+        /// <summary>
+        /// 	Writes a default file if none present.
+        /// </summary>
+        public static void CreateConnectionStringsIfRequired()
+        {
+            string filename = GetConnectionStringFilename();
+            if (!File.Exists(filename))
+            {
+                File.WriteAllText(filename, Resources.DefaultConnectionDefinitionFile);
+            }
+        }
+
+        /// <summary>
+        /// 	Resolves the full filename of the connection string file, by default in the application data folder
+        /// 	for "MiniSqlQuery", e.g. "C:\Users\(username)\AppData\Roaming\MiniSqlQuery\connections.xml".
+        /// 	Allows for the override vis the "MiniSqlQuery.Core.dll.config" file "DefaultConnectionDefinitionFilename" 
+        /// 	setting.
+        /// </summary>
+        /// <returns>A filename.</returns>
+        public static string GetConnectionStringFilename()
+        {
+            string filename = ApplicationServices.Instance.Settings.DefaultConnectionDefinitionFilename;
+
+            if (!string.IsNullOrEmpty(filename) && File.Exists(filename))
+            {
+                return filename;
+            }
+
+            string folder = GetAppFolderPath();
+            filename = Path.Combine(folder, "connections.xml");
+
+            return filename;
+        }
+
+        /// <summary>
+        /// 	Returns an array of SQL provider types supported by the current platform.
+        /// </summary>
+        /// <returns>An array of SQL provider types.</returns>
+        public static string[] GetSqlProviderNames()
+        {
+            DataTable providers = DbProviderFactories.GetFactoryClasses();
+            var providerNames = new List<string>();
+
+            foreach (DataRow row in providers.Rows)
+            {
+                providerNames.Add(row["InvariantName"].ToString());
+            }
+
+            return providerNames.ToArray();
+        }
+
+        /// <summary>
+        /// 	Loads the connection string data from the file.
+        /// </summary>
+        /// <returns>The text file contents as a single string.</returns>
+        /// <seealso cref = "GetConnectionStringFilename" />
+        public static string LoadConnections()
+        {
+            string filename = GetConnectionStringFilename();
+            string data = File.ReadAllText(filename);
+            return data;
+        }
+
+        /// <summary>
+        /// 	Loads the db connection definitions from an XML file.
+        /// </summary>
+        /// <returns>A <see cref = "DbConnectionDefinitionList" /> instance or null if the file does not exist.</returns>
+        public static DbConnectionDefinitionList LoadDbConnectionDefinitions()
+        {
+            string filename = GetConnectionStringFilename();
+            DbConnectionDefinitionList definitionList = null;
+
+            if (File.Exists(filename))
+            {
+                definitionList = DbConnectionDefinitionList.FromXml(File.ReadAllText(filename));
+            }
+
+            return definitionList;
+        }
+
+        /// <summary>
+        /// 	Attempts to convert a database object name to it's "bracketed for", e.g. "Name" -> "[Name]".
+        /// </summary>
+        /// <param name = "name">The name of the object.</param>
+        /// <returns>The SQL friendly conversion.</returns>
+        public static string MakeSqlFriendly(string name)
+        {
+            if (name == null)
+            {
+                return string.Empty;
+            }
+
+            if (!name.StartsWith("[") && (name.Contains(" ") || name.Contains("$")))
+            {
+                // TODO - reserved wods?
+                return string.Concat("[", name, "]");
+            }
+
+            return name;
+        }
+
+        /// <summary>
+        /// 	The render safe schema object name.
+        /// </summary>
+        /// <param name = "schema">The schema.</param>
+        /// <param name = "objectName">The object name.</param>
+        /// <returns>The render safe schema object name.</returns>
+        public static string RenderSafeSchemaObjectName(string schema, string objectName)
+        {
+            if (string.IsNullOrEmpty(schema))
+            {
+                return string.Format("[{0}]", objectName);
+            }
+
+            return string.Format("[{0}].[{1}]", schema, objectName);
+        }
+
+        /// <summary>
+        /// 	Saves the <paramref name = "definitionList" /> to the connection string file.
+        /// </summary>
+        /// <param name = "definitionList">The contents of the file.</param>
+        /// <seealso cref = "GetConnectionStringFilename" />
+        public static void SaveConnections(DbConnectionDefinitionList definitionList)
+        {
+            string filename = GetConnectionStringFilename();
+            string newXml = definitionList.ToXml();
+            File.WriteAllText(filename, newXml);
+        }
+
+        /// <summary>
+        /// 	Shows the URL in the defaut browser.
+        /// </summary>
+        /// <param name = "url">The URL to display.</param>
+        public static void ShowUrl(string url)
+        {
+            Process.Start(url);
+        }
+
+        /// <summary>
+        /// 	Serializes the <paramref name = "obj" />.
+        /// </summary>
+        /// <typeparam name = "T">The type.</typeparam>
+        /// <param name = "obj">The object to serialize.</param>
+        /// <returns>A UTF8 XML string representing <paramref name = "obj" />.</returns>
+        public static string ToXml<T>(T obj)
+        {
+            using (StringWriter sw = new StringWriterWithEncoding(Encoding.UTF8))
+            {
+                var serializer = new XmlSerializer(typeof(T));
+                serializer.Serialize(sw, obj);
+                return sw.ToString();
+            }
+        }
+
+        /// <summary>
+        /// 	Resolves the "(application data path)\MiniSqlQuery" for this user.
+        /// </summary>
+        /// <returns>A folder path.</returns>
+        private static string GetAppFolderPath()
+        {
+            string folder = Path.Combine(
+                Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
+                Resources.ShortAppTitle);
+            if (Directory.Exists(folder) == false)
+            {
+                Directory.CreateDirectory(folder);
+            }
+
+            return folder;
+        }
+    }
+}
\ No newline at end of file