/// <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));
        }
Exemple #2
0
        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();
        }
Exemple #4
0
        /// <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);
        }