|
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.
|