Skip to content

Commit e05d683

Browse files
author
Alex Henderson
committed
Improved error messages when provider factory fails to create a migration provider.
Implemented full support for managed ODP.Net driver.
1 parent 705158c commit e05d683

File tree

5 files changed

+122
-3
lines changed

5 files changed

+122
-3
lines changed

src/Migrator.Providers/Impl/Oracle/OracleDialect.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
namespace Migrator.Providers.Oracle
77
{
8-
public class OracleDialect : Dialect
8+
public class OracleDialect : Dialect
99
{
1010
public OracleDialect()
1111
{
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using Migrator.Framework;
2+
3+
namespace Migrator.Providers.Oracle
4+
{
5+
public class OracleManagedDriverDialect : OracleDialect
6+
{
7+
public override ITransformationProvider GetTransformationProvider(Dialect dialect, string connectionString, string defaultSchema)
8+
{
9+
return new OracleManagedDriverTransformationProvider(dialect, connectionString, defaultSchema);
10+
}
11+
}
12+
}

src/Migrator.Providers/Migrator.Providers-vs2010.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@
103103
<Compile Include="ForeignKeyConstraintMapper.cs" />
104104
<Compile Include="Impl\Mysql\MysqlDialect.cs" />
105105
<Compile Include="Impl\Mysql\MySqlTransformationProvider.cs" />
106+
<Compile Include="Impl\Oracle\OracleManagedDriverDialect.cs" />
106107
<Compile Include="Impl\Oracle\OracleColumnPropertiesMapper.cs" />
107108
<Compile Include="Impl\Oracle\OracleManagedDriverTransformationProvider.cs" />
108109
<Compile Include="Impl\PostgreSQL\PostgreSQL82Dialect.cs" />
@@ -121,6 +122,7 @@
121122
<Compile Include="TransformationProvider.cs" />
122123
<Compile Include="TypeNames.cs" />
123124
<Compile Include="Utility\MySqlServerUtility.cs" />
125+
<Compile Include="Utility\OracleManagedDriverServerUtility.cs" />
124126
<Compile Include="Utility\OracleServerUtility.cs" />
125127
<Compile Include="Utility\PostgreSqlServerUtility.cs" />
126128
<Compile Include="Utility\SqlServerUtility.cs" />
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Data;
4+
using System.Linq;
5+
using Oracle.ManagedDataAccess.Client;
6+
7+
namespace Migrator.Providers.Utility
8+
{
9+
public static class OracleManagedDriverServerUtility
10+
{
11+
static readonly string[] _specialTableNames = new[]
12+
{
13+
"DEF$_AQCALL",
14+
"DEF$_AQERROR",
15+
"SQLPLUS_PRODUCT_PROFILE",
16+
"HELP",
17+
"MVIEW$_ADV_INDEX",
18+
"MVIEW$_ADV_PARTITION"
19+
};
20+
21+
public static void RemoveAllTablesFromDefaultDatabase(string connectionString)
22+
{
23+
using (var connection = new OracleConnection(connectionString))
24+
{
25+
connection.Open();
26+
27+
string[] allTablesToDrop = GetTablesToDrop(connection).ToArray();
28+
29+
foreach (string table in allTablesToDrop)
30+
{
31+
string statement = string.Format("drop table \"{0}\" cascade constraints", table);
32+
33+
ExecuteDropCommand(connection, statement);
34+
}
35+
}
36+
}
37+
38+
static void ExecuteDropCommand(OracleConnection connection, string statement)
39+
{
40+
using (var dropCmd = new OracleCommand(statement, connection))
41+
{
42+
dropCmd.ExecuteNonQuery();
43+
}
44+
}
45+
46+
public static int GetTableCount(string connectionString)
47+
{
48+
using (var connection = new OracleConnection(connectionString))
49+
{
50+
connection.Open();
51+
52+
return GetTablesToDrop(connection).Count();
53+
}
54+
}
55+
56+
static string ExtractUserIDFromConnectionString(string connectionString)
57+
{
58+
59+
string[] values = connectionString.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
60+
61+
var match = values.FirstOrDefault(v => v.StartsWith("User ID=", StringComparison.InvariantCultureIgnoreCase));
62+
63+
if (match != null)
64+
{
65+
string userName = match.Split(new[] { "=" }, StringSplitOptions.None)[1];
66+
return userName;
67+
}
68+
69+
return null;
70+
}
71+
72+
public static IEnumerable<string> GetTablesToDrop(OracleConnection connection)
73+
{
74+
var schema = ExtractUserIDFromConnectionString(connection.ConnectionString);
75+
76+
string query = string.Format(@"select * from user_tables where TABLESPACE_NAME = '{0}'", schema);
77+
78+
using (var getDropAllTablesCommand = new OracleCommand(query, connection))
79+
{
80+
getDropAllTablesCommand.CommandType = CommandType.Text;
81+
82+
using (OracleDataReader reader = getDropAllTablesCommand.ExecuteReader())
83+
{
84+
while (reader.Read() && (reader[0] != null && !Convert.IsDBNull(reader[0])))
85+
{
86+
string tableName = reader[0].ToString();
87+
88+
if (!_specialTableNames.Contains(tableName))
89+
{
90+
yield return tableName;
91+
}
92+
}
93+
}
94+
}
95+
}
96+
}
97+
}

src/Migrator/ProviderFactory.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,17 @@ static ProviderFactory()
3535

3636
public static ITransformationProvider Create(string providerName, string connectionString, string defaultSchema)
3737
{
38-
Dialect dialectInstance = DialectForProvider(providerName);
38+
try
39+
{
40+
Dialect dialectInstance = DialectForProvider(providerName);
3941

40-
return dialectInstance.NewProviderForDialect(connectionString, defaultSchema);
42+
return dialectInstance.NewProviderForDialect(connectionString, defaultSchema);
43+
}
44+
catch (Exception ex)
45+
{
46+
throw new MigrationException(string.Format("Failed to create migration provider from arguments.\r\n providerName: {0}\r\n connectionString: {1}\r\n defaultSchema: {2}\r\n\r\nError message was: {3}",
47+
providerName,connectionString,defaultSchema,ex.Message),ex);
48+
}
4149
}
4250

4351
public static Dialect DialectForProvider(string providerName)

0 commit comments

Comments
 (0)