1
0
mirror of https://github.com/bitwarden/server.git synced 2025-05-22 12:04:27 -05:00

handle case when no folders or ciphers on change

This commit is contained in:
Kyle Spearrin 2017-05-03 17:16:24 -04:00
parent 1a4c8b2db7
commit 94fdb72d75

View File

@ -222,51 +222,67 @@ namespace Bit.Core.Repositories.SqlServer
// 3. Bulk bopy into temp tables. // 3. Bulk bopy into temp tables.
using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction)) if(ciphers.Any())
{ {
bulkCopy.DestinationTableName = "#TempCipher"; using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction))
var dataTable = BuildCiphersTable(ciphers); {
bulkCopy.WriteToServer(dataTable); bulkCopy.DestinationTableName = "#TempCipher";
var dataTable = BuildCiphersTable(ciphers);
bulkCopy.WriteToServer(dataTable);
}
} }
using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction)) if(folders.Any())
{ {
bulkCopy.DestinationTableName = "#TempFolder"; using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction))
var dataTable = BuildFoldersTable(folders); {
bulkCopy.WriteToServer(dataTable); bulkCopy.DestinationTableName = "#TempFolder";
var dataTable = BuildFoldersTable(folders);
bulkCopy.WriteToServer(dataTable);
}
} }
// 4. Insert into real tables from temp tables and clean up. // 4. Insert into real tables from temp tables and clean up.
var sqlUpdate = @" var sql = string.Empty;
UPDATE
[dbo].[Cipher]
SET
[Data] = TC.[Data],
[RevisionDate] = TC.[RevisionDate]
FROM
[dbo].[Cipher] C
INNER JOIN
#TempCipher TC ON C.Id = TC.Id
WHERE
C.[UserId] = @UserId
UPDATE if(ciphers.Any())
[dbo].[Folder] {
SET sql += @"
[Name] = TF.[Name], UPDATE
[RevisionDate] = TF.[RevisionDate] [dbo].[Cipher]
FROM SET
[dbo].[Folder] F [Data] = TC.[Data],
INNER JOIN [RevisionDate] = TC.[RevisionDate]
#TempFolder TF ON F.Id = TF.Id FROM
WHERE [dbo].[Cipher] C
F.[UserId] = @UserId INNER JOIN
#TempCipher TC ON C.Id = TC.Id
WHERE
C.[UserId] = @UserId";
}
if(folders.Any())
{
sql += @"
UPDATE
[dbo].[Folder]
SET
[Name] = TF.[Name],
[RevisionDate] = TF.[RevisionDate]
FROM
[dbo].[Folder] F
INNER JOIN
#TempFolder TF ON F.Id = TF.Id
WHERE
F.[UserId] = @UserId";
}
sql += @"
DROP TABLE #TempCipher DROP TABLE #TempCipher
DROP TABLE #TempFolder"; DROP TABLE #TempFolder";
using(var cmd = new SqlCommand(sqlUpdate, connection, transaction)) using(var cmd = new SqlCommand(sql, connection, transaction))
{ {
cmd.Parameters.Add("@UserId", SqlDbType.UniqueIdentifier).Value = user.Id; cmd.Parameters.Add("@UserId", SqlDbType.UniqueIdentifier).Value = user.Id;
cmd.ExecuteNonQuery(); cmd.ExecuteNonQuery();