internal static SubResult GoMirroring <T>( Assembly client, IEnumerable <T> rows, Func <Assembly, T, bool, ConnectBy, SubResult> processMethod, ConnectBy connectBy) where T : DbRow { var name = Text.NotAvailable; try { #region Check var subResult = new SubResult(); if (rows == null) { throw new QueryTalkException("Crud.GoMirroring", QueryTalkExceptionType.ArgumentNull, "rows = null", Text.Method.CrudRowsGo); } if (rows.Count() == 0) { return(subResult); } // non-null rows var rows2 = new List <T>(); foreach (var row in rows) { if (row != null) { rows2.Add(row); } } if (rows2.Count() == 0) { return(subResult); } Crud.CheckTable(rows.First(), Text.Method.CrudRowsGo); #endregion var map = DbMapping.TryGetNodeMap(rows2.First()); name = map.Name.Sql; var scopeOption = GetTransactionScopeOption(client, map, connectBy); // check if ambient transaction exists and use its isolation level if (Transaction.Current != null) { scopeOption.IsolationLevel = Transaction.Current.IsolationLevel; } using (var scope = new TransactionScope(TransactionScopeOption.Required, scopeOption)) { // loop foreach (var row in rows) { var sub = processMethod(client, row, true, connectBy); if (sub.Executed) { subResult .SetExecuted() .AddAffectedCount(sub.AffectedCount); } } scope.Complete(); } return(subResult); } catch (QueryTalkException) { throw; } catch (System.Exception ex) { throw Crud.ClrException(ex, name, Text.NotAvailable); } }
internal static SubResult GoNonMirroring <T>( Assembly client, IEnumerable <T> rows, Func <Assembly, IEnumerable <T>, NodeMap, ConnectBy, Nullable <bool>, SubResult> processMethod, ConnectBy connectBy, Nullable <bool> identityInsert) where T : DbRow { var name = Text.NotAvailable; try { #region Check var subResult = new SubResult(); if (rows == null) { throw new QueryTalkException("Crud.GoNonMirroring", QueryTalkExceptionType.ArgumentNull, "rows = null", Text.Method.CrudRowsGo); } if (rows.Count() == 0) { return(subResult); } Crud.CheckTable(rows.First(), Text.Method.CrudRowsGo); // non-null rows var rows2 = new List <T>(); foreach (var row in rows) { if (row != null) { rows2.Add(row); } } if (rows2.Count() == 0) { return(subResult); } #endregion var map = DbMapping.TryGetNodeMap(rows2.First()); name = map.Name.Sql; if (!map.HasIdentity) { identityInsert = false; } // set RowID var i = 0; foreach (var row in rows2) { ((IRow)row).RowID = i++; } var packageIndex = 0; var scopeOption = GetTransactionScopeOption(client, map, connectBy); // check if ambient transaction exists and use its isolation level if (Transaction.Current != null) { scopeOption.IsolationLevel = Transaction.Current.IsolationLevel; } using (var scope = new TransactionScope(TransactionScopeOption.Required, scopeOption)) { var count = rows2.Count(); // entire volume of data to be processed var ix = 0; // pointer to the first row in the package do { var package = rows2.Where(row => ((IRow)row).RowID >= ix && ((IRow)row).RowID < ix + Crud.PackageSize).ToList(); var sub = processMethod(client, package, map, connectBy, identityInsert); if (sub.Executed) { subResult .SetExecuted() .AddAffectedCount(sub.AffectedCount); } ix += Crud.PackageSize; ++packageIndex; } while (ix < count); scope.Complete(); } return(subResult); } catch (QueryTalkException) { throw; } catch (System.Exception ex) { throw Crud.ClrException(ex, name, Text.NotAvailable); } }