1
0
mirror of https://github.com/bitwarden/server.git synced 2025-05-29 15:24:51 -05:00

add column mapping to sql bulk copies

This commit is contained in:
Kyle Spearrin 2020-02-27 22:44:49 -05:00
parent f54ebfdc75
commit 0b9125be9c
2 changed files with 39 additions and 14 deletions

View File

@ -314,7 +314,7 @@ namespace Bit.Core.Repositories.SqlServer
using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction)) using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction))
{ {
bulkCopy.DestinationTableName = "#TempCipher"; bulkCopy.DestinationTableName = "#TempCipher";
var dataTable = BuildCiphersTable(ciphers); var dataTable = BuildCiphersTable(bulkCopy, ciphers);
bulkCopy.WriteToServer(dataTable); bulkCopy.WriteToServer(dataTable);
} }
} }
@ -324,7 +324,7 @@ namespace Bit.Core.Repositories.SqlServer
using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction)) using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction))
{ {
bulkCopy.DestinationTableName = "#TempFolder"; bulkCopy.DestinationTableName = "#TempFolder";
var dataTable = BuildFoldersTable(folders); var dataTable = BuildFoldersTable(bulkCopy, folders);
bulkCopy.WriteToServer(dataTable); bulkCopy.WriteToServer(dataTable);
} }
} }
@ -420,7 +420,7 @@ namespace Bit.Core.Repositories.SqlServer
using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction)) using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction))
{ {
bulkCopy.DestinationTableName = "#TempCipher"; bulkCopy.DestinationTableName = "#TempCipher";
var dataTable = BuildCiphersTable(ciphers); var dataTable = BuildCiphersTable(bulkCopy, ciphers);
bulkCopy.WriteToServer(dataTable); bulkCopy.WriteToServer(dataTable);
} }
@ -489,7 +489,7 @@ namespace Bit.Core.Repositories.SqlServer
using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction)) using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction))
{ {
bulkCopy.DestinationTableName = "[dbo].[Folder]"; bulkCopy.DestinationTableName = "[dbo].[Folder]";
var dataTable = BuildFoldersTable(folders); var dataTable = BuildFoldersTable(bulkCopy, folders);
bulkCopy.WriteToServer(dataTable); bulkCopy.WriteToServer(dataTable);
} }
} }
@ -497,7 +497,7 @@ namespace Bit.Core.Repositories.SqlServer
using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction)) using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction))
{ {
bulkCopy.DestinationTableName = "[dbo].[Cipher]"; bulkCopy.DestinationTableName = "[dbo].[Cipher]";
var dataTable = BuildCiphersTable(ciphers); var dataTable = BuildCiphersTable(bulkCopy, ciphers);
bulkCopy.WriteToServer(dataTable); bulkCopy.WriteToServer(dataTable);
} }
@ -536,7 +536,7 @@ namespace Bit.Core.Repositories.SqlServer
using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction)) using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction))
{ {
bulkCopy.DestinationTableName = "[dbo].[Cipher]"; bulkCopy.DestinationTableName = "[dbo].[Cipher]";
var dataTable = BuildCiphersTable(ciphers); var dataTable = BuildCiphersTable(bulkCopy, ciphers);
bulkCopy.WriteToServer(dataTable); bulkCopy.WriteToServer(dataTable);
} }
@ -545,7 +545,7 @@ namespace Bit.Core.Repositories.SqlServer
using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction)) using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction))
{ {
bulkCopy.DestinationTableName = "[dbo].[Collection]"; bulkCopy.DestinationTableName = "[dbo].[Collection]";
var dataTable = BuildCollectionsTable(collections); var dataTable = BuildCollectionsTable(bulkCopy, collections);
bulkCopy.WriteToServer(dataTable); bulkCopy.WriteToServer(dataTable);
} }
@ -554,7 +554,7 @@ namespace Bit.Core.Repositories.SqlServer
using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction)) using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction))
{ {
bulkCopy.DestinationTableName = "[dbo].[CollectionCipher]"; bulkCopy.DestinationTableName = "[dbo].[CollectionCipher]";
var dataTable = BuildCollectionCiphersTable(collectionCiphers); var dataTable = BuildCollectionCiphersTable(bulkCopy, collectionCiphers);
bulkCopy.WriteToServer(dataTable); bulkCopy.WriteToServer(dataTable);
} }
} }
@ -576,7 +576,7 @@ namespace Bit.Core.Repositories.SqlServer
} }
} }
private DataTable BuildCiphersTable(IEnumerable<Cipher> ciphers) private DataTable BuildCiphersTable(SqlBulkCopy bulkCopy, IEnumerable<Cipher> ciphers)
{ {
var c = ciphers.FirstOrDefault(); var c = ciphers.FirstOrDefault();
if(c == null) if(c == null)
@ -607,6 +607,11 @@ namespace Bit.Core.Repositories.SqlServer
var revisionDateColumn = new DataColumn(nameof(c.RevisionDate), c.RevisionDate.GetType()); var revisionDateColumn = new DataColumn(nameof(c.RevisionDate), c.RevisionDate.GetType());
ciphersTable.Columns.Add(revisionDateColumn); ciphersTable.Columns.Add(revisionDateColumn);
foreach(DataColumn col in ciphersTable.Columns)
{
bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
}
var keys = new DataColumn[1]; var keys = new DataColumn[1];
keys[0] = idColumn; keys[0] = idColumn;
ciphersTable.PrimaryKey = keys; ciphersTable.PrimaryKey = keys;
@ -632,7 +637,7 @@ namespace Bit.Core.Repositories.SqlServer
return ciphersTable; return ciphersTable;
} }
private DataTable BuildFoldersTable(IEnumerable<Folder> folders) private DataTable BuildFoldersTable(SqlBulkCopy bulkCopy, IEnumerable<Folder> folders)
{ {
var f = folders.FirstOrDefault(); var f = folders.FirstOrDefault();
if(f == null) if(f == null)
@ -653,6 +658,11 @@ namespace Bit.Core.Repositories.SqlServer
var revisionDateColumn = new DataColumn(nameof(f.RevisionDate), f.RevisionDate.GetType()); var revisionDateColumn = new DataColumn(nameof(f.RevisionDate), f.RevisionDate.GetType());
foldersTable.Columns.Add(revisionDateColumn); foldersTable.Columns.Add(revisionDateColumn);
foreach(DataColumn col in foldersTable.Columns)
{
bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
}
var keys = new DataColumn[1]; var keys = new DataColumn[1];
keys[0] = idColumn; keys[0] = idColumn;
foldersTable.PrimaryKey = keys; foldersTable.PrimaryKey = keys;
@ -673,7 +683,7 @@ namespace Bit.Core.Repositories.SqlServer
return foldersTable; return foldersTable;
} }
private DataTable BuildCollectionsTable(IEnumerable<Collection> collections) private DataTable BuildCollectionsTable(SqlBulkCopy bulkCopy, IEnumerable<Collection> collections)
{ {
var c = collections.FirstOrDefault(); var c = collections.FirstOrDefault();
if(c == null) if(c == null)
@ -694,6 +704,11 @@ namespace Bit.Core.Repositories.SqlServer
var revisionDateColumn = new DataColumn(nameof(c.RevisionDate), c.RevisionDate.GetType()); var revisionDateColumn = new DataColumn(nameof(c.RevisionDate), c.RevisionDate.GetType());
collectionsTable.Columns.Add(revisionDateColumn); collectionsTable.Columns.Add(revisionDateColumn);
foreach(DataColumn col in collectionsTable.Columns)
{
bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
}
var keys = new DataColumn[1]; var keys = new DataColumn[1];
keys[0] = idColumn; keys[0] = idColumn;
collectionsTable.PrimaryKey = keys; collectionsTable.PrimaryKey = keys;
@ -714,7 +729,7 @@ namespace Bit.Core.Repositories.SqlServer
return collectionsTable; return collectionsTable;
} }
private DataTable BuildCollectionCiphersTable(IEnumerable<CollectionCipher> collectionCiphers) private DataTable BuildCollectionCiphersTable(SqlBulkCopy bulkCopy, IEnumerable<CollectionCipher> collectionCiphers)
{ {
var cc = collectionCiphers.FirstOrDefault(); var cc = collectionCiphers.FirstOrDefault();
if(cc == null) if(cc == null)
@ -729,6 +744,11 @@ namespace Bit.Core.Repositories.SqlServer
var cipherIdColumn = new DataColumn(nameof(cc.CipherId), cc.CipherId.GetType()); var cipherIdColumn = new DataColumn(nameof(cc.CipherId), cc.CipherId.GetType());
collectionCiphersTable.Columns.Add(cipherIdColumn); collectionCiphersTable.Columns.Add(cipherIdColumn);
foreach(DataColumn col in collectionCiphersTable.Columns)
{
bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
}
var keys = new DataColumn[2]; var keys = new DataColumn[2];
keys[0] = collectionIdColumn; keys[0] = collectionIdColumn;
keys[1] = cipherIdColumn; keys[1] = cipherIdColumn;

View File

@ -92,7 +92,7 @@ namespace Bit.Core.Repositories.SqlServer
using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, null)) using(var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, null))
{ {
bulkCopy.DestinationTableName = "[dbo].[Event]"; bulkCopy.DestinationTableName = "[dbo].[Event]";
var dataTable = BuildEventsTable(entities.Select(e => e is Event ? e as Event : new Event(e))); var dataTable = BuildEventsTable(bulkCopy, entities.Select(e => e is Event ? e as Event : new Event(e)));
await bulkCopy.WriteToServerAsync(dataTable); await bulkCopy.WriteToServerAsync(dataTable);
} }
} }
@ -131,7 +131,7 @@ namespace Bit.Core.Repositories.SqlServer
} }
} }
private DataTable BuildEventsTable(IEnumerable<Event> events) private DataTable BuildEventsTable(SqlBulkCopy bulkCopy, IEnumerable<Event> events)
{ {
var e = events.FirstOrDefault(); var e = events.FirstOrDefault();
if(e == null) if(e == null)
@ -168,6 +168,11 @@ namespace Bit.Core.Repositories.SqlServer
var dateColumn = new DataColumn(nameof(e.Date), e.Date.GetType()); var dateColumn = new DataColumn(nameof(e.Date), e.Date.GetType());
eventsTable.Columns.Add(dateColumn); eventsTable.Columns.Add(dateColumn);
foreach(DataColumn col in eventsTable.Columns)
{
bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
}
var keys = new DataColumn[1]; var keys = new DataColumn[1];
keys[0] = idColumn; keys[0] = idColumn;
eventsTable.PrimaryKey = keys; eventsTable.PrimaryKey = keys;