2010-09-17 08:44:25 +00:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* Umbraco Data Layer
* MIT Licensed work
* <EFBFBD> 2008 Ruben Verborgh
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
using System ;
using System.Resources ;
2012-07-05 13:10:02 -01:00
using SQLCE4Umbraco ;
2010-09-17 08:44:25 +00:00
using umbraco.DataLayer.Utility.Installer ;
using System.Diagnostics ;
namespace SqlCE4Umbraco
{
/// <summary>
/// Database installer for an SQL Server data source.
/// </summary>
public class SqlCEInstaller : DefaultInstallerUtility < SqlCEHelper >
{
#region Private Constants
/// <summary>The latest database version this installer supports.</summary>
2012-10-13 06:43:24 +05:00
private const DatabaseVersion LatestVersionSupported = DatabaseVersion . Version4_9 ;
2010-09-17 08:44:25 +00:00
/// <summary>The specifications to determine the database version.</summary>
private static readonly VersionSpecs [ ] m_VersionSpecs = new VersionSpecs [ ] {
2012-10-13 07:05:11 +05:00
new VersionSpecs ( "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'cmsContentType2ContentType'" , 1 , DatabaseVersion . Version4_9 ) ,
//This will throw an exception and will only ever have one row if it is installed, on exception the database version returned is unkown so will still work.
//NOTE: before this was set to zero and only worked by fluke!
new VersionSpecs ( "SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS LEFT OUTER JOIN umbracoApp ON appAlias = appAlias WHERE CONSTRAINT_NAME = 'FK_umbracoUser2app_umbracoApp'" , 1 , DatabaseVersion . Version4_8 ) ,
2012-08-03 08:40:00 -01:00
new VersionSpecs ( "SELECT id FROM umbracoNode WHERE id = -21" , 1 , DatabaseVersion . Version4_1 ) ,
new VersionSpecs ( "SELECT action FROM umbracoAppTree" , DatabaseVersion . Version4 ) ,
new VersionSpecs ( "SELECT description FROM cmsContentType" , DatabaseVersion . Version3 ) ,
new VersionSpecs ( "SELECT id FROM sysobjects" , DatabaseVersion . None ) } ;
2010-09-17 08:44:25 +00:00
#endregion
#region Public Properties
2012-07-17 00:52:08 +06:00
/// <summary>
/// This ensures that the database exists, then runs the base method
/// </summary>
public override bool CanConnect
{
get
{
SqlHelper . CreateEmptyDatabase ( ) ;
return base . CanConnect ;
}
}
2010-09-17 08:44:25 +00:00
/// <summary>
/// Gets a value indicating whether the installer can upgrade the data source.
/// </summary>
/// <value>
/// <c>true</c> if the installer can upgrade the data source; otherwise, <c>false</c>.
/// </value>
/// <remarks>Empty data sources can't be upgraded, just installed.</remarks>
public override bool CanUpgrade
{
get
{
2012-08-02 09:51:06 -01:00
return CurrentVersion = = DatabaseVersion . Version4_1 ;
2010-09-17 08:44:25 +00:00
}
}
#endregion
#region Protected Properties
/// <summary>
/// Gets the version specification for evaluation by DetermineCurrentVersion.
/// Only first matching specification is taken into account.
/// </summary>
/// <value>The version specifications.</value>
protected override VersionSpecs [ ] VersionSpecs
{
get { return m_VersionSpecs ; }
}
#endregion
#region Public Constructors
/// <summary>
/// Initializes a new instance of the <see cref="SqlCEInstaller"/> class.
/// </summary>
/// <param name="sqlHelper">The SQL helper.</param>
public SqlCEInstaller ( SqlCEHelper sqlHelper ) : base ( sqlHelper , LatestVersionSupported )
{ }
#endregion
#region DefaultInstaller Members
/// <summary>
/// Returns the sql to do a full install
/// </summary>
protected override string FullInstallSql
{
get { return SqlCEResources . Total ; }
}
/// <summary>
/// Returns the sql to do an upgrade
/// </summary>
protected override string UpgradeSql
{
get
{
string upgradeFile = string . Format ( "{0}_Upgrade" , CurrentVersion . ToString ( ) ) ;
return SqlCEResources . ResourceManager . GetString ( upgradeFile ) ;
}
}
// We need to override this as the default way of detection a db connection checks for systables that doesn't exist
// in a CE db
protected override DatabaseVersion DetermineCurrentVersion ( )
{
DatabaseVersion version = base . DetermineCurrentVersion ( ) ;
if ( version ! = DatabaseVersion . Unavailable )
{
return version ;
}
// verify connection
try
{
if ( SqlCeApplicationBlock . VerifyConnection ( base . SqlHelper . ConnectionString ) )
return DatabaseVersion . None ;
}
catch ( Exception e )
{
Trace . WriteLine ( e . ToString ( ) ) ;
}
return DatabaseVersion . Unavailable ;
}
#endregion
}
}