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 ;
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);
}
}
}