2013-01-25 15:05:42 -01:00
using System ;
using System.Collections.Generic ;
using System.Linq ;
2013-01-28 14:01:38 -01:00
using System.Text ;
2013-01-25 15:05:42 -01:00
using Umbraco.Core.Configuration ;
using Umbraco.Core.Persistence.DatabaseModelDefinitions ;
2013-01-28 14:01:38 -01:00
using Umbraco.Core.Persistence.SqlSyntax ;
2013-01-24 14:59:03 -01:00
namespace Umbraco.Core.Persistence.Migrations.Initial
{
public class DatabaseSchemaResult
{
public DatabaseSchemaResult ( )
{
2013-01-25 15:05:42 -01:00
Errors = new List < Tuple < string , string > > ( ) ;
TableDefinitions = new List < TableDefinition > ( ) ;
ValidTables = new List < string > ( ) ;
ValidColumns = new List < string > ( ) ;
ValidConstraints = new List < string > ( ) ;
2013-01-24 14:59:03 -01:00
}
2013-01-25 15:05:42 -01:00
public List < Tuple < string , string > > Errors { get ; set ; }
2013-01-24 14:59:03 -01:00
2013-01-25 15:05:42 -01:00
public List < TableDefinition > TableDefinitions { get ; set ; }
public List < string > ValidTables { get ; set ; }
public List < string > ValidColumns { get ; set ; }
public List < string > ValidConstraints { get ; set ; }
/// <summary>
/// Determines the version of the currently installed database.
/// </summary>
/// <returns>
/// A <see cref="Version"/> with Major and Minor values for
/// non-empty database, otherwise "0.0.0" for empty databases.
/// </returns>
public Version DetermineInstalledVersion ( )
{
//If (ValidTables.Count == 0) database is empty and we return -> new Version(0, 0, 0);
if ( ValidTables . Count = = 0 )
return new Version ( 0 , 0 , 0 ) ;
//If Errors is empty then we're at current version
if ( Errors . Any ( ) = = false )
return UmbracoVersion . Current ;
//If Errors contains umbracoApp or umbracoAppTree its pre-6.0.0 -> new Version(4, 10, 0);
if (
Errors . Any (
x = > x . Item1 . Equals ( "Table" ) & & ( x . Item2 . Equals ( "umbracoApp" ) | | x . Item2 . Equals ( "umbracoAppTree" ) ) ) )
{
//If Errors contains umbracoUser2app or umbracoAppTree foreignkey to umbracoApp exists its pre-4.8.0 -> new Version(4, 7, 0);
if (
Errors . Any (
x = >
x . Item1 . Equals ( "Constraint" ) & &
( x . Item2 . Contains ( "umbracoUser2app_umbracoApp" ) | | x . Item2 . Contains ( "umbracoAppTree_umbracoApp" ) ) ) )
{
return new Version ( 4 , 7 , 0 ) ;
}
2013-01-28 14:01:38 -01:00
return new Version ( 4 , 9 , 0 ) ;
2013-01-25 15:05:42 -01:00
}
return new Version ( 0 , 0 , 0 ) ;
}
/// <summary>
/// Gets a summary of the schema validation result
/// </summary>
/// <returns>A string containing a human readable string with a summary message</returns>
public string GetSummary ( )
{
2013-01-28 14:01:38 -01:00
var sb = new StringBuilder ( ) ;
if ( Errors . Any ( ) = = false )
{
sb . AppendLine ( "The database schema validation didn't find any errors." ) ;
return sb . ToString ( ) ;
}
//Table error summary
if ( Errors . Any ( x = > x . Item1 . Equals ( "Table" ) ) )
{
sb . AppendLine ( "The following tables were found in the database, but are not in the current schema:" ) ;
sb . AppendLine ( string . Join ( "," , Errors . Where ( x = > x . Item1 . Equals ( "Table" ) ) . Select ( x = > x . Item2 ) ) ) ;
sb . AppendLine ( " " ) ;
}
//Column error summary
if ( Errors . Any ( x = > x . Item1 . Equals ( "Column" ) ) )
{
sb . AppendLine ( "The following columns were found in the database, but are not in the current schema:" ) ;
sb . AppendLine ( string . Join ( "," , Errors . Where ( x = > x . Item1 . Equals ( "Column" ) ) . Select ( x = > x . Item2 ) ) ) ;
sb . AppendLine ( " " ) ;
}
//Constraint error summary
if ( Errors . Any ( x = > x . Item1 . Equals ( "Constraint" ) ) )
{
sb . AppendLine ( "The following constraints (Primary Keys, Foreign Keys and Indexes) were found in the database, but are not in the current schema:" ) ;
sb . AppendLine ( string . Join ( "," , Errors . Where ( x = > x . Item1 . Equals ( "Constraint" ) ) . Select ( x = > x . Item2 ) ) ) ;
sb . AppendLine ( " " ) ;
}
//Unknown constraint error summary
if ( Errors . Any ( x = > x . Item1 . Equals ( "Unknown" ) ) )
{
sb . AppendLine ( "The following unknown constraints (Primary Keys, Foreign Keys and Indexes) were found in the database, but are not in the current schema:" ) ;
sb . AppendLine ( string . Join ( "," , Errors . Where ( x = > x . Item1 . Equals ( "Unknown" ) ) . Select ( x = > x . Item2 ) ) ) ;
sb . AppendLine ( " " ) ;
}
if ( SyntaxConfig . SqlSyntaxProvider is MySqlSyntaxProvider )
{
sb . AppendLine ( "Please note that the constraints could not be validated because the current dataprovider is MySql." ) ;
}
return sb . ToString ( ) ;
2013-01-25 15:05:42 -01:00
}
2013-01-24 14:59:03 -01:00
}
}