예제 #1
0
        public static async Task AddDatabaseRoutine(IDialogCoordinator dialogCoordinator, object dialogContext, SourceCache <Database, string> databasesSourceCache)
        {
            var maxCharLength   = 100;
            var keepPrompting   = true;
            var dialogSettings1 = new MetroDialogSettings()
            {
                AffirmativeButtonText = "Add",
            };

            while (keepPrompting)
            {
                var newDatabaseName = dialogCoordinator.ShowModalInputExternal(dialogContext, "Add Database", $"Enter the database name in the format {_databaseNameFormat}.{Environment.NewLine + _databaseNameFormatNote}", dialogSettings1);
                dialogSettings1.DefaultText = newDatabaseName;
                if (newDatabaseName == null)
                {
                    keepPrompting = false;
                }
                else if (string.IsNullOrWhiteSpace(newDatabaseName))
                {
                    await dialogCoordinator.ShowMessageAsync(dialogContext, "Invalid Database Name", "The new database name cannot be empty or whitespace.");
                }
                else if (newDatabaseName.Length > maxCharLength)
                {
                    await dialogCoordinator.ShowMessageAsync(dialogContext, "Invalid Database Name", $"The new database name cannot be greater than {maxCharLength} characters.");

                    dialogSettings1.DefaultText = newDatabaseName.Substring(0, maxCharLength);
                }
                else if (!newDatabaseName.Contains(AddDatabaseInfo.DatabaseInfoSplitter) || newDatabaseName.Contains("{") || newDatabaseName.Contains("}"))
                {
                    await dialogCoordinator.ShowMessageAsync(dialogContext, "Invalid Database Name", $"The new database name must be in the format {_databaseNameFormat}.{Environment.NewLine + _databaseNameFormatNote}" + Environment.NewLine + $"Example: 198.163.22.10\\MSSQLSERVER,1433{AddDatabaseInfo.DatabaseInfoSplitter}CustomerInfo*username*password");
                }
                else
                {
                    var addDatabaseInfo = new AddDatabaseInfo(newDatabaseName);
                    if (SettingsService.SettingsContainsDatabaseName(addDatabaseInfo.ToFormattedString()))
                    {
                        await dialogCoordinator.ShowMessageAsync(dialogContext, "Database Already Added", $"Database \"{newDatabaseName}\" has already been added.");

                        keepPrompting = false;
                    }
                    else
                    {
                        //Show progress dialog while searching for new database
                        var progressController = await dialogCoordinator.ShowProgressAsync(dialogContext, "Looking for Database", $"Trying to find database \"{newDatabaseName}\"...");

                        progressController.SetIndeterminate();
                        var databaseExists = false;
                        await Task.Run(() =>
                        {
                            databaseExists = TestDatabaseConnection(addDatabaseInfo.ToConnectionString());
                        });

                        await progressController.CloseAsync();

                        //If database can't be found, ask user if they want to continue adding database
                        var dialogSettings = new MetroDialogSettings()
                        {
                            AffirmativeButtonText = "Yes",
                            NegativeButtonText    = "No",
                            DefaultButtonFocus    = MessageDialogResult.Affirmative,
                        };
                        if (!databaseExists && await dialogCoordinator.ShowMessageAsync(dialogContext, "Database Not Found", $"The database \"{newDatabaseName}\" could not be found. Would you still like to add it?", MessageDialogStyle.AffirmativeAndNegative, dialogSettings) != MessageDialogResult.Affirmative)
                        {
                            return;
                        }

                        var newDatabase            = new Database(addDatabaseInfo.ToFormattedString());
                        var serviceOperationHelper = new ServiceOperationHelper(typeof(Database), Plurality.Single, ServiceOperation.Add, "databases source cache", addDatabaseInfo.ToFormattedString());

                        await Task.Run(() =>
                        {
                            try
                            {
                                serviceOperationHelper.LogServiceOperation(ServiceOperationStatus.Attempting);
                                databasesSourceCache.AddOrUpdate(newDatabase);
                                serviceOperationHelper.LogServiceOperation(ServiceOperationStatus.Succeeded);
                            }
                            catch (Exception ex)
                            {
                                serviceOperationHelper.LogServiceOperation(ex.Message);
                            }
                        });

                        keepPrompting = false;

                        if (serviceOperationHelper.ServiceOperationResult.OperationSuceeded)
                        {
                            serviceOperationHelper.ServiceOperationResult = await SettingsService.AddOrUpdateDatabase(newDatabase, true);
                        }

                        if (serviceOperationHelper.ServiceOperationResult.OperationFailed)
                        {
                            await serviceOperationHelper.ServiceOperationResult.ShowUserErrorMessage(dialogCoordinator, dialogContext);
                        }
                    }
                }
            }
        }