Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 570d8eb

Browse files
author
Cormac Brennan
committed
Fix schema related methods in OracleProvider
Several issues were preventing AddColumn, DropColumn from working: -Commands contained terminating semicolon -Variable names in SQL text were prefixed with '@' instead of ':' -Adding a column on Oracle uses the syntax "ADD <columnname>" instead of "ADD COLUMN <columnname>" DoesTableExist and DoesColumnExist had problems when using the Schema attribute: -The views USER_TABLES and USER_TAB_COLS only show objects owned by the current user Replaced with ALL_TABLES and ALL_TAB_COLS respectively Linked SchemaTests into Oracle test project to verify fixes
1 parent 5fb3368 commit 570d8eb

File tree

3 files changed

+49
-7
lines changed

3 files changed

+49
-7
lines changed

src/ServiceStack.OrmLite.Oracle.Tests/ServiceStack.OrmLite.Oracle.Tests.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,9 @@
292292
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\RowVersionTests.cs">
293293
<Link>RowVersionTests.cs</Link>
294294
</Compile>
295+
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\SchemaTests.cs">
296+
<Link>SchemaTests.cs</Link>
297+
</Compile>
295298
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\Shared\ApiUtilExtensions.cs">
296299
<Link>Shared\ApiUtilExtensions.cs</Link>
297300
</Compile>

src/ServiceStack.OrmLite.Oracle/OracleOrmLiteDialectProvider.cs

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1192,11 +1192,37 @@ public override IDbDataParameter CreateParam()
11921192
return _factory.CreateParameter();
11931193
}
11941194

1195+
public override string ToAddColumnStatement(Type modelType, FieldDefinition fieldDef)
1196+
{
1197+
var command = base.ToAddColumnStatement(modelType, fieldDef);
1198+
1199+
command = RemoveTerminatingSemicolon(command);
1200+
1201+
return command.Replace("ADD COLUMN", "ADD");
1202+
}
1203+
1204+
private static string RemoveTerminatingSemicolon(string command)
1205+
{
1206+
command = command.Trim();
1207+
1208+
if (command[command.Length - 1] == ';') command = command.Substring(0, command.Length - 1);
1209+
1210+
return command;
1211+
}
1212+
1213+
protected override string ToDropColumnStatement(Type modelType, string columnName, IOrmLiteDialectProvider provider)
1214+
{
1215+
var command = base.ToDropColumnStatement(modelType, columnName, provider);
1216+
1217+
return RemoveTerminatingSemicolon(command);
1218+
}
1219+
11951220
public override bool DoesTableExist(IDbCommand dbCmd, string tableName, string schema=null)
11961221
{
11971222
if (!WillQuote(tableName)) tableName = tableName.ToUpper();
11981223

1199-
var sql = "SELECT count(*) FROM USER_TABLES WHERE TABLE_NAME = {0}".SqlFmt(tableName);
1224+
tableName = RemoveSchemaName(tableName);
1225+
var sql = "SELECT count(*) FROM ALL_TABLES WHERE TABLE_NAME = {0}".SqlFmt(tableName);
12001226

12011227
if (schema != null)
12021228
sql += " AND OWNER = {0}".SqlFmt(schema);
@@ -1207,17 +1233,25 @@ public override bool DoesTableExist(IDbCommand dbCmd, string tableName, string s
12071233
return result > 0;
12081234
}
12091235

1236+
private static string RemoveSchemaName(string tableName)
1237+
{
1238+
var indexOfPeriod = tableName.IndexOf(".", StringComparison.Ordinal);
1239+
return indexOfPeriod < 0 ? tableName : tableName.Substring(indexOfPeriod + 1);
1240+
}
1241+
12101242
public override bool DoesColumnExist(IDbConnection db, string columnName, string tableName, string schema = null)
12111243
{
12121244
if (!WillQuote(tableName))
12131245
tableName = tableName.ToUpper();
12141246

1215-
var sql = "SELECT count(*) from user_tab_cols"
1216-
+ " WHERE table_name = @tableName"
1217-
+ " AND column_name = @columnName";
1247+
columnName = columnName.ToUpper();
1248+
tableName = RemoveSchemaName(tableName);
1249+
var sql = "SELECT count(*) from all_tab_cols"
1250+
+ " WHERE table_name = :tableName"
1251+
+ " AND upper(column_name) = :columnName";
12181252

12191253
if (schema != null)
1220-
sql += " AND OWNER = @schema";
1254+
sql += " AND OWNER = :schema";
12211255

12221256
var result = db.SqlScalar<long>(sql, new { tableName, columnName, schema });
12231257

src/ServiceStack.OrmLite/OrmLiteDialectProviderBase.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1544,12 +1544,17 @@ public virtual string ToRowCountStatement(string innerSql)
15441544
public virtual void DropColumn(IDbConnection db, Type modelType, string columnName)
15451545
{
15461546
var provider = db.GetDialectProvider();
1547-
var command = $"ALTER TABLE {provider.GetQuotedTableName(modelType.GetModelDefinition().ModelName)} " +
1548-
$"DROP COLUMN {provider.GetQuotedColumnName(columnName)};";
1547+
var command = ToDropColumnStatement(modelType, columnName, provider);
15491548

15501549
db.ExecuteSql(command);
15511550
}
15521551

1552+
protected virtual string ToDropColumnStatement(Type modelType, string columnName, IOrmLiteDialectProvider provider)
1553+
{
1554+
return $"ALTER TABLE {provider.GetQuotedTableName(modelType.GetModelDefinition().ModelName)} " +
1555+
$"DROP COLUMN {provider.GetQuotedColumnName(columnName)};";
1556+
}
1557+
15531558
//Async API's, should be overrided by Dialect Providers to use .ConfigureAwait(false)
15541559
//Default impl below uses TaskAwaiter shim in async.cs
15551560

0 commit comments

Comments
 (0)