<PackageReference Include="Relativity.Server.Import.SDK" Version="2.9.2" />

ImageImportBulkArtifactJob

Provides the functionality required to load data for an import job and to retrieve messages from the OnMessage event.
using kCura.WinEDDS; using kCura.WinEDDS.ImportExtension; using kCura.WinEDDS.Service; using kCura.WinEDDS.Service.Replacement; using Microsoft.VisualBasic.CompilerServices; using Monitoring.Sinks; using Relativity.DataExchange; using Relativity.DataExchange.Process; using System; using System.Collections; using System.Data; using System.Net; using System.Runtime.CompilerServices; using System.Text; using System.Threading; namespace kCura.Relativity.DataReaderClient { public class ImageImportBulkArtifactJob : IImportNotifier, IImportBulkArtifactJob { public delegate void OnMessageEventHandler (Status status); public delegate void OnErrorEventHandler (IDictionary row); [CompilerGenerated] private IImportNotifier.OnProcessProgressEventHandler OnProcessProgressEvent; [CompilerGenerated] private OnMessageEventHandler OnMessageEvent; [CompilerGenerated] private OnErrorEventHandler OnErrorEvent; [CompilerGenerated] private IImportNotifier.OnCompleteEventHandler OnCompleteEvent; [CompilerGenerated] private IImportNotifier.OnFatalExceptionEventHandler OnFatalExceptionEvent; [CompilerGenerated] private IImportNotifier.OnProgressEventHandler OnProgressEvent; private readonly IRunningContext _runningContext; [CompilerGenerated] [AccessedThroughProperty("_processContext")] private ProcessContext __processContext; private ImageSettings _settings; private ImageSourceIDataReader _sourceData; private SourceIDataReader _sourceDataReader; private ICredentials _credentials; private CookieContainer _cookieMonster; private JobReport _jobReport; private WebApiCredential _webApiCredential; private Func<string> _correlationIdFunc; private Guid _instanceId; public ImageSettings Settings { get { return _settings; } internal set { _settings = value; } } public ImageSourceIDataReader SourceData { get { return _sourceData; } internal set { _sourceData = value; } } private virtual ProcessContext _processContext { [CompilerGenerated] get { return __processContext; } [MethodImpl(MethodImplOptions.Synchronized)] [CompilerGenerated] set { EventHandler<ErrorReportEventArgs> value2 = _processContext_ErrorReportEvent; EventHandler<ProcessCompleteEventArgs> value3 = _processContext_OnProcessComplete; EventHandler<ProcessEndEventArgs> value4 = _processContext_OnProcessEnded; EventHandler<ProcessEventArgs> value5 = _processContext_OnProcessEvent; EventHandler<FatalExceptionEventArgs> value6 = _processContext_OnProcessFatalException; EventHandler<ProgressEventArgs> value7 = _processContext_OnProcessProgressEvent; EventHandler<RecordNumberEventArgs> value8 = _processContext_RecordProcessedEvent; EventHandler<RecordCountEventArgs> value9 = _processContext_IncrementRecordCount; ProcessContext _processContext = __processContext; if (_processContext != null) { _processContext.ErrorReport -= value2; _processContext.ProcessCompleted -= value3; _processContext.ProcessEnded -= value4; _processContext.ProcessEvent -= value5; _processContext.FatalException -= value6; _processContext.Progress -= value7; _processContext.RecordProcessed -= value8; _processContext.RecordCountIncremented -= value9; } __processContext = value; _processContext = __processContext; if (_processContext != null) { _processContext.ErrorReport += value2; _processContext.ProcessCompleted += value3; _processContext.ProcessEnded += value4; _processContext.ProcessEvent += value5; _processContext.FatalException += value6; _processContext.Progress += value7; _processContext.RecordProcessed += value8; _processContext.RecordCountIncremented += value9; } } } public event IImportNotifier.OnProcessProgressEventHandler OnProcessProgress { [CompilerGenerated] add { IImportNotifier.OnProcessProgressEventHandler onProcessProgressEventHandler = OnProcessProgressEvent; IImportNotifier.OnProcessProgressEventHandler onProcessProgressEventHandler2; do { onProcessProgressEventHandler2 = onProcessProgressEventHandler; IImportNotifier.OnProcessProgressEventHandler value2 = (IImportNotifier.OnProcessProgressEventHandler)Delegate.Combine(onProcessProgressEventHandler2, value); onProcessProgressEventHandler = Interlocked.CompareExchange(ref OnProcessProgressEvent, value2, onProcessProgressEventHandler2); } while ((object)onProcessProgressEventHandler != onProcessProgressEventHandler2); } [CompilerGenerated] remove { IImportNotifier.OnProcessProgressEventHandler onProcessProgressEventHandler = OnProcessProgressEvent; IImportNotifier.OnProcessProgressEventHandler onProcessProgressEventHandler2; do { onProcessProgressEventHandler2 = onProcessProgressEventHandler; IImportNotifier.OnProcessProgressEventHandler value2 = (IImportNotifier.OnProcessProgressEventHandler)Delegate.Remove(onProcessProgressEventHandler2, value); onProcessProgressEventHandler = Interlocked.CompareExchange(ref OnProcessProgressEvent, value2, onProcessProgressEventHandler2); } while ((object)onProcessProgressEventHandler != onProcessProgressEventHandler2); } } public event OnMessageEventHandler OnMessage { [CompilerGenerated] add { OnMessageEventHandler onMessageEventHandler = OnMessageEvent; OnMessageEventHandler onMessageEventHandler2; do { onMessageEventHandler2 = onMessageEventHandler; OnMessageEventHandler value2 = (OnMessageEventHandler)Delegate.Combine(onMessageEventHandler2, value); onMessageEventHandler = Interlocked.CompareExchange(ref OnMessageEvent, value2, onMessageEventHandler2); } while ((object)onMessageEventHandler != onMessageEventHandler2); } [CompilerGenerated] remove { OnMessageEventHandler onMessageEventHandler = OnMessageEvent; OnMessageEventHandler onMessageEventHandler2; do { onMessageEventHandler2 = onMessageEventHandler; OnMessageEventHandler value2 = (OnMessageEventHandler)Delegate.Remove(onMessageEventHandler2, value); onMessageEventHandler = Interlocked.CompareExchange(ref OnMessageEvent, value2, onMessageEventHandler2); } while ((object)onMessageEventHandler != onMessageEventHandler2); } } public event OnErrorEventHandler OnError { [CompilerGenerated] add { OnErrorEventHandler onErrorEventHandler = OnErrorEvent; OnErrorEventHandler onErrorEventHandler2; do { onErrorEventHandler2 = onErrorEventHandler; OnErrorEventHandler value2 = (OnErrorEventHandler)Delegate.Combine(onErrorEventHandler2, value); onErrorEventHandler = Interlocked.CompareExchange(ref OnErrorEvent, value2, onErrorEventHandler2); } while ((object)onErrorEventHandler != onErrorEventHandler2); } [CompilerGenerated] remove { OnErrorEventHandler onErrorEventHandler = OnErrorEvent; OnErrorEventHandler onErrorEventHandler2; do { onErrorEventHandler2 = onErrorEventHandler; OnErrorEventHandler value2 = (OnErrorEventHandler)Delegate.Remove(onErrorEventHandler2, value); onErrorEventHandler = Interlocked.CompareExchange(ref OnErrorEvent, value2, onErrorEventHandler2); } while ((object)onErrorEventHandler != onErrorEventHandler2); } } public event IImportNotifier.OnCompleteEventHandler OnComplete { [CompilerGenerated] add { IImportNotifier.OnCompleteEventHandler onCompleteEventHandler = OnCompleteEvent; IImportNotifier.OnCompleteEventHandler onCompleteEventHandler2; do { onCompleteEventHandler2 = onCompleteEventHandler; IImportNotifier.OnCompleteEventHandler value2 = (IImportNotifier.OnCompleteEventHandler)Delegate.Combine(onCompleteEventHandler2, value); onCompleteEventHandler = Interlocked.CompareExchange(ref OnCompleteEvent, value2, onCompleteEventHandler2); } while ((object)onCompleteEventHandler != onCompleteEventHandler2); } [CompilerGenerated] remove { IImportNotifier.OnCompleteEventHandler onCompleteEventHandler = OnCompleteEvent; IImportNotifier.OnCompleteEventHandler onCompleteEventHandler2; do { onCompleteEventHandler2 = onCompleteEventHandler; IImportNotifier.OnCompleteEventHandler value2 = (IImportNotifier.OnCompleteEventHandler)Delegate.Remove(onCompleteEventHandler2, value); onCompleteEventHandler = Interlocked.CompareExchange(ref OnCompleteEvent, value2, onCompleteEventHandler2); } while ((object)onCompleteEventHandler != onCompleteEventHandler2); } } public event IImportNotifier.OnFatalExceptionEventHandler OnFatalException { [CompilerGenerated] add { IImportNotifier.OnFatalExceptionEventHandler onFatalExceptionEventHandler = OnFatalExceptionEvent; IImportNotifier.OnFatalExceptionEventHandler onFatalExceptionEventHandler2; do { onFatalExceptionEventHandler2 = onFatalExceptionEventHandler; IImportNotifier.OnFatalExceptionEventHandler value2 = (IImportNotifier.OnFatalExceptionEventHandler)Delegate.Combine(onFatalExceptionEventHandler2, value); onFatalExceptionEventHandler = Interlocked.CompareExchange(ref OnFatalExceptionEvent, value2, onFatalExceptionEventHandler2); } while ((object)onFatalExceptionEventHandler != onFatalExceptionEventHandler2); } [CompilerGenerated] remove { IImportNotifier.OnFatalExceptionEventHandler onFatalExceptionEventHandler = OnFatalExceptionEvent; IImportNotifier.OnFatalExceptionEventHandler onFatalExceptionEventHandler2; do { onFatalExceptionEventHandler2 = onFatalExceptionEventHandler; IImportNotifier.OnFatalExceptionEventHandler value2 = (IImportNotifier.OnFatalExceptionEventHandler)Delegate.Remove(onFatalExceptionEventHandler2, value); onFatalExceptionEventHandler = Interlocked.CompareExchange(ref OnFatalExceptionEvent, value2, onFatalExceptionEventHandler2); } while ((object)onFatalExceptionEventHandler != onFatalExceptionEventHandler2); } } public event IImportNotifier.OnProgressEventHandler OnProgress { [CompilerGenerated] add { IImportNotifier.OnProgressEventHandler onProgressEventHandler = OnProgressEvent; IImportNotifier.OnProgressEventHandler onProgressEventHandler2; do { onProgressEventHandler2 = onProgressEventHandler; IImportNotifier.OnProgressEventHandler value2 = (IImportNotifier.OnProgressEventHandler)Delegate.Combine(onProgressEventHandler2, value); onProgressEventHandler = Interlocked.CompareExchange(ref OnProgressEvent, value2, onProgressEventHandler2); } while ((object)onProgressEventHandler != onProgressEventHandler2); } [CompilerGenerated] remove { IImportNotifier.OnProgressEventHandler onProgressEventHandler = OnProgressEvent; IImportNotifier.OnProgressEventHandler onProgressEventHandler2; do { onProgressEventHandler2 = onProgressEventHandler; IImportNotifier.OnProgressEventHandler value2 = (IImportNotifier.OnProgressEventHandler)Delegate.Remove(onProgressEventHandler2, value); onProgressEventHandler = Interlocked.CompareExchange(ref OnProgressEvent, value2, onProgressEventHandler2); } while ((object)onProgressEventHandler != onProgressEventHandler2); } } public ImageImportBulkArtifactJob() { _instanceId = Guid.NewGuid(); _settings = new ImageSettings(); _sourceData = new ImageSourceIDataReader(); _cookieMonster = new CookieContainer(); _correlationIdFunc = GetDefaultCorrelationId; } internal ImageImportBulkArtifactJob(ICredentials credentials, WebApiCredential webApiCredential, CookieContainer cookieMonster, IRunningContext runningContext, Func<string> correlationIdFunc) : this() { _runningContext = runningContext; _credentials = credentials; _cookieMonster = cookieMonster; _webApiCredential = webApiCredential; _correlationIdFunc = correlationIdFunc; } public void Execute() { _jobReport = new JobReport(); _jobReport.StartTime = DateTime.Now; if (_credentials == null) { ImportCredentialManager.WebServiceURL = Settings.WebServiceURL; ImportCredentialManager.SessionCredentials credentials = ImportCredentialManager.GetCredentials(Settings.RelativityUsername, Settings.RelativityPassword, _runningContext, _correlationIdFunc); _credentials = credentials.Credentials; _webApiCredential.Credential = credentials.Credentials; _cookieMonster = credentials.CookieMonster; } if (IsSettingsValid()) { OnMessageEvent?.Invoke(new Status("Getting source data from database")); IMetricService metricService = new MetricService(Settings.Telemetry, KeplerProxyFactory.CreateKeplerProxy(_webApiCredential.Credential)); _runningContext.ApplicationName = Settings.ApplicationName; DataReaderImageImporterProcess dataReaderImageImporterProcess = new DataReaderImageImporterProcess(SourceData, Settings, metricService, _runningContext, _correlationIdFunc); _processContext = dataReaderImageImporterProcess.Context; if (Settings.DisableImageTypeValidation.HasValue) dataReaderImageImporterProcess.DisableImageTypeValidation = Settings.DisableImageTypeValidation.Value; if (Settings.DisableImageLocationValidation.HasValue) dataReaderImageImporterProcess.DisableImageLocationValidation = Settings.DisableImageLocationValidation.Value; dataReaderImageImporterProcess.MaximumErrorCount = Settings.MaximumErrorCount; dataReaderImageImporterProcess.DisableUserSecurityCheck = Settings.DisableUserSecurityCheck; dataReaderImageImporterProcess.AuditLevel = Settings.AuditLevel; dataReaderImageImporterProcess.SkipExtractedTextEncodingCheck = Settings.DisableExtractedTextEncodingCheck; OnMessageEvent?.Invoke(new Status("Updating settings")); dataReaderImageImporterProcess.ImageLoadFile = CreateLoadFile(); dataReaderImageImporterProcess.CaseInfo = dataReaderImageImporterProcess.ImageLoadFile.CaseInfo; OnMessageEvent?.Invoke(new Status("Executing")); try { dataReaderImageImporterProcess.Start(); } catch (Exception ex) { ProjectData.SetProjectError(ex); Exception ex2 = ex; OnMessageEvent?.Invoke(new Status($"""{ex2.ToString()}")); _jobReport.FatalException = ex2; RaiseFatalException(); ProjectData.ClearProjectError(); } } else { OnMessageEvent?.Invoke(new Status("There was an error in your settings. Import aborted.")); RaiseFatalException(); } } void IImportBulkArtifactJob.Execute() { this.Execute(); } public void ExportErrorReport(string filePathAndName) { _processContext.PublishExportErrorReport(filePathAndName); } void IImportBulkArtifactJob.ExportErrorReport(string filePathAndName) { this.ExportErrorReport(filePathAndName); } public void ExportErrorFile(string filePathAndName) { _processContext.PublishExportErrorFile(filePathAndName); } void IImportBulkArtifactJob.ExportErrorFile(string filePathAndName) { this.ExportErrorFile(filePathAndName); } private void RaiseFatalException() { _jobReport.EndTime = DateTime.Now; OnFatalExceptionEvent?.Invoke(_jobReport); } private void RaiseComplete() { _jobReport.EndTime = DateTime.Now; OnCompleteEvent?.Invoke(_jobReport); } private void ValidateDataSourceSettings() { EnsureFieldNameIsValid("BatesNumber", Settings.BatesNumberField); EnsureFieldNameIsValid("DocumentIdentifier", Settings.DocumentIdentifierField); EnsureFieldNameIsValid("FileLocation", Settings.FileLocationField); } private void EnsureFieldNameIsValid(string imageSettingsField, string forFieldName) { if (string.IsNullOrEmpty(forFieldName)) throw new Exception("No field name specified for " + imageSettingsField); } private ImageLoadFile CreateLoadFile() { NetworkCredential networkCredential = (NetworkCredential)_credentials; ICaseManager caseManager = GetCaseManager(networkCredential); ImageLoadFile imageLoadFile = new ImageLoadFile(); imageLoadFile.AutoNumberImages = Settings.AutoNumberImages; imageLoadFile.CaseInfo = caseManager.Read(Settings.CaseArtifactId); imageLoadFile.Credential = networkCredential; imageLoadFile.WebApiCredential = _webApiCredential; imageLoadFile.CookieContainer = _cookieMonster; imageLoadFile.CopyFilesToDocumentRepository = Settings.CopyFilesToDocumentRepository; if (Settings.DestinationFolderArtifactID > 0) imageLoadFile.DestinationFolderID = Settings.DestinationFolderArtifactID; else imageLoadFile.DestinationFolderID = imageLoadFile.CaseInfo.RootFolderID; imageLoadFile.ForProduction = Settings.ForProduction; imageLoadFile.FullTextEncoding = Settings.ExtractedTextEncoding; ImageLoadFile imageLoadFile2 = imageLoadFile; OverwriteModeEnum overwriteModeEnum = Settings.OverwriteMode; imageLoadFile2.Overwrite = overwriteModeEnum.ToString(); imageLoadFile.ReplaceFullText = Settings.ExtractedTextFieldContainsFilePath; string overwrite = imageLoadFile.Overwrite; overwriteModeEnum = OverwriteModeEnum.Overlay; if (Operators.CompareString(overwrite, overwriteModeEnum.ToString(), false) == 0) { imageLoadFile.IdentityFieldId = Settings.IdentityFieldId; imageLoadFile.BeginBatesFieldArtifactID = Settings.BeginBatesFieldArtifactID; } else imageLoadFile.BeginBatesFieldArtifactID = (imageLoadFile.IdentityFieldId = GetDefaultIdentifierFieldID(networkCredential, Settings.CaseArtifactId)); imageLoadFile.ProductionArtifactID = Settings.ProductionArtifactID; if (string.IsNullOrEmpty(Settings.SelectedCasePath)) imageLoadFile.SelectedCasePath = imageLoadFile.CaseInfo.DocumentPath; else imageLoadFile.SelectedCasePath = Settings.SelectedCasePath; imageLoadFile.SendEmailOnLoadCompletion = false; imageLoadFile.StartLineNumber = Settings.StartRecordNumber; imageLoadFile.Billable = Settings.Billable; return imageLoadFile; } private void MapSuppliedFieldNamesToActual(ImageSettings imageSettings, ref DataTable srcDataTable) { srcDataTable.Columns[imageSettings.BatesNumberField].ColumnName = "BatesNumber"; srcDataTable.Columns[imageSettings.DocumentIdentifierField].ColumnName = "DocumentIdentifier"; srcDataTable.Columns[imageSettings.FileLocationField].ColumnName = "FileLocation"; if (srcDataTable.Columns[imageSettings.FileNameField] != null) srcDataTable.Columns[imageSettings.FileNameField].ColumnName = "FileName"; } private int GetDefaultIdentifierFieldID(NetworkCredential credential, int caseArtifactID) { DataTable dataTable = ManagerFactory.CreateFieldQuery(credential, _cookieMonster, _correlationIdFunc).RetrievePotentialBeginBatesFields(caseArtifactID).Tables[0]; IEnumerator enumerator = default(IEnumerator); try { enumerator = dataTable.Rows.GetEnumerator(); int result = default(int); while (enumerator.MoveNext()) { DataRow dataRow = (DataRow)enumerator.Current; if (Conversions.ToInteger(dataRow["FieldCategoryID"]) == 2) result = Conversions.ToInteger(dataRow["ArtifactID"]); } return result; } finally { if (enumerator is IDisposable) (enumerator as IDisposable).Dispose(); } } private ICaseManager GetCaseManager(NetworkCredential credentials) { return ManagerFactory.CreateCaseManager(credentials, _cookieMonster, _correlationIdFunc); } private string GetDefaultCorrelationId() { return _instanceId.ToString(); } private bool IsSettingsValid() { try { ValidateRelativitySettings(); ValidateDataSourceSettings(); ValidateOverwriteModeSettings(); ValidateExtractedTextSettings(); ValidateProductionSettings(); } catch (Exception ex) { ProjectData.SetProjectError(ex); Exception ex2 = ex; _jobReport.FatalException = ex2; OnMessageEvent?.Invoke(new Status(ex2.Message)); bool result = false; ProjectData.ClearProjectError(); return result; } return true; } private void ValidateRelativitySettings() { if (Settings.CaseArtifactId <= 0) throw new ImportSettingsException("CaseArtifactId", "This must be the ID of an existing case."); if (Settings.MaximumErrorCount.HasValue && (Settings.MaximumErrorCount.Value < 1 || Settings.MaximumErrorCount.Value == 2147483647)) throw new ImportSettingsException("MaximumErrorCount", "This must be greater than 0 and less than Int32.MaxValue."); } private void ValidateOverwriteModeSettings() { if (Settings.OverwriteMode == OverwriteModeEnum.Overlay && Settings.IdentityFieldId < 1) throw new ImportSettingsException("IdentityFieldId", "When OverwriteMode is set to Overlay, then the IdentityFieldId must be set."); } private void ValidateExtractedTextSettings() { if (Settings.ExtractedTextFieldContainsFilePath) { bool? nullable = Settings.DisableExtractedTextEncodingCheck.HasValue ? Settings.DisableExtractedTextEncodingCheck : new bool?(false); if ((nullable ?? true) && Settings.ExtractedTextEncoding == null && nullable.HasValue) throw new ImportSettingsConflictException("DisableExtractedTextEncodingCheck", "ExtractedTextEncoding", "ExtractedTextEncoding must be set if DisableExtractedTextEncodingCheck is enabled."); if (Settings.ExtractedTextEncoding == null) throw new ImportSettingsException("ExtractedTextEncoding", string.Empty); } } private void ValidateProductionSettings() { if (Settings.ForProduction && Settings.ProductionArtifactID < 1) throw new ImportSettingsException("ProductionArtifactID", "When specifying a production import, the ProductionArtifactID must be set."); } private void _processContext_ErrorReportEvent(object sender, ErrorReportEventArgs e) { OnErrorEvent?.Invoke(e.Error); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendFormat("[error] "); IEnumerator enumerator = default(IEnumerator); try { enumerator = e.Error.Keys.GetEnumerator(); while (enumerator.MoveNext()) { string text = Conversions.ToString(enumerator.Current); stringBuilder.Append(text); stringBuilder.Append(": "); stringBuilder.Append(RuntimeHelpers.GetObjectValue(e.Error[text])); stringBuilder.Append("\r\n"); } } finally { if (enumerator is IDisposable) (enumerator as IDisposable).Dispose(); } OnMessageEvent?.Invoke(new Status(stringBuilder.ToString())); string message = e.Error["Message"].ToString(); object objectValue = RuntimeHelpers.GetObjectValue(e.Error["Line Number"]); long rowNumber = 0; if (objectValue != null) rowNumber = (int)objectValue; object objectValue2 = RuntimeHelpers.GetObjectValue(e.Error["DocumentID"]); string identifier = string.Empty; if (objectValue2 != null) identifier = objectValue2.ToString(); _jobReport.ErrorRows.Add(new JobReport.RowError(rowNumber, message, identifier)); } private void _processContext_OnProcessComplete(object sender, ProcessCompleteEventArgs e) { OnMessageEvent?.Invoke(new Status(string.Format("Completed!"))); RaiseComplete(); } private void _processContext_OnProcessEnded(object sender, ProcessEndEventArgs e) { _jobReport.FileBytes = e.NativeFileBytes; _jobReport.MetadataBytes = e.MetadataBytes; _jobReport.SqlProcessRate = e.SqlProcessRate; } private void _processContext_OnProcessEvent(object sender, ProcessEventArgs e) { if (e.EventType == ProcessEventType.Error || e.EventType == ProcessEventType.Warning || e.EventType == ProcessEventType.Status) OnMessageEvent?.Invoke(new Status(string.Format("[Timestamp: {0}] [Record Info: {2}] {3} - {1}", e.Timestamp, e.Message, e.RecordInfo, e.EventType))); } private void _processContext_OnProcessFatalException(object sender, FatalExceptionEventArgs e) { OnMessageEvent?.Invoke(new Status($"""{e.FatalException.ToString()}")); _jobReport.FatalException = e.FatalException; OnFatalExceptionEvent?.Invoke(_jobReport); } private void _processContext_OnProcessProgressEvent(object sender, ProgressEventArgs e) { OnMessageEvent?.Invoke(new Status($"""{DateTime.Now}""{e.ProcessedDisplay}""")); OnProcessProgressEvent?.Invoke(new FullStatus(e.Total, e.Processed, e.ProcessedWithWarning, e.ProcessedWithError, e.StartTime, e.Timestamp, e.TotalDisplay, e.ProcessedDisplay, e.MetadataThroughput, e.NativeFileThroughput, e.ProcessId, e.Metadata)); } private void _processContext_RecordProcessedEvent(object sender, RecordNumberEventArgs e) { OnProgressEvent?.Invoke(e.RecordNumber); } private void _processContext_IncrementRecordCount(object sender, RecordCountEventArgs e) { JobReport jobReport; (jobReport = _jobReport).TotalRows = checked(jobReport.TotalRows + 1); } } }