From: <te...@us...> - 2008-11-16 22:23:03
|
Revision: 3912 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3912&view=rev Author: tehlike Date: 2008-11-16 22:22:59 +0000 (Sun, 16 Nov 2008) Log Message: ----------- Implementation for SchemaValidator with its test (which means partial implementation of hbm2ddl.verify) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs trunk/nhibernate/src/NHibernate/Mapping/Table.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaValidator.cs trunk/nhibernate/src/NHibernate.Test/Tools/ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/1_Version.hbm.xml trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/2_Version.hbm.xml trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/Version.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2008-11-15 19:44:59 UTC (rev 3911) +++ trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2008-11-16 22:22:59 UTC (rev 3912) @@ -1981,6 +1981,47 @@ return script.ToArray(); } + public void ValidateSchema(Dialect.Dialect dialect, DatabaseMetadata databaseMetadata) + { + SecondPassCompile(); + + string defaultCatalog = PropertiesHelper.GetString(Environment.DefaultCatalog, properties, null); + string defaultSchema = PropertiesHelper.GetString(Environment.DefaultSchema, properties, null); + + var iter = this.TableMappings; + foreach (var table in iter) + { + if (table.IsPhysicalTable) + { + /*NH Different Implementation : + TableMetadata tableInfo = databaseMetadata.getTableMetadata( + table.getName(), + ( table.getSchema() == null ) ? defaultSchema : table.getSchema(), + ( table.getCatalog() == null ) ? defaultCatalog : table.getCatalog(), + table.isQuoted());*/ + ITableMetadata tableInfo = databaseMetadata.GetTableMetadata( + table.Name, + table.Schema??defaultSchema, + table.Catalog,//??defaultCatalog, + table.IsQuoted); + if (tableInfo == null) + throw new HibernateException("Missing table: " + table.Name); + else + table.ValidateColumns(dialect, mapping, tableInfo); + } + } + + var persistenceIdentifierGenerators = IterateGenerators(dialect); + foreach (var generator in persistenceIdentifierGenerators) + { + string key = generator.GeneratorKey(); + if (!databaseMetadata.IsSequence(key) && !databaseMetadata.IsTable(key)) + { + throw new HibernateException(string.Format("Missing sequence or table: ", key)); + } + } + } + private IEnumerable<IPersistentIdentifierGenerator> IterateGenerators(Dialect.Dialect dialect) { var generators = new Dictionary<string, IPersistentIdentifierGenerator>(); Modified: trunk/nhibernate/src/NHibernate/Mapping/Table.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/Table.cs 2008-11-15 19:44:59 UTC (rev 3911) +++ trunk/nhibernate/src/NHibernate/Mapping/Table.cs 2008-11-16 22:22:59 UTC (rev 3912) @@ -1018,9 +1018,34 @@ return buf.ToString(); } - public void ValidateColumns(Dialect.Dialect dialect, IMapping mapping, DataTable tableInfo) + public void ValidateColumns(Dialect.Dialect dialect, IMapping mapping, ITableMetadata tableInfo) { - throw new NotSupportedException(); + var iter = this.ColumnIterator; + foreach (var column in iter) + { + + var columnInfo = tableInfo.GetColumnMetadata(column.Name); + + if (columnInfo == null) + throw new HibernateException(string.Format("Missing column: {0} in {1}", column.Name, + Table.Qualify(tableInfo.Catalog, tableInfo.Schema, tableInfo.Name))); + + else + { + //TODO: Add new method to ColumnMetadata :getTypeCode + bool typesMatch = column.GetSqlType(dialect, mapping).ToLower() + .StartsWith(columnInfo.TypeName.ToLower()) + ; //|| columnInfo.get() == column.GetSqlTypeCode(mapping); + if (!typesMatch) + { + throw new HibernateException( + string.Format("Wrong column type in {0} for column {1}. Found: {2}, Expected {3}", + Table.Qualify(tableInfo.Catalog, tableInfo.Schema, tableInfo.Name), + column.Name, columnInfo.TypeName.ToLower(), column.GetSqlType(dialect, mapping))); + } + } + } + } public static string Qualify(string catalog, string schema, string table) Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-15 19:44:59 UTC (rev 3911) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-16 22:22:59 UTC (rev 3912) @@ -1020,6 +1020,7 @@ <Compile Include="Tool\hbm2ddl\ManagedProviderConnectionHelper.cs" /> <Compile Include="Dialect\Schema\AbstractDataBaseSchema.cs" /> <Compile Include="Tool\hbm2ddl\SchemaUpdate.cs" /> + <Compile Include="Tool\hbm2ddl\SchemaValidator.cs" /> <Compile Include="Tool\hbm2ddl\SuppliedConnectionHelper.cs" /> <Compile Include="Tool\hbm2ddl\SuppliedConnectionProviderConnectionHelper.cs" /> <Compile Include="Transaction\AdoNetTransactionFactory.cs" /> Added: trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaValidator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaValidator.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaValidator.cs 2008-11-16 22:22:59 UTC (rev 3912) @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Data.SqlClient; +using System.Text; +using log4net; +using log4net.Repository.Hierarchy; +using NHibernate.Cfg; +using NHibernate.Util; + +namespace NHibernate.Tool.hbm2ddl +{ + public class SchemaValidator + { + + private static readonly ILog log = LogManager.GetLogger(typeof(SchemaValidator)); + private readonly IConnectionHelper connectionHelper; + private readonly Configuration configuration; + private Dialect.Dialect dialect; + + public SchemaValidator(Configuration cfg) : + this(cfg, cfg.Properties) + { + } + + public SchemaValidator(Configuration cfg, IDictionary<string, string> connectionProperties) + { + this.configuration = cfg; + dialect = Dialect.Dialect.GetDialect(connectionProperties); + IDictionary<string, string> props = new Dictionary<string, string>(dialect.DefaultProperties); + foreach (var prop in connectionProperties) + props[prop.Key] = prop.Value; + connectionHelper = new ManagedProviderConnectionHelper(props); + } + + public SchemaValidator(Configuration cfg, Settings settings) + { + this.configuration = cfg; + dialect = settings.Dialect; + connectionHelper = new SuppliedConnectionProviderConnectionHelper(settings.ConnectionProvider); + } + + public static void Main(string[] args) + { + try + { + Configuration cfg = new Configuration(); + + String propFile = null; + + for (int i = 0; i < args.Length; i++) + { + if (args[i].StartsWith("--")) + { + if (args[i].StartsWith("--properties=")) + { + propFile = args[i].Substring(13); + } + else if (args[i].StartsWith("--config=")) + { + cfg.Configure(args[i].Substring(9)); + } + else if (args[i].StartsWith("--naming=")) + { + cfg.SetNamingStrategy( + (INamingStrategy)Activator.CreateInstance(ReflectHelper.ClassForName(args[i].Substring(9)))); + } + } + else + { + cfg.AddFile(args[i]); + } + + } + /* NH: No props file for .NET + if ( propFile != null ) { + Properties props = new Properties(); + props.putAll( cfg.getProperties() ); + props.load( new FileInputStream( propFile ) ); + cfg.setProperties( props ); + } + */ + new SchemaValidator(cfg).Validate(); + } + catch (Exception e) + { + log.Error("Error running schema update", e); + Console.WriteLine(e); + } + } + + /** + * Perform the validations. + */ + public void Validate() + { + log.Info("Running schema validator"); + DbConnection connection = null; + try + { + + DatabaseMetadata meta; + try + { + log.Info("fetching database metadata"); + connectionHelper.Prepare(); + connection = connectionHelper.Connection; + meta = new DatabaseMetadata(connection, dialect, false); + } + catch (Exception sqle) + { + log.Error("could not get database metadata", sqle); + throw sqle; + } + configuration.ValidateSchema(dialect, meta); + } + catch (Exception e) + { + log.Error("could not complete schema validation", e); + throw e; + } + finally + { + try + { + connectionHelper.Release(); + } + catch (Exception e) + { + log.Error("Error closing connection", e); + } + + } + } + } +} Property changes on: trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaValidator.cs ___________________________________________________________________ Added: svn:mergeinfo + Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-11-15 19:44:59 UTC (rev 3911) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-11-16 22:22:59 UTC (rev 3912) @@ -887,6 +887,8 @@ <Compile Include="TestCase.cs" /> <Compile Include="TestConfigurationHelper.cs" /> <Compile Include="TestTestCase.cs" /> + <Compile Include="Tools\hbm2ddl\SchemaValidator\SchemaValidateFixture.cs" /> + <Compile Include="Tools\hbm2ddl\SchemaValidator\Version.cs" /> <Compile Include="TransactionTest\TransactionFixture.cs" /> <Compile Include="TransactionTest\TransactionNotificationFixture.cs" /> <Compile Include="TypeParameters\DefaultValueIntegerType.cs" /> @@ -1535,6 +1537,8 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="Tools\hbm2ddl\SchemaValidator\2_Version.hbm.xml" /> + <EmbeddedResource Include="Tools\hbm2ddl\SchemaValidator\1_Version.hbm.xml" /> <EmbeddedResource Include="TypesTest\GenericEnumStringClass.hbm.xml" /> <EmbeddedResource Include="Operations\Competition.hbm.xml" /> <EmbeddedResource Include="Operations\Employer.hbm.xml" /> Added: trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/1_Version.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/1_Version.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/1_Version.hbm.xml 2008-11-16 22:22:59 UTC (rev 3912) @@ -0,0 +1,18 @@ +<?xml version="1.0"?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.Tools.hbm2ddl.SchemaValidator" + assembly="NHibernate.Test"> + + <class name="Version"> + <id name="Id"> + <generator class="NHibernate.Id.TableHiLoGenerator"> + <param name="table">uid_table</param> + <param name="column">next_hi_value_column</param> + </generator> + </id> + <property name="Description"/> + <many-to-one name="Previous"/> + </class> + +</hibernate-mapping> + Added: trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/2_Version.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/2_Version.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/2_Version.hbm.xml 2008-11-16 22:22:59 UTC (rev 3912) @@ -0,0 +1,18 @@ +<?xml version="1.0"?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.Tools.hbm2ddl.SchemaValidator" + assembly="NHibernate.Test"> + + <class name="Version"> + <id name="Id"> + <generator class="NHibernate.Id.TableHiLoGenerator"> + <param name="table">uid_table</param> + <param name="column">next_hi_value_column</param> + </generator> + </id> + <property name="Description"/> + <property name="Name"/> + </class> + +</hibernate-mapping> + Added: trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs 2008-11-16 22:22:59 UTC (rev 3912) @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Text; +using NHibernate.Cfg; +using NHibernate.Tool.hbm2ddl; +using NUnit.Framework; + +namespace NHibernate.Test.Tools.hbm2ddl.SchemaValidator +{ + [TestFixture] + public class SchemaValidateFixture + { + [Test] + public void ShouldVerifySameTable() + { + string resource1 = "NHibernate.Test.Tools.hbm2ddl.SchemaValidator.1_Version.hbm.xml"; + Configuration v1cfg = TestConfigurationHelper.GetDefaultConfiguration(); + using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource1)) + new NHibernate.Tool.hbm2ddl.SchemaExport(v1cfg).Execute(true,true,false,true); + + var v1schemaValidator = new NHibernate.Tool.hbm2ddl.SchemaValidator((v1cfg)); + v1schemaValidator.Validate(); + + } + + [Test] + [ExpectedException(typeof(HibernateException), ExpectedMessage = "Missing column: Name in nhibernate.dbo.Version")] + public void ShouldNotVerifyModifiedTable() + { + string resource1 = "NHibernate.Test.Tools.hbm2ddl.SchemaValidator.1_Version.hbm.xml"; + string resource2 = "NHibernate.Test.Tools.hbm2ddl.SchemaValidator.2_Version.hbm.xml"; + Configuration v1cfg = TestConfigurationHelper.GetDefaultConfiguration(); + Configuration v2cfg = TestConfigurationHelper.GetDefaultConfiguration(); + using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource1)) + v1cfg.AddInputStream(stream); + using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource2)) + v2cfg.AddInputStream(stream); + new NHibernate.Tool.hbm2ddl.SchemaExport(v1cfg).Execute(true, true, false, true); + var v2schemaValidator = new NHibernate.Tool.hbm2ddl.SchemaValidator((v2cfg)); + v2schemaValidator.Validate(); + } + } +} Added: trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/Version.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/Version.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/Version.cs 2008-11-16 22:22:59 UTC (rev 3912) @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NHibernate.Test.Tools.hbm2ddl.SchemaValidator +{ + public class Version + { + private int id; + private string name; + private string description; + private Version previous; + + public virtual int Id + { + get { return id; } + set { id = value; } + } + + public virtual string Name + { + get { return name; } + set { name = value; } + } + + public virtual string Description + { + get { return description; } + set { description = value; } + } + + + public virtual Version Previous + { + get { return previous; } + set { previous = value; } + } + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |