/// <summary> /// Constructor for DatabaseConnectionTestProgressInfo /// </summary> /// <param name="connectionTestDetails">The current state of a connection test.</param> /// <param name="connectionTestPercentComplete">A number used to monitor the progress through /// a list of connection tests.</param> public DatabaseConnectionTestProgressInfo( DatabaseConnectionTestDetails connectionTestDetails, int connectionTestPercentComplete) { this.ConnectionTestDetails = connectionTestDetails; this.ConnectionTestPercentComplete = connectionTestPercentComplete; }
/// <summary> /// Runs the database connection tests asynchronously. /// </summary> public async void ConnectionTestsRunAsync() { this.databaseConnectionTestException = null; try { this.databaseConnectionTestList = this.configurationTestRunner.GetDatabaseConnectionTestList(); } catch (Exception ex) { this.databaseConnectionTestException = ex; return; } this.progressBar.Maximum = 100; this.progressBar.Value = 0; this.databaseConnectionTestData = DatabaseConnectionTestDetails.ConvertToDataSet( this.databaseConnectionTestList); this.connectionTestBindingSource.DataSource = this.databaseConnectionTestData; IProgress <DatabaseConnectionTestProgressInfo> progress = new Progress <DatabaseConnectionTestProgressInfo>( (connectionTestProgressInfo) => this.UpdateConnectionTestResult(connectionTestProgressInfo)); this.cancellationTokenSource = new CancellationTokenSource(); await configurationTestRunner.DatabaseConnectionTestsRunAsync( new DatabaseConnectionTestRunner(this.databaseConnectionCheckerFactory), cancellationTokenSource.Token, progress); }
/// <summary> /// Run a database connection test. /// </summary> /// <param name="databaseConnectionTestDetails">Details about the database connection /// test that needs to be executed. The result of the connection test is applied to properties /// of this object.</param> protected override void Run(DatabaseConnectionTestDetails databaseConnectionTestDetails) { IDatabaseConnectionChecker databaseConnectionChecker = this.databaseConnectionCheckerFactory.CreateDatabaseConnectionChecker( databaseConnectionTestDetails.ProviderName); Exception testException = null; databaseConnectionTestDetails.WasTestSuccessful = databaseConnectionChecker.TestConnection( databaseConnectionTestDetails.ConnectionString, out testException); databaseConnectionTestDetails.WasTestRun = true; databaseConnectionTestDetails.ConnectionError = testException; if (testException != null) { databaseConnectionTestDetails.ConnectionErrorText = testException.ToString(); } }
/// <summary> /// Updates the local database connection test datasource according to newly /// reported progress info. /// </summary> /// <param name="connectionTestProgressInfo">A report of newly updated data /// relating to a revcently executed database connection test.</param> private void UpdateConnectionTestResult(DatabaseConnectionTestProgressInfo connectionTestProgressInfo) { DatabaseConnectionTestDetails latestConnectionTest = connectionTestProgressInfo.ConnectionTestDetails; DatabaseConnectionTestDetailsDataSet.DatabaseConnectionTestDetailsRow connectionDataRow = this.databaseConnectionTestData.DatabaseConnectionTestDetails.Rows.Find(latestConnectionTest.ConnectionName) as DatabaseConnectionTestDetailsDataSet.DatabaseConnectionTestDetailsRow; connectionDataRow.WasTestRun = latestConnectionTest.WasTestRun; connectionDataRow.WasTestSuccessful = latestConnectionTest.WasTestSuccessful; connectionDataRow.ConnectionErrorText = latestConnectionTest.ConnectionErrorText; connectionDataRow.TestStatusDescription = latestConnectionTest.TestStatusDescription; this.progressBar.Value = connectionTestProgressInfo.ConnectionTestPercentComplete; if (this.progressBar.Value == this.progressBar.Maximum) { this.ConnectionTestsCompleted(); } }
/// <summary> /// Implements asynchronous database connection tests based on the given /// configuration source. /// </summary> /// <param name="databaseConnectionTestRunnerBase">An imlementation of /// DatabaseConnectionTestRunnerBase which will perform the database tests.</param> /// <param name="cancellationToken">Required to support cancellation of the /// asynchronous database connection tests.</param> /// <param name="progress">Required to support progress reporting on /// the testing of database connections.</param> /// <returns>List of database Connection Test details.</returns> public async override Task <List <DatabaseConnectionTestDetails> > DatabaseConnectionTestsRunAsync( DatabaseConnectionTestRunnerBase databaseConnectionTestRunner, CancellationToken cancellationToken = default(CancellationToken), IProgress <DatabaseConnectionTestProgressInfo> progress = null) { List <Task <DatabaseConnectionTestDetails> > taskList = new List <Task <DatabaseConnectionTestDetails> >(); foreach (DatabaseConnectionTestDetails databaseConnectionTestDetails in this.databaseConnectionTestDetailsList) { Task <DatabaseConnectionTestDetails> newTask = ( databaseConnectionTestRunner.RunAsync( databaseConnectionTestDetails, cancellationToken)); taskList.Add(newTask); } int connectionTestNumber = 1; int connectionTestCount = this.databaseConnectionTestDetailsList.Count; while (taskList.Count > 0) { Task <DatabaseConnectionTestDetails> connectionTestTask = await Task.WhenAny(taskList); taskList.Remove(connectionTestTask); if (connectionTestTask.IsCanceled) { continue; } DatabaseConnectionTestDetails latestConnectionTestDetails = await connectionTestTask; if (progress != null) { int connectionTestPercentComplete = 100 * connectionTestNumber / connectionTestCount; progress.Report(new DatabaseConnectionTestProgressInfo( latestConnectionTestDetails, connectionTestPercentComplete )); connectionTestNumber++; } } return(this.databaseConnectionTestDetailsList); }