/// <summary> /// Return a filled DawaProcessInfo class. /// </summary> /// <param name="processMode">From settings field EntityProcessMode.</param> /// <param name="dawaApiUri">From settings field DawaApiUri.</param> /// <param name="dawaApiReadTimeout">From settings field DawaApiReadTimeout.</param> /// <param name="txidOverride">From settings field TxidOverride.</param> /// <returns>Returns a filled DawaProcessInfo class.</returns> public static DawaProcessInfo MakeDawaProcessInfo(EntityProcessMode processMode, string dawaApiUri, int dawaApiReadTimeout, int txidOverride) { if (processMode == EntityProcessMode.Dagi) { return(new DawaProcessInfo(-1)); } if (txidOverride > 0) { return(new DawaProcessInfo(txidOverride)); } var txid = DawaTransactionHelper.GetLatestTransaction(dawaApiUri, dawaApiReadTimeout); return(new DawaProcessInfo(txid)); }
public static void AddTelemetryForEntity(EntityProcessMode mode, string entityName, System.Diagnostics.Stopwatch stopwatch, bool inSeconds = true) { if (stopwatch == null) { throw new ArgumentNullException(nameof(stopwatch)); } stopwatch.Stop(); var signalSource = new Dictionary <string, string> { { "signalSource", entityName } }; var processingTime = new Dictionary <string, double> { { "processingTime", inSeconds ? stopwatch.Elapsed.TotalSeconds : stopwatch.Elapsed.TotalMinutes } }; ApplicationInsightHelper.TelemetryClient.TrackEvent( $"Mode {mode}: Number of {(inSeconds ? "seconds" : "minutes")} taken to process the remainder of {entityName}", signalSource, processingTime); }
/// <summary> /// Create a new row in Entitystate for given entity. /// </summary> /// <param name="dbContext">Database context.</param> /// <param name="mode">EntityProcessMode. Udtraek/Update/Dagi.</param> /// <param name="entity">Entity name.</param> /// <param name="txid">Transaction ID.</param> public static void SetEntityStateStart(DawaReplicationDBContext dbContext, EntityProcessMode mode, string entity, long txid) { if (dbContext == null) { throw new ArgumentNullException(nameof(dbContext)); } if (entity == null) { throw new ArgumentNullException(nameof(entity)); } entity = entity.ToLower(); // Create entity if missing: if (!dbContext.Entitystate.Any(c => c.Entity == entity)) { var entitystate = new Entitystate { Entity = entity, }; dbContext.Add(entitystate); dbContext.SaveChanges(); } var row = dbContext.Entitystate.Single(c => c.Entity == entity); row.Txid = mode == EntityProcessMode.Update ? row.Txid : txid; row.Success = null; row.Successtime = null; row.SuccesstimeChange = row.SuccesstimeChange; row.Starttime = DateTime.Now; row.Finishtime = null; row.Count = null; row.Message = null; dbContext.Update(row); dbContext.SaveChanges(); }
/// <summary> /// Process active tables liste in config file. /// </summary> /// <param name="mode">Udtraek or Update.</param> /// <param name="dawaProcessInfo">Latest id from Dawa.</param> public static void ProcessTables(EntityProcessMode mode, DawaProcessInfo dawaProcessInfo) { if (dawaProcessInfo == null) { throw new ArgumentNullException(nameof(dawaProcessInfo)); } var entityTyperPath = AppDomain.CurrentDomain.BaseDirectory + "JOInformatik.DawaReplication.DataAccess.dll"; var entityAssembly = System.Reflection.Assembly.LoadFile(entityTyperPath); foreach (var tableName in TableList) { if ((mode == EntityProcessMode.Dagi && !tableName.StartsWith("DAGI__")) || (mode != EntityProcessMode.Dagi && tableName.StartsWith("DAGI__"))) { // If Mode is Dagi we only process dagi tables! continue; } var starttime = default(DateTime); Console.Write($"Processing {tableName}: "); try { EntityStateHelper.SetEntityStateStart(DBContext, mode, tableName, dawaProcessInfo.Txid); starttime = EntityStateHelper.SetEntityStateHistoryStart(DBContext, mode, tableName, dawaProcessInfo.Txid); } catch (Exception ex) { if (!dawaProcessInfo.FailedTables.Contains(tableName)) { dawaProcessInfo.FailedTables.Add(tableName); } var msg = $"Mode {mode}: Cannot SetEntityState {tableName}. Problem: {ex.Message}. Program will continue with next entity. "; Logger?.Error(msg, ex); Console.Write("\nERROR! " + msg); continue; } int count = 0; try { Type entityType = entityAssembly.GetType($"JOInformatik.DawaReplication.DataAccess.{tableName}"); count = (int)typeof(EntityManager) .GetMethod(mode.ToString()) .MakeGenericMethod(entityType) .Invoke(null, new object[] { dawaProcessInfo, starttime }); Console.WriteLine($"Count = {count}."); } catch (Exception ex) { if (!dawaProcessInfo.FailedTables.Contains(tableName)) { dawaProcessInfo.FailedTables.Add(tableName); } var exception = ex.InnerException ?? ex; var message = exception.Message; if (ex.InnerException != null && ex.InnerException is Newtonsoft.Json.JsonSerializationException) { message += " TIP: Try using FixList.csv file to set a valid value if was a 'value {null}' problem. The Path name is probaly the non-null database columnname."; } var finishtime = EntityStateHelper.SetEntityStateDone(DBContext, tableName, false, dawaProcessInfo.Txid, 0, message); EntityStateHelper.SetEntityStateHistoryDone(DBContext, tableName, false, starttime, finishtime, null, null, null, message); var msg = $"Mode {mode}: Cannot process entity {tableName}. Problem: {message}. Program will continue with next entity. "; Logger?.Error(msg, exception); Console.Write("\nERROR! " + msg); } } }
/// <summary> /// Create row in EntityStateHistory table for current transaction. /// </summary> /// <param name="dbContext">Database context.</param> /// <param name="mode">EntityProcessMode mode. Udtraek/Update/DAGI.</param> /// <param name="entity">Entity name.</param> /// <param name="txidTil">Transaction ID for updating the table up to.</param> /// <returns>DateTime to synchronize between EntityState tables.</returns> public static DateTime SetEntityStateHistoryStart(DawaReplicationDBContext dbContext, EntityProcessMode mode, string entity, long?txidTil) { if (dbContext == null) { throw new ArgumentNullException(nameof(dbContext)); } if (entity == null) { throw new ArgumentNullException(nameof(entity)); } entity = entity.ToLower(); EntitystateHistory row = new EntitystateHistory { Entity = entity, }; row.TxidFra = (mode == EntityProcessMode.Udtraek || mode == EntityProcessMode.Dagi) ? -1 : dbContext.EntitystateHistory.Where(c => c.Entity == entity && c.Success == true).OrderByDescending(c => c.Starttime).First().TxidTil; row.TxidTil = mode == EntityProcessMode.Dagi ? null : txidTil; row.Success = null; row.Starttime = DateTime.Now; row.Finishtime = null; row.InsertUpdateCount = null; row.DeleteCount = null; row.Message = null; dbContext.Add(row); dbContext.SaveChanges(); return(row.Starttime); }