Files
Sdaleo/DBInstallOrUpdate.cs
2016-07-21 16:55:03 -04:00

257 lines
12 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sdaleo.Internal;
namespace Sdaleo
{
/// <summary>
/// Specify what type of update/install to do.
/// All_IF_EXISTS, will check for script existence and only run the ones that exist
/// </summary>
public enum InstallOrUpdateType
{
ALL_IF_EXISTS,
TABLES,
VIEWS,
SPROCS,
}
/// <summary>
/// Helper class to Install or Update a Database,
/// Before using this class set via DBResources a DBResource that points to SQL Script Files
/// to use in the Install/Update Process, or pass the DBResource in via one of the Constructors
/// ~SQL Script Files, contain SQL Snippets that are broken down to Commands and Identifiers as
/// specified in the internal class SQLParser. Using these commands and Identifiers,
/// you can Install/Update a SQL Server or SQLCE Database with ease
/// </summary>
public class DBInstallOrUpdate
{
#region Public and Private Members
// Public
public uint CurMajorVersion { get; private set; }
public uint CurMinorVersion { get; private set; }
public uint CurRevisionNumber { get; private set; }
// Private
private IConnectDb _DBCredential { get; set; }
private string _uniqueName { get; set; }
private DBResource _DBResouce { get; set; }
private string _VersioningTableName { get; set; }
// SQLScripts
private string[] _TableScripts = null;
private string[] _ViewScripts = null;
private string[] _SprocScripts = null;
#endregion
#region Constructors
/// <summary>
/// Construct a DBInstallOrUpdate Object in order to install tables, views, sprocs, or
/// update an existing database
/// </summary>
/// <param name="DBCredential">Pass in a DBCredential Object to use in this class</param>
/// <param name="uniqueName">specify a unique name, that was used when registering a DBResource via DBResources</param>
/// <param name="CurMajorVersion">Running Application's Current Major Product Version Number (for use in installs/upgrades)</param>
/// <param name="CurMinorVersion">Running Application's Current Minor Product Version Number (for use in installs/upgrades)</param>
/// <param name="CurRevisionNumber">Running Application's Current Revision Number (for use in installs/upgrades)</param>
/// <param name="VersioningTableName">Pass in a Table Name that will be created/updated to contain the latest Application Version Information *used for Update*</param>
public DBInstallOrUpdate(IConnectDb DBCredential, string uniqueName, uint CurMajorVersion, uint CurMinorVersion, uint CurRevisionNumber, string VersioningTableName = "Versioning")
{
if (!DBCredential.IsValid || String.IsNullOrEmpty(uniqueName))
throw new ArgumentException("DBCredential or uniqueName is Invalid");
// Make sure DBResource exists
DBResources.GetDBResource(uniqueName);
// Set all Private Members
ConstructorSetsPrivateMembers(DBCredential, uniqueName, CurMajorVersion, CurMinorVersion, CurRevisionNumber, VersioningTableName);
}
/// <summary>
/// Construct a DBInstallOrUpdate Object in order to install tables, views, sprocs, or
/// update an existing database
/// </summary>
/// <param name="DBCredential">Pass in a DBCredential Object to use in this class</param>
/// <param name="dbResource">pass in a valid DBResource that points to valid SQL Script Locations</param>
/// <param name="uniqueName">specify a unique name to use, that describes the dbResource used to register the resource</param>
/// <param name="CurMajorVersion">Running Application's Current Major Product Version Number (for use in installs/upgrades)</param>
/// <param name="CurMinorVersion">Running Application's Current Minor Product Version Number (for use in installs/upgrades)</param>
/// <param name="CurRevisionNumber">Running Application's Current Revision Number (for use in installs/upgrades)</param>
/// <param name="VersioningTableName">Pass in a Table Name that will be created/updated to contain the latest Application Version Information *used for Update*</param>
public DBInstallOrUpdate(IConnectDb DBCredential, DBResource dbResource, string uniqueName, uint CurMajorVersion, uint CurMinorVersion, uint CurRevisionNumber, string VersioningTableName = "Versioning")
{
if (!DBCredential.IsValid || String.IsNullOrEmpty(uniqueName))
throw new ArgumentException("DBCredential or uniqueName is Invalid");
// Add the DBResource
DBResources.AddDBResource(uniqueName, dbResource);
// Set all Private Members
ConstructorSetsPrivateMembers(DBCredential, uniqueName, CurMajorVersion, CurMinorVersion, CurRevisionNumber, VersioningTableName);
}
/// <summary>
/// Broken out of the Constructors, to centralize member initialization
/// </summary>
private void ConstructorSetsPrivateMembers(IConnectDb DBCredential, string uniqueName, uint CurMajorVersion, uint CurMinorVersion, uint CurRevisionNumber, string VersioningTableName)
{
this._DBCredential = DBCredential;
this._uniqueName = uniqueName;
this.CurMajorVersion = CurMajorVersion;
this.CurMinorVersion = CurMinorVersion;
this.CurRevisionNumber = CurRevisionNumber;
this._VersioningTableName = VersioningTableName;
// Retrieve Scripts
this._TableScripts = DBResources.GetTableDBResourceScripts(_uniqueName);
this._ViewScripts = DBResources.GetViewsDBResourceScripts(_uniqueName);
this._SprocScripts = DBResources.GetSprocsDBResourceScripts(_uniqueName);
}
#endregion
#region Public Methods and Properties
/// <summary>
///
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public DBError InstallOrUpdate(InstallOrUpdateType type)
{
DBError dbError;
if (!HasVersioningTable)
dbError = InstallDatabase(type);
else
dbError = UpdateDatabase(type);
return dbError;
}
/// <summary>
///
/// </summary>
/// <returns></returns>
private bool HasVersioningTable
{
get
{
return true; // for now
}
}
#endregion
#region private Helper Functions
/// <summary>
///
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
private DBError InstallDatabase(InstallOrUpdateType type)
{
DBError dbError = new DBError();
// Install Tables first
if ((type == InstallOrUpdateType.TABLES || type == InstallOrUpdateType.ALL_IF_EXISTS) &&
(_TableScripts != null))
dbError = ExecuteSpecificMySQLCommandsTypesInSQLScripts(null, _TableScripts);
if (dbError.ErrorOccured) return dbError;
// Install Views Next
if ((type == InstallOrUpdateType.VIEWS || type == InstallOrUpdateType.ALL_IF_EXISTS) &&
(_TableScripts != null))
dbError = ExecuteSpecificMySQLCommandsTypesInSQLScripts(null, _ViewScripts);
if (dbError.ErrorOccured) return dbError;
// Install Sprocs Next
if ((type == InstallOrUpdateType.VIEWS || type == InstallOrUpdateType.ALL_IF_EXISTS) &&
(_SprocScripts != null))
dbError = ExecuteSpecificMySQLCommandsTypesInSQLScripts(null, _SprocScripts);
if (dbError.ErrorOccured) return dbError;
return new DBError();
}
/// <summary>
///
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
private DBError UpdateDatabase(InstallOrUpdateType type)
{
DBError dbError = new DBError();
// Install Tables first
if ((type == InstallOrUpdateType.TABLES || type == InstallOrUpdateType.ALL_IF_EXISTS) &&
(_TableScripts != null))
dbError = ExecuteSpecificMySQLCommandsTypesInSQLScripts(null, _TableScripts);
if (dbError.ErrorOccured) return dbError;
// Install Views Next
if ((type == InstallOrUpdateType.VIEWS || type == InstallOrUpdateType.ALL_IF_EXISTS) &&
(_TableScripts != null))
dbError = ExecuteSpecificMySQLCommandsTypesInSQLScripts(null, _ViewScripts);
if (dbError.ErrorOccured) return dbError;
// Install Sprocs Next
if ((type == InstallOrUpdateType.VIEWS || type == InstallOrUpdateType.ALL_IF_EXISTS) &&
(_SprocScripts != null))
dbError = ExecuteSpecificMySQLCommandsTypesInSQLScripts(null, _SprocScripts);
if (dbError.ErrorOccured) return dbError;
return new DBError();
}
/// <summary>
///
/// </summary>
/// <param name="types"></param>
/// <param name="FRLCS_ScriptFiles"></param>
/// <returns></returns>
private DBError ExecuteSpecificMySQLCommandsTypesInSQLScripts(MySQLCommandType[] types, string[] FRLCS_ScriptFiles)
{
foreach (string scriptFile in FRLCS_ScriptFiles)
{
// Retrieve the Commands N' Identifiers for the Script
MySQLCommand[] commands = null;
MySQLIdentifier[] identifiers = null;
if (!GetCommandsAndIdentifiersFromSqlScript(scriptFile, out commands, out identifiers))
{
// argh.. .this should not happen
}
// Only Execute certain types/Versions????
DBError dbError = commands[0].ExecuteScriptBlock(_DBCredential);
if (dbError.ErrorOccured)
{
//commands[0].Line_CommandStart
}
}
return null;
}
/// <summary>
/// Uses DBResources and SQLParser to parse an SQLScript into MySQLCommands and MySQLIdentifiers
/// </summary>
/// <param name="FRLCS_Script">the FRLCS full resource file and path to the script to parse</param>
/// <param name="commands">returns out MySQLCommands found in script</param>
/// <param name="identifiers">returns out MySQLIdentities found in script</param>
/// <returns>true if commands and identifiers were fetched, false otherwise</returns>
private bool GetCommandsAndIdentifiersFromSqlScript(string FRLCS_Script, out MySQLCommand[] commands, out MySQLIdentifier[] identifiers)
{
string[] ScriptContents = DBResources.Read_FRLCS_Script(_uniqueName, FRLCS_Script);
SQLParser.ParseSQLScriptForMySQLCommandsAndIdentifiers(ScriptContents, out commands, out identifiers);
return ((commands != null) && (identifiers != null) && (commands.Length != 0) && (identifiers.Length != 0));
}
#endregion
}
}