Index: Ringtoets/Common/src/Ringtoets.Common.IO/HydraRing/HydraRingSettingsDatabaseReader.cs =================================================================== diff -u -rf54cec4a09c4f049ce5d40a5c0fca1c52f516178 -rc230da5631e073c87657dd0f32aa7c3651c427df --- Ringtoets/Common/src/Ringtoets.Common.IO/HydraRing/HydraRingSettingsDatabaseReader.cs (.../HydraRingSettingsDatabaseReader.cs) (revision f54cec4a09c4f049ce5d40a5c0fca1c52f516178) +++ Ringtoets/Common/src/Ringtoets.Common.IO/HydraRing/HydraRingSettingsDatabaseReader.cs (.../HydraRingSettingsDatabaseReader.cs) (revision c230da5631e073c87657dd0f32aa7c3651c427df) @@ -31,7 +31,6 @@ using Ringtoets.Common.IO.Properties; using Ringtoets.HydraRing.Calculation.Data; using Ringtoets.HydraRing.Calculation.Data.Settings; -using Ringtoets.HydraRing.Calculation.Readers; namespace Ringtoets.Common.IO.HydraRing { Index: Ringtoets/Common/src/Ringtoets.Common.IO/HydraRing/HydraRingSettingsDatabaseValidator.cs =================================================================== diff -u -re4c8b63e26051b6bd120260482a565a06635743e -rc230da5631e073c87657dd0f32aa7c3651c427df --- Ringtoets/Common/src/Ringtoets.Common.IO/HydraRing/HydraRingSettingsDatabaseValidator.cs (.../HydraRingSettingsDatabaseValidator.cs) (revision e4c8b63e26051b6bd120260482a565a06635743e) +++ Ringtoets/Common/src/Ringtoets.Common.IO/HydraRing/HydraRingSettingsDatabaseValidator.cs (.../HydraRingSettingsDatabaseValidator.cs) (revision c230da5631e073c87657dd0f32aa7c3651c427df) @@ -19,8 +19,14 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SQLite; +using System.Linq; using Core.Common.Base.IO; using Core.Common.IO.Readers; +using Ringtoets.Common.IO.Properties; namespace Ringtoets.Common.IO.HydraRing { @@ -41,5 +47,48 @@ /// /// public HydraRingSettingsDatabaseValidator(string databaseFilePath) : base(databaseFilePath) {} + + /// + /// Verifies that the schema of the opened settings database is valid. + /// + /// true when the schema is valid; false otherwise. + public bool ValidateSchema() + { + return ContainsRequiredTables(GetColumnDefinitions(Connection)); + } + + private static bool ContainsRequiredTables(List> definitions) + { + return GetValidSchema().All(definitions.Contains); + } + + private static List> GetValidSchema() + { + using (var validSchemaConnection = new SQLiteConnection("Data Source=:memory:")) + using (SQLiteCommand command = validSchemaConnection.CreateCommand()) + { + validSchemaConnection.Open(); + command.CommandText = Resources.settings_schema; + command.ExecuteNonQuery(); + return GetColumnDefinitions(validSchemaConnection); + } + } + + private static List> GetColumnDefinitions(SQLiteConnection connection) + { + DataTable columns = connection.GetSchema("COLUMNS"); + + var definitions = new List>(); + for (var i = 0; i < columns.Rows.Count; i++) + { + DataRow dataRow = columns.Rows[i]; + definitions.Add( + Tuple.Create( + ((string) dataRow["TABLE_NAME"]).ToLower(), + ((string) dataRow["COLUMN_NAME"]).ToLower() + )); + } + return definitions; + } } -} +} \ No newline at end of file Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/HydraRing/HydraRingSettingsDatabaseReaderTest.cs =================================================================== diff -u -r9b1164ba0edcb2b6cfaf5e1271db2ae864f1c7d2 -rc230da5631e073c87657dd0f32aa7c3651c427df --- Ringtoets/Common/test/Ringtoets.Common.IO.Test/HydraRing/HydraRingSettingsDatabaseReaderTest.cs (.../HydraRingSettingsDatabaseReaderTest.cs) (revision 9b1164ba0edcb2b6cfaf5e1271db2ae864f1c7d2) +++ Ringtoets/Common/test/Ringtoets.Common.IO.Test/HydraRing/HydraRingSettingsDatabaseReaderTest.cs (.../HydraRingSettingsDatabaseReaderTest.cs) (revision c230da5631e073c87657dd0f32aa7c3651c427df) @@ -30,7 +30,6 @@ using Ringtoets.Common.IO.HydraRing; using Ringtoets.HydraRing.Calculation.Data; using Ringtoets.HydraRing.Calculation.Data.Settings; -using Ringtoets.HydraRing.Calculation.Readers; namespace Ringtoets.Common.IO.Test.HydraRing { Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/HydraRing/HydraRingSettingsDatabaseValidatorTest.cs =================================================================== diff -u -re4c8b63e26051b6bd120260482a565a06635743e -rc230da5631e073c87657dd0f32aa7c3651c427df --- Ringtoets/Common/test/Ringtoets.Common.IO.Test/HydraRing/HydraRingSettingsDatabaseValidatorTest.cs (.../HydraRingSettingsDatabaseValidatorTest.cs) (revision e4c8b63e26051b6bd120260482a565a06635743e) +++ Ringtoets/Common/test/Ringtoets.Common.IO.Test/HydraRing/HydraRingSettingsDatabaseValidatorTest.cs (.../HydraRingSettingsDatabaseValidatorTest.cs) (revision c230da5631e073c87657dd0f32aa7c3651c427df) @@ -48,5 +48,37 @@ Assert.IsInstanceOf(validator); } } + + [Test] + public void ValidateSchema_ValidDatabase_ReturnTrue() + { + // Setup + string completeDatabasePath = Path.Combine(directoryPath, "withoutPreprocessor.config.sqlite"); + + using (var validator = new HydraRingSettingsDatabaseValidator(completeDatabasePath)) + { + // Call + bool valid = validator.ValidateSchema(); + + // Assert + Assert.IsTrue(valid); + } + } + + [Test] + public void ValidateSchema_InvalidDatabase_ReturnFalse() + { + // Setup + string completeDatabasePath = Path.Combine(directoryPath, "invalid-settings-schema.config.sqlite"); + + using (var validator = new HydraRingSettingsDatabaseValidator(completeDatabasePath)) + { + // Call + bool valid = validator.ValidateSchema(); + + // Assert + Assert.IsFalse(valid); + } + } } } \ No newline at end of file Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/test-data/HydraRingSettingsDatabaseValidator/invalid-settings-schema.config.sqlite =================================================================== diff -u Binary files differ