Address warnings and (some) nullables (#2013)

This commit is contained in:
Cheena Malhotra
2023-04-18 20:57:13 -07:00
committed by GitHub
parent d56f2309da
commit 648d7dbd3c
83 changed files with 674 additions and 588 deletions

View File

@@ -3,8 +3,6 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
#nullable disable
using System;
using System.Collections.Generic;
using System.Diagnostics;
@@ -49,9 +47,9 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
/// <returns></returns>
public RestorePlanDetailInfo CreateOptionInfo(string optionKey, IRestoreDatabaseTaskDataObject restoreDataObject)
{
if(optionBuilders.ContainsKey(optionKey))
if (optionBuilders.TryGetValue(optionKey, out OptionBuilder? value))
{
return Create(optionKey, restoreDataObject, optionBuilders[optionKey]);
return Create(optionKey, restoreDataObject, value);
}
else
{
@@ -68,9 +66,9 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
/// <param name="optionInfo"></param>
public void UpdateOption(string optionKey, IRestoreDatabaseTaskDataObject restoreDataObject, RestorePlanDetailInfo optionInfo)
{
if (optionBuilders.ContainsKey(optionKey))
if (optionBuilders.TryGetValue(optionKey, out OptionBuilder? value))
{
var builder = optionBuilders[optionKey];
var builder = value;
var currentValue = builder.CurrentValueFunction(restoreDataObject);
var defaultValue = builder.DefaultValueFunction(restoreDataObject);
var validateResult = builder.ValidateFunction(restoreDataObject, currentValue, defaultValue);
@@ -102,9 +100,8 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
{
if (restoreDataObject != null)
{
if (optionBuilders.ContainsKey(optionKey))
if (optionBuilders.TryGetValue(optionKey, out OptionBuilder? builder))
{
var builder = optionBuilders[optionKey];
if (restoreDataObject.RestoreParams != null && restoreDataObject.RestoreParams.Options.ContainsKey(optionKey))
{
try
@@ -149,15 +146,14 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
public string ValidateOption(string optionKey, IRestoreDatabaseTaskDataObject restoreDataObject)
{
string errorMessage = string.Empty;
if (optionBuilders.ContainsKey(optionKey))
if (optionBuilders.TryGetValue(optionKey, out OptionBuilder? builder))
{
var builder = optionBuilders[optionKey];
var currentValue = builder.CurrentValueFunction(restoreDataObject);
var defaultValue = builder.DefaultValueFunction(restoreDataObject);
OptionValidationResult result = optionBuilders[optionKey].ValidateFunction(restoreDataObject, currentValue, defaultValue);
if (result.IsReadOnly)
{
if(!ValueEqualsDefault(currentValue, defaultValue))
if (!ValueEqualsDefault(currentValue, defaultValue))
{
builder.SetValueFunction(restoreDataObject, defaultValue);
errorMessage = $"{optionKey} is ready only and cannot be modified";
@@ -180,15 +176,11 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
private bool ValueEqualsDefault(object currentValue, object defaultValue)
{
if(currentValue == null && defaultValue == null)
if (currentValue == null)
{
return true;
return defaultValue == null;
}
if(currentValue == null && defaultValue != null)
{
return false;
}
if (currentValue != null && defaultValue == null)
else if (defaultValue == null)
{
return false;
}
@@ -200,311 +192,311 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
{
Register(RestoreOptionsHelper.RelocateDbFiles,
new OptionBuilder
{
DefaultValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
(
defaultValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return false;
},
CurrentValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
currentValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.RelocateAllFiles;
},
ValidateFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
validateFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
{
return new OptionValidationResult
{
IsReadOnly = restoreDataObject.DbFiles.Count == 0
};
},
SetValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
setValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
{
restoreDataObject.RelocateAllFiles = restoreDataObject.RestoreParams.GetOptionValue<bool>(RestoreOptionsHelper.RelocateDbFiles);
return true;
}
});
));
Register(RestoreOptionsHelper.DataFileFolder,
new OptionBuilder
{
DefaultValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
(
defaultValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.DefaultDataFileFolder;
},
CurrentValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
currentValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.DataFilesFolder;
},
ValidateFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
validateFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
{
return new OptionValidationResult
{
IsReadOnly = !restoreDataObject.RelocateAllFiles
};
},
SetValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
setValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
{
restoreDataObject.DataFilesFolder = GetValueAs<string>(value);
return true;
}
});
));
Register(RestoreOptionsHelper.LogFileFolder,
new OptionBuilder
{
DefaultValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
(
defaultValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.DefaultLogFileFolder;
},
CurrentValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
currentValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.LogFilesFolder;
},
ValidateFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
validateFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
{
return new OptionValidationResult
{
IsReadOnly = !restoreDataObject.RelocateAllFiles
};
},
SetValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
setValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
{
restoreDataObject.LogFilesFolder = GetValueAs<string>(value);
return true;
}
});
));
Register(RestoreOptionsHelper.ReplaceDatabase,
new OptionBuilder
{
DefaultValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
(
defaultValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return false;
},
CurrentValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
currentValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.RestoreOptions.ReplaceDatabase;
},
ValidateFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
validateFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
{
return new OptionValidationResult();
},
SetValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
setValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
{
restoreDataObject.RestoreOptions.ReplaceDatabase = GetValueAs<bool>(value);
return true;
}
});
));
Register(RestoreOptionsHelper.KeepReplication,
new OptionBuilder
{
DefaultValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
(
defaultValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return false;
},
CurrentValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
currentValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.RestoreOptions.KeepReplication;
},
ValidateFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
validateFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
{
return new OptionValidationResult()
{
IsReadOnly = restoreDataObject.RestoreOptions.RecoveryState == DatabaseRecoveryState.WithNoRecovery
};
},
SetValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
setValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
{
restoreDataObject.RestoreOptions.KeepReplication = GetValueAs<bool>(value);
return true;
}
});
));
Register(RestoreOptionsHelper.SetRestrictedUser,
new OptionBuilder
{
DefaultValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
(
defaultValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return false;
},
CurrentValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
currentValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.RestoreOptions.SetRestrictedUser;
},
ValidateFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
validateFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
{
return new OptionValidationResult()
{
};
},
SetValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
setValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
{
restoreDataObject.RestoreOptions.SetRestrictedUser = GetValueAs<bool>(value);
return true;
}
});
));
Register(RestoreOptionsHelper.RecoveryState,
new OptionBuilder
{
DefaultValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
(
defaultValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return DatabaseRecoveryState.WithRecovery.ToString();
},
CurrentValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
currentValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.RestoreOptions.RecoveryState.ToString();
},
ValidateFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
validateFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
{
return new OptionValidationResult()
{
};
},
SetValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
setValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
{
restoreDataObject.RestoreOptions.RecoveryState = GetValueAs<DatabaseRecoveryState>(value);
return true;
}
});
));
Register(RestoreOptionsHelper.StandbyFile,
new OptionBuilder
{
DefaultValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
(
defaultValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.DefaultStandbyFile;
},
CurrentValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
currentValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.RestoreOptions.StandByFile;
},
ValidateFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
validateFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
{
return new OptionValidationResult()
{
IsReadOnly = restoreDataObject.RestoreOptions.RecoveryState != DatabaseRecoveryState.WithStandBy
};
},
SetValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
setValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
{
restoreDataObject.RestoreOptions.StandByFile = GetValueAs<string>(value);
return true;
}
});
));
Register(RestoreOptionsHelper.BackupTailLog,
new OptionBuilder
{
DefaultValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
(
defaultValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.IsTailLogBackupPossible;
},
CurrentValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
currentValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.BackupTailLog;
},
ValidateFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
validateFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
{
return new OptionValidationResult()
{
IsReadOnly = !restoreDataObject.IsTailLogBackupPossible
};
},
SetValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
setValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
{
restoreDataObject.BackupTailLog = GetValueAs<bool>(value);
return true;
}
});
));
Register(RestoreOptionsHelper.TailLogBackupFile,
new OptionBuilder
{
DefaultValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
(
defaultValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.DefaultTailLogbackupFile;
},
CurrentValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
currentValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.TailLogBackupFile;
},
ValidateFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
validateFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
{
return new OptionValidationResult()
{
IsReadOnly = !restoreDataObject.BackupTailLog | !restoreDataObject.IsTailLogBackupPossible
};
},
SetValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
setValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
{
restoreDataObject.TailLogBackupFile = GetValueAs<string>(value);
return true;
}
});
));
Register(RestoreOptionsHelper.TailLogWithNoRecovery,
new OptionBuilder
{
DefaultValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
(
defaultValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.IsTailLogBackupWithNoRecoveryPossible;
},
CurrentValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
currentValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.TailLogWithNoRecovery;
},
ValidateFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
validateFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
{
return new OptionValidationResult()
{
IsReadOnly = !restoreDataObject.BackupTailLog | !restoreDataObject.IsTailLogBackupWithNoRecoveryPossible
};
},
SetValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
setValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
{
restoreDataObject.TailLogWithNoRecovery = GetValueAs<bool>(value);
return true;
}
});
));
Register(RestoreOptionsHelper.CloseExistingConnections,
new OptionBuilder
{
DefaultValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
(
defaultValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return false;
},
CurrentValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
currentValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.CloseExistingConnections;
},
ValidateFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
validateFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
{
return new OptionValidationResult()
{
IsReadOnly = !restoreDataObject.CanDropExistingConnections
};
},
SetValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
setValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
{
restoreDataObject.CloseExistingConnections = GetValueAs<bool>(value);
return true;
}
});
));
Register(RestoreOptionsHelper.SourceDatabaseName,
new OptionBuilder
{
DefaultValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
(
defaultValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.DefaultSourceDbName;
},
CurrentValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
currentValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.SourceDatabaseName;
},
ValidateFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
validateFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
{
string errorMessage = string.Empty;
var sourceDbNames = restoreDataObject.SourceDbNames;
@@ -514,41 +506,41 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
}
return new OptionValidationResult()
{
ErrorMessage = errorMessage
ErrorMessage = errorMessage
};
},
SetValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
setValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
{
restoreDataObject.SourceDatabaseName = GetValueAs<string>(value);
return true;
}
});
));
Register(RestoreOptionsHelper.TargetDatabaseName,
new OptionBuilder
{
DefaultValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
(
defaultValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.OverwriteTargetDatabase ? restoreDataObject.DefaultSourceDbName : restoreDataObject.DefaultTargetDbName;
},
CurrentValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
currentValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject) =>
{
return restoreDataObject.TargetDatabaseName;
},
ValidateFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
validateFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
{
return new OptionValidationResult()
{
IsReadOnly = false
};
},
SetValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
setValueFunction: (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
{
restoreDataObject.TargetDatabaseName = GetValueAs<string>(value);
return true;
}
});
));
}
internal T GetValueAs<T>(object value)
@@ -562,7 +554,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
}
private RestorePlanDetailInfo Create(
string optionKey,
string optionKey,
IRestoreDatabaseTaskDataObject restoreDataObject,
OptionBuilder optionBuilder)
{
@@ -587,6 +579,14 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
public Func<IRestoreDatabaseTaskDataObject, object, object, OptionValidationResult> ValidateFunction { get; set; }
public Func<IRestoreDatabaseTaskDataObject, object> CurrentValueFunction { get; set; }
public Func<IRestoreDatabaseTaskDataObject, object, bool> SetValueFunction { get; set; }
public OptionBuilder(Func<IRestoreDatabaseTaskDataObject, object> defaultValueFunction, Func<IRestoreDatabaseTaskDataObject, object, object, OptionValidationResult> validateFunction, Func<IRestoreDatabaseTaskDataObject, object> currentValueFunction, Func<IRestoreDatabaseTaskDataObject, object, bool> setValueFunction)
{
this.DefaultValueFunction = defaultValueFunction;
this.ValidateFunction = validateFunction;
this.CurrentValueFunction = currentValueFunction;
this.SetValueFunction = setValueFunction;
}
}
internal class OptionValidationResult