Scope - Fix BulkInsertRecords, ensure a db connection is open

This commit is contained in:
Stephan
2017-02-06 18:26:33 +01:00
parent 67fc8b6215
commit 4f9bbdf7f7

View File

@@ -105,8 +105,8 @@ namespace Umbraco.Core.Persistence
// try to update
var rowCount = updateCommand.IsNullOrWhiteSpace()
? db.Update(poco)
: db.Update<T>(updateCommand, updateArgs);
? db.Update(poco)
: db.Update<T>(updateCommand, updateArgs);
if (rowCount > 0)
return RecordPersistenceType.Update;
@@ -162,7 +162,7 @@ namespace Umbraco.Core.Persistence
[Obsolete("Use the DatabaseSchemaHelper instead")]
public static void CreateTable<T>(this Database db)
where T : new()
where T : new()
{
var creator = new DatabaseSchemaHelper(db, LoggerResolver.Current.Logger, SqlSyntaxContext.SqlSyntaxProvider);
creator.CreateTable<T>();
@@ -170,7 +170,7 @@ namespace Umbraco.Core.Persistence
[Obsolete("Use the DatabaseSchemaHelper instead")]
public static void CreateTable<T>(this Database db, bool overwrite)
where T : new()
where T : new()
{
var creator = new DatabaseSchemaHelper(db, LoggerResolver.Current.Logger, SqlSyntaxContext.SqlSyntaxProvider);
creator.CreateTable<T>(overwrite);
@@ -231,6 +231,24 @@ namespace Umbraco.Core.Persistence
ISqlSyntaxProvider syntaxProvider,
bool useNativeSqlPlatformBulkInsert = true,
bool commitTrans = false)
{
db.OpenSharedConnection();
try
{
return BulkInsertRecordsTry(db, collection, tr, syntaxProvider, useNativeSqlPlatformBulkInsert, commitTrans);
}
finally
{
db.CloseSharedConnection();
}
}
public static int BulkInsertRecordsTry<T>(this Database db,
IEnumerable<T> collection,
Transaction tr,
ISqlSyntaxProvider syntaxProvider,
bool useNativeSqlPlatformBulkInsert = true,
bool commitTrans = false)
{
if (commitTrans && tr == null)
throw new ArgumentNullException("tr", "The transaction cannot be null if commitTrans is true.");
@@ -241,15 +259,15 @@ namespace Umbraco.Core.Persistence
return 0;
}
var pd = Database.PocoData.ForType(typeof(T));
if (pd == null) throw new InvalidOperationException("Could not find PocoData for " + typeof(T));
var pd = Database.PocoData.ForType(typeof (T));
if (pd == null) throw new InvalidOperationException("Could not find PocoData for " + typeof (T));
try
{
int processed = 0;
var usedNativeSqlPlatformInserts = useNativeSqlPlatformBulkInsert
&& NativeSqlPlatformBulkInsertRecords(db, syntaxProvider, pd, collection, out processed);
&& NativeSqlPlatformBulkInsertRecords(db, syntaxProvider, pd, collection, out processed);
if (usedNativeSqlPlatformInserts == false)
{
@@ -283,19 +301,13 @@ namespace Umbraco.Core.Persistence
}
if (commitTrans)
{
if (tr == null) throw new ArgumentNullException("The transaction cannot be null if commitTrans is true");
tr.Complete();
}
return processed;
}
catch
{
if (commitTrans)
{
if (tr == null) throw new ArgumentNullException("The transaction cannot be null if commitTrans is true");
tr.Dispose();
}
throw;
}
@@ -337,13 +349,16 @@ namespace Umbraco.Core.Persistence
IEnumerable<T> collection,
out string[] sql)
{
if (db == null) throw new ArgumentNullException("db");
if (db.Connection == null) throw new ArgumentException("db.Connection is null.");
var tableName = db.EscapeTableName(pd.TableInfo.TableName);
//get all columns to include and format for sql
var cols = string.Join(", ",
pd.Columns
.Where(c => IncludeColumn(pd, c))
.Select(c => tableName + "." + db.EscapeSqlIdentifier(c.Key)).ToArray());
.Where(c => IncludeColumn(pd, c))
.Select(c => tableName + "." + db.EscapeSqlIdentifier(c.Key)).ToArray());
var itemArray = collection.ToArray();
@@ -357,9 +372,9 @@ namespace Umbraco.Core.Persistence
// 4168 / 262 = 15.908... = there will be 16 trans in total
//all items will be included if we have disabled db parameters
var itemsPerTrans = Math.Floor(2000.00 / paramsPerItem);
var itemsPerTrans = Math.Floor(2000.00/paramsPerItem);
//there will only be one transaction if we have disabled db parameters
var numTrans = Math.Ceiling(itemArray.Length / itemsPerTrans);
var numTrans = Math.Ceiling(itemArray.Length/itemsPerTrans);
var sqlQueries = new List<string>();
var commands = new List<IDbCommand>();
@@ -367,8 +382,8 @@ namespace Umbraco.Core.Persistence
for (var tIndex = 0; tIndex < numTrans; tIndex++)
{
var itemsForTrans = itemArray
.Skip(tIndex * (int)itemsPerTrans)
.Take((int)itemsPerTrans);
.Skip(tIndex*(int) itemsPerTrans)
.Take((int) itemsPerTrans);
var cmd = db.CreateCommand(db.Connection, string.Empty);
var pocoValues = new List<string>();
@@ -418,7 +433,6 @@ namespace Umbraco.Core.Persistence
/// <param name="processed">The number of records inserted</param>
private static bool NativeSqlPlatformBulkInsertRecords<T>(Database db, ISqlSyntaxProvider syntaxProvider, Database.PocoData pd, IEnumerable<T> collection, out int processed)
{
var dbConnection = db.Connection;
//unwrap the profiled connection if there is one
@@ -447,7 +461,6 @@ namespace Umbraco.Core.Persistence
//could not use the SQL server's specific bulk insert operations
processed = 0;
return false;
}
/// <summary>