-
Notifications
You must be signed in to change notification settings - Fork 934
/
Copy pathSchemaMetadataUpdater.cs
100 lines (90 loc) · 2.83 KB
/
SchemaMetadataUpdater.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System;
using NHibernate.Cfg;
using NHibernate.Engine;
using NHibernate.Mapping;
using System.Collections.Generic;
using System.Linq;
namespace NHibernate.Tool.hbm2ddl
{
// Candidate to be exstensions of ISessionFactory and Configuration
public static partial class SchemaMetadataUpdater
{
public static void Update(ISessionFactoryImplementor sessionFactory)
{
UpdateDialectKeywords(
sessionFactory.Dialect,
new SuppliedConnectionProviderConnectionHelper(sessionFactory.ConnectionProvider));
}
public static void Update(Configuration configuration, Dialect.Dialect dialect)
{
UpdateDialectKeywords(
dialect,
new ManagedProviderConnectionHelper(configuration.GetDerivedProperties()));
}
static void UpdateDialectKeywords(Dialect.Dialect dialect, IConnectionHelper connectionHelper)
{
dialect.RegisterKeywords(GetReservedWords(dialect, connectionHelper));
}
static IEnumerable<string> GetReservedWords(Dialect.Dialect dialect, IConnectionHelper connectionHelper)
{
connectionHelper.Prepare();
try
{
var metaData = dialect.GetDataBaseSchema(connectionHelper.Connection);
return metaData.GetReservedWords();
}
finally
{
connectionHelper.Release();
}
}
// Since v5
[Obsolete("Use the overload that passes dialect so keywords will be updated and persisted before auto-quoting")]
public static void QuoteTableAndColumns(Configuration configuration)
{
// Instantiates a new instance of the dialect so doesn't benefit from the Update call.
var dialect = Dialect.Dialect.GetDialect(configuration.GetDerivedProperties());
Update(configuration, dialect);
QuoteTableAndColumns(configuration, dialect);
}
public static void QuoteTableAndColumns(Configuration configuration, Dialect.Dialect dialect)
{
// We have to build the mappings in order to quote collection mappings that use a second pass command to be fully initialized
configuration.BuildMappings();
foreach (var cm in configuration.ClassMappings)
{
QuoteTable(cm.Table, dialect);
}
foreach (var cm in configuration.CollectionMappings)
{
QuoteTable(cm.Table, dialect);
QuoteColumns(cm.Key, dialect);
QuoteColumns(cm.Element, dialect);
}
}
private static void QuoteTable(Table table, Dialect.Dialect dialect)
{
if (!table.IsQuoted && dialect.IsKeyword(table.Name))
{
table.IsQuoted = true;
}
QuoteColumns(table.ColumnIterator, dialect);
}
private static void QuoteColumns(IValue value, Dialect.Dialect dialect)
{
if (value == null)
return;
QuoteColumns(value.ColumnIterator.OfType<Column>(), dialect);
}
private static void QuoteColumns(IEnumerable<Column> columns, Dialect.Dialect dialect)
{
foreach (var column in columns)
{
if (!column.IsQuoted && dialect.IsKeyword(column.Name))
{
column.IsQuoted = true;
}
}
}
}
}