Fix nullref in backup from not providing SFC XML innerDoc (#364)

This commit is contained in:
Karl Burtram
2017-05-27 13:17:40 -07:00
committed by GitHub
parent 0d00534f6a
commit 8e7fac26e5
2 changed files with 13 additions and 52 deletions

View File

@@ -148,7 +148,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Admin
/// <param name="connInfo">connection info</param> /// <param name="connInfo">connection info</param>
/// <param name="databaseExists">flag indicating whether to create taskhelper for existing database or not</param> /// <param name="databaseExists">flag indicating whether to create taskhelper for existing database or not</param>
/// <returns></returns> /// <returns></returns>
private static DatabaseTaskHelper CreateDatabaseTaskHelper(ConnectionInfo connInfo, bool databaseExists = false) internal static DatabaseTaskHelper CreateDatabaseTaskHelper(ConnectionInfo connInfo, bool databaseExists = false)
{ {
XmlDocument xmlDoc = CreateDataContainerDocument(connInfo, databaseExists); XmlDocument xmlDoc = CreateDataContainerDocument(connInfo, databaseExists);
char[] passwordArray = connInfo.ConnectionDetails.Password.ToCharArray(); char[] passwordArray = connInfo.ConnectionDetails.Password.ToCharArray();

View File

@@ -18,14 +18,14 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
{ {
private static readonly Lazy<DisasterRecoveryService> instance = new Lazy<DisasterRecoveryService>(() => new DisasterRecoveryService()); private static readonly Lazy<DisasterRecoveryService> instance = new Lazy<DisasterRecoveryService>(() => new DisasterRecoveryService());
private static ConnectionService connectionService = null; private static ConnectionService connectionService = null;
private BackupUtilities backupFactory; private BackupUtilities backupUtilities;
/// <summary> /// <summary>
/// Default, parameterless constructor. /// Default, parameterless constructor.
/// </summary> /// </summary>
internal DisasterRecoveryService() internal DisasterRecoveryService()
{ {
this.backupFactory = new BackupUtilities(); this.backupUtilities = new BackupUtilities();
} }
/// <summary> /// <summary>
@@ -78,12 +78,12 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
if (connInfo != null) if (connInfo != null)
{ {
CDataContainer dataContainer = GetDataContainer(connInfo); DatabaseTaskHelper helper = AdminService.CreateDatabaseTaskHelper(connInfo, databaseExists: true);
SqlConnection sqlConn = GetSqlConnection(connInfo); SqlConnection sqlConn = GetSqlConnection(connInfo);
if (sqlConn != null) if (sqlConn != null)
{ {
DisasterRecoveryService.Instance.InitializeBackup(dataContainer, sqlConn); DisasterRecoveryService.Instance.InitializeBackup(helper.DataContainer, sqlConn);
BackupConfigInfo backupConfigInfo = DisasterRecoveryService.Instance.GetDatabaseInfo(sqlConn.Database); BackupConfigInfo backupConfigInfo = DisasterRecoveryService.Instance.GetBackupConfigInfo(sqlConn.Database);
backupConfigInfo.DatabaseInfo = AdminService.GetDatabaseInfo(connInfo); backupConfigInfo.DatabaseInfo = AdminService.GetDatabaseInfo(connInfo);
response.BackupConfigInfo = backupConfigInfo; response.BackupConfigInfo = backupConfigInfo;
} }
@@ -91,44 +91,6 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
await requestContext.SendResult(response); await requestContext.SendResult(response);
} }
internal static CDataContainer GetDataContainer(ConnectionInfo connInfo)
{
CDataContainer dataContainer = null;
if (connInfo != null)
{
char[] passwordArray = connInfo.ConnectionDetails.Password.ToCharArray();
if (string.Equals(connInfo.ConnectionDetails.AuthenticationType, "SqlLogin", StringComparison.OrdinalIgnoreCase))
{
unsafe
{
fixed (char* passwordPtr = passwordArray)
{
dataContainer = new CDataContainer(
CDataContainer.ServerType.SQL,
connInfo.ConnectionDetails.ServerName,
false,
connInfo.ConnectionDetails.UserName,
new System.Security.SecureString(passwordPtr, passwordArray.Length),
string.Empty);
}
}
}
else
{
dataContainer = new CDataContainer(
CDataContainer.ServerType.SQL,
connInfo.ConnectionDetails.ServerName,
true,
null,
null,
null);
}
}
return dataContainer;
}
/// <summary> /// <summary>
/// Handles a backup request /// Handles a backup request
@@ -141,15 +103,14 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
DisasterRecoveryService.ConnectionServiceInstance.TryFindConnection( DisasterRecoveryService.ConnectionServiceInstance.TryFindConnection(
backupParams.OwnerUri, backupParams.OwnerUri,
out connInfo); out connInfo);
CDataContainer dataContainer;
if (connInfo != null) if (connInfo != null)
{ {
dataContainer = GetDataContainer(connInfo); DatabaseTaskHelper helper = AdminService.CreateDatabaseTaskHelper(connInfo, databaseExists: true);
SqlConnection sqlConn = GetSqlConnection(connInfo); SqlConnection sqlConn = GetSqlConnection(connInfo);
if (sqlConn != null) if (sqlConn != null)
{ {
DisasterRecoveryService.Instance.InitializeBackup(dataContainer, sqlConn); DisasterRecoveryService.Instance.InitializeBackup(helper.DataContainer, sqlConn);
DisasterRecoveryService.Instance.SetBackupInput(backupParams.BackupInfo); DisasterRecoveryService.Instance.SetBackupInput(backupParams.BackupInfo);
DisasterRecoveryService.Instance.PerformBackup(); DisasterRecoveryService.Instance.PerformBackup();
} }
@@ -186,22 +147,22 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
private void InitializeBackup(CDataContainer dataContainer, SqlConnection sqlConnection) private void InitializeBackup(CDataContainer dataContainer, SqlConnection sqlConnection)
{ {
this.backupFactory.Initialize(dataContainer, sqlConnection); this.backupUtilities.Initialize(dataContainer, sqlConnection);
} }
private void SetBackupInput(BackupInfo input) private void SetBackupInput(BackupInfo input)
{ {
this.backupFactory.SetBackupInput(input); this.backupUtilities.SetBackupInput(input);
} }
private void PerformBackup() private void PerformBackup()
{ {
this.backupFactory.PerformBackup(); this.backupUtilities.PerformBackup();
} }
private BackupConfigInfo GetDatabaseInfo(string databaseName) private BackupConfigInfo GetBackupConfigInfo(string databaseName)
{ {
return this.backupFactory.GetBackupConfigInfo(databaseName); return this.backupUtilities.GetBackupConfigInfo(databaseName);
} }
} }