@@ -27,6 +27,8 @@ public abstract class AnsiSqlDatabase : IDatabase
27
27
private DbConnection ? _adminConnection ;
28
28
private readonly ISyntax _syntax ;
29
29
30
+ protected bool LowercaseTableNames { get ; set ; }
31
+
30
32
private IDictionary < string , string > ? _scriptsRunCache ;
31
33
32
34
protected AnsiSqlDatabase ( ILogger logger , ISyntax syntax )
@@ -48,9 +50,9 @@ protected AnsiSqlDatabase(ILogger logger, ISyntax syntax)
48
50
49
51
public string StatementSeparatorRegex => _syntax . StatementSeparatorRegex ;
50
52
51
- public string ScriptsRunTable => _syntax . TableWithSchema ( SchemaName , "ScriptsRun" ) ;
52
- public string ScriptsRunErrorsTable => _syntax . TableWithSchema ( SchemaName , "ScriptsRunErrors" ) ;
53
- public string VersionTable => _syntax . TableWithSchema ( SchemaName , "Version" ) ;
53
+ public string ScriptsRunTable => _syntax . TableWithSchema ( SchemaName , ScriptsRunTableName ) ;
54
+ public string ScriptsRunErrorsTable => _syntax . TableWithSchema ( SchemaName , ScriptsRunErrorsTableName ) ;
55
+ public string VersionTable => _syntax . TableWithSchema ( SchemaName , VersionTableName ) ;
54
56
55
57
public virtual Task InitializeConnections ( GrateConfiguration configuration )
56
58
{
@@ -237,13 +239,15 @@ protected async Task WaitUntilDatabaseIsReady()
237
239
238
240
public async Task RunSupportTasks ( )
239
241
{
242
+ LowercaseTableNames = await CheckIfExistingTablesAreLowercase ( ) ;
243
+
240
244
await CreateRunSchema ( ) ;
241
245
await CreateScriptsRunTable ( ) ;
242
246
await CreateScriptsRunErrorsTable ( ) ;
243
247
await CreateVersionTable ( ) ;
244
248
await AddStatusColumnToVersionTable ( ) ;
245
- }
246
-
249
+ }
250
+
247
251
private async Task CreateRunSchema ( )
248
252
{
249
253
if ( SupportsSchemas && ! await RunSchemaExists ( ) )
@@ -274,7 +278,7 @@ protected virtual async Task CreateScriptsRunTable()
274
278
entry_date { _syntax . TimestampType } NULL,
275
279
modified_date { _syntax . TimestampType } NULL,
276
280
entered_by { _syntax . VarcharType } (50) NULL
277
- { _syntax . PrimaryKeyConstraint ( "ScriptsRun" , "id" ) }
281
+ { _syntax . PrimaryKeyConstraint ( ScriptsRunTableName , "id" ) }
278
282
)" ;
279
283
280
284
if ( ! await ScriptsRunTableExists ( ) )
@@ -297,7 +301,7 @@ protected virtual async Task CreateScriptsRunErrorsTable()
297
301
entry_date { _syntax . TimestampType } NULL,
298
302
modified_date { _syntax . TimestampType } NULL,
299
303
entered_by { _syntax . VarcharType } (50) NULL
300
- { _syntax . PrimaryKeyConstraint ( "ScriptsRunErrors" , "id" ) }
304
+ { _syntax . PrimaryKeyConstraint ( ScriptsRunErrorsTableName , "id" ) }
301
305
)" ;
302
306
if ( ! await ScriptsRunErrorsTableExists ( ) )
303
307
{
@@ -315,7 +319,7 @@ protected virtual async Task CreateVersionTable()
315
319
entry_date { _syntax . TimestampType } NULL,
316
320
modified_date { _syntax . TimestampType } NULL,
317
321
entered_by { _syntax . VarcharType } (50) NULL
318
- { _syntax . PrimaryKeyConstraint ( "Version" , "id" ) }
322
+ { _syntax . PrimaryKeyConstraint ( VersionTableName , "id" ) }
319
323
)" ;
320
324
if ( ! await VersionTableExists ( ) )
321
325
{
@@ -335,23 +339,39 @@ ALTER TABLE {VersionTable}
335
339
}
336
340
}
337
341
338
- protected async Task < bool > ScriptsRunTableExists ( ) => await TableExists ( SchemaName , "ScriptsRun" ) ;
339
- protected async Task < bool > ScriptsRunErrorsTableExists ( ) => await TableExists ( SchemaName , "ScriptsRunErrors" ) ;
340
- public async Task < bool > VersionTableExists ( ) => await TableExists ( SchemaName , "Version" ) ;
341
- protected async Task < bool > StatusColumnInVersionTableExists ( ) => await ColumnExists ( SchemaName , "Version" , "status" ) ;
342
+ protected async Task < bool > ScriptsRunTableExists ( ) => await TableExists ( SchemaName , ScriptsRunTableName ) ;
343
+ protected async Task < bool > ScriptsRunErrorsTableExists ( ) => await TableExists ( SchemaName , ScriptsRunErrorsTableName ) ;
344
+ public async Task < bool > VersionTableExists ( ) => await TableExists ( SchemaName , VersionTableName ) ;
345
+ protected async Task < bool > StatusColumnInVersionTableExists ( ) => await ColumnExists ( SchemaName , VersionTableName , "status" ) ;
342
346
347
+ /// <summary>
348
+ /// Returns name in db if table exists.
349
+ /// </summary>
350
+ /// <param name="schemaName"></param>
351
+ /// <param name="tableName"></param>
352
+ /// <returns></returns>
343
353
public async Task < bool > TableExists ( string schemaName , string tableName )
344
354
{
345
355
var fullTableName = SupportsSchemas ? tableName : _syntax . TableWithSchema ( schemaName , tableName ) ;
346
356
var tableSchema = SupportsSchemas ? schemaName : DatabaseName ;
347
357
348
358
string existsSql = ExistsSql ( tableSchema , fullTableName ) ;
349
359
350
- var res = await ExecuteScalarAsync < object > ( ActiveConnection , existsSql ) ;
360
+ var res = await ExecuteScalarAsync < string > ( ActiveConnection , existsSql ) ;
351
361
352
362
return ! DBNull . Value . Equals ( res ) && res is not null ;
353
363
}
354
364
365
+ public async Task < string ? > GetExistingTableName ( string schemaName , string tableName )
366
+ {
367
+ var fullTableName = SupportsSchemas ? tableName : _syntax . TableWithSchema ( schemaName , tableName ) ;
368
+ var tableSchema = SupportsSchemas ? schemaName : DatabaseName ;
369
+
370
+ string existsSql = ExistsSql ( tableSchema , fullTableName ) ;
371
+
372
+ return await ExecuteScalarAsync < string ? > ( ActiveConnection , existsSql ) ;
373
+ }
374
+
355
375
private async Task < bool > ColumnExists ( string schemaName , string tableName , string columnName )
356
376
{
357
377
var fullTableName = SupportsSchemas ? tableName : _syntax . TableWithSchema ( schemaName , tableName ) ;
@@ -366,10 +386,10 @@ private async Task<bool> ColumnExists(string schemaName, string tableName, strin
366
386
protected virtual string ExistsSql ( string tableSchema , string fullTableName )
367
387
{
368
388
return $@ "
369
- SELECT * FROM information_schema.tables
389
+ SELECT table_name FROM information_schema.tables
370
390
WHERE
371
391
table_schema = '{ tableSchema } ' AND
372
- table_name = '{ fullTableName } '
392
+ LOWER( table_name) = LOWER( '{ fullTableName } ')
373
393
" ;
374
394
}
375
395
@@ -615,6 +635,12 @@ INSERT INTO {ScriptsRunErrorsTable}
615
635
await ExecuteAsync ( ActiveConnection , insertSql , scriptRunErrors ) ;
616
636
}
617
637
638
+ private async Task < bool > CheckIfExistingTablesAreLowercase ( )
639
+ {
640
+ var tn = await GetExistingTableName ( SchemaName , "ScriptsRun" ) ;
641
+ return tn == "scriptsrun" ;
642
+ }
643
+
618
644
private static async Task Close ( DbConnection ? conn )
619
645
{
620
646
if ( conn ? . State == ConnectionState . Open )
@@ -674,4 +700,10 @@ public async ValueTask DisposeAsync()
674
700
}
675
701
676
702
public abstract Task RestoreDatabase ( string backupPath ) ;
703
+
704
+ private string ScriptsRunTableName => TableName ( "ScriptsRun" ) ;
705
+ private string VersionTableName => TableName ( "Version" ) ;
706
+ private string ScriptsRunErrorsTableName => TableName ( "ScriptsRunErrors" ) ;
707
+
708
+ public virtual string TableName ( string tableName ) => LowercaseTableNames ? tableName . ToLowerInvariant ( ) : tableName ;
677
709
}
0 commit comments