public void FixList_FjernerDuplicates_ListCount0_Success() { // Arrange var listInsertOrUpdate = new List <Ejerlav>(); var listDelete = new List <Ejerlav>(); int expectedDelCount = 0; int expectedUpsertCount = 0; //int expectedTxid = 0; // Act UpdateEntityHelper.ProcessOperationLists(listDelete, listInsertOrUpdate); // Assert int delCount = listDelete.Count(); int upsertCount = listInsertOrUpdate.Count(); //int txid = listInsertOrUpdate[0].EntityTxid; Assert.AreEqual(expectedDelCount, delCount); Assert.AreEqual(expectedUpsertCount, upsertCount); //Assert.AreEqual(expectedTxid, txid); }
public void FixUpdList_FjernerDuplicates_ListCount3_Success() { // Arrange var listInsertOrUpdate = new List <Ejerlav>(); var listDelete = new List <Ejerlav>(); JObject update1item = JObject.Parse(TxidEjerlav1u); Ejerlav update1 = new Ejerlav() { Kode = 101 }; update1.SetEntityFields(update1item); JObject update2item = JObject.Parse(TxidEjerlav2u); Ejerlav update2 = new Ejerlav() { Kode = 101 }; update2.SetEntityFields(update2item); JObject update3item = JObject.Parse(TxidEjerlav3u); Ejerlav update3 = new Ejerlav() { Kode = 101 }; update3.SetEntityFields(update3item); listInsertOrUpdate.Add(update1); listInsertOrUpdate.Add(update2); listInsertOrUpdate.Add(update3); int expectedDelCount = 0; int expectedUpsertCount = 1; int expectedTxid = 8; // Act UpdateEntityHelper.ProcessOperationLists(listDelete, listInsertOrUpdate); // Assert int delCount = listDelete.Count(); int upsertCount = listInsertOrUpdate.Count(); long txid = listInsertOrUpdate[0].EntityTxid; Assert.AreEqual(expectedDelCount, delCount); Assert.AreEqual(expectedUpsertCount, upsertCount); Assert.AreEqual(expectedTxid, txid); }
/// <summary> /// Get data from DAWA WebApi and update database. /// </summary> /// <param name="dawaProcessInfo">Latest id from Dawa.</param> /// <returns>Count of all deleted, inserted and updated rows.</returns> /// <typeparam name="T">Any entity class in the JOInformatik.DawaReplication.DataAccess namespace.</typeparam> public static int Update <T>(DawaProcessInfo dawaProcessInfo, DateTime starttime) where T : ReplicationBase { if (dawaProcessInfo == null) { throw new ArgumentNullException(nameof(dawaProcessInfo)); } if (dawaProcessInfo.Txid < 1) { #pragma warning disable CA2208 // Instantiate argument exceptions correctly throw new ArgumentOutOfRangeException(nameof(dawaProcessInfo.Txid)); #pragma warning restore CA2208 // Instantiate argument exceptions correctly } var methodName = LoggingUtils.GetMethodName(); string entityName = typeof(T).Name; Logger?.Info($"{methodName}: Processing entity {entityName}"); var fixInfo = fixInfoList.Find(x => x.TableName == entityName); var listInsertOrUpdate = new List <T>(); var listDelete = new List <T>(); long txidfra = EntityStateHelper.GetTxid(DBContext, entityName).Value + 1; var stopwatch = System.Diagnostics.Stopwatch.StartNew(); // Always use "&noformat" for increased performance: using (var httpClient = new HttpClient()) { var stream = httpClient.GetStreamAsync($"{DawaApiUri}replikering/haendelser?entitet={entityName.ToLowerInvariant()}&txidfra={txidfra}&txidtil={dawaProcessInfo.Txid}&noformat").Result; stream.ReadTimeout = ReadTimeoutInSeconds * 1000; using (var reader = new JsonTextReader(new StreamReader(stream))) { while (reader.Read()) { if (reader.TokenType == JsonToken.StartObject) { var item = JObject.Load(reader); var operation = item.Property("operation").Value.ToString(); if (operation != null && (operation == "update" || operation == "insert" || operation == "delete")) { var itemData = item.Property("data").First.ToString(Formatting.None); if (fixInfo != null) { itemData = itemData.Replace(fixInfo.DataValueBad, fixInfo.DataValueValid); } T itemAsObject = JsonConvert.DeserializeObject <T>(itemData, UserJsonSerializerSettings); itemAsObject.SetEntityFields(item); switch (operation) { case "insert": case "update": listInsertOrUpdate.Add(itemAsObject); break; case "delete": listDelete.Add(itemAsObject); break; } } else { Logger?.Warn($"{methodName}: Unrecognized operation '{operation}' for {entityName}. Txid = {dawaProcessInfo.Txid}"); } } } } } UpdateEntityHelper.ProcessOperationLists(listDelete, listInsertOrUpdate); int deleteCount = listDelete.Count; int insertUpdateCount = listInsertOrUpdate.Count; if (insertUpdateCount == 0 && deleteCount == 0) { Logger?.Info($"{methodName}: {entityName}: No changes"); var finishtime = EntityStateHelper.SetEntityStateDone(DBContext, entityName, true, dawaProcessInfo.Txid, 0); EntityStateHelper.SetEntityStateHistoryDone(DBContext, entityName, true, starttime, finishtime, txidfra, insertUpdateCount, deleteCount); } else { Logger?.Info($"{methodName}: {entityName}: Inserted and Updated = {insertUpdateCount}, Deleted={deleteCount}"); int totalCount = insertUpdateCount + deleteCount; DBContext.Database.BeginTransaction(); try { DBContext.BulkInsertOrUpdate(listInsertOrUpdate); DBContext.BulkDelete(listDelete); var finishtime = EntityStateHelper.SetEntityStateDone(DBContext, entityName, true, dawaProcessInfo.Txid, totalCount); EntityStateHelper.SetEntityStateHistoryDone(DBContext, entityName, true, starttime, finishtime, txidfra, insertUpdateCount, deleteCount); DBContext.Database.CommitTransaction(); if (UseMSApplicationInsights) { TelemetryHelper.AddTelemetryForEntity(EntityProcessMode.Update, entityName, stopwatch); } } catch (Exception ex) { if (DBContext.Database.CurrentTransaction != null) { DBContext.Database.RollbackTransaction(); } var exception = ex.InnerException ?? ex; var finishtime = EntityStateHelper.SetEntityStateDone(DBContext, entityName, false, txidfra, totalCount, exception.Message); EntityStateHelper.SetEntityStateHistoryDone(DBContext, entityName, false, starttime, finishtime, txidfra, null, null, exception.Message); throw; } } return(listInsertOrUpdate.Count + listDelete.Count); }
public void FixList_NoDuplicates_Success() { // Arrange var listInsertOrUpdate = new List <Ejerlav>(); var listDelete = new List <Ejerlav>(); JObject update1item = JObject.Parse(TxidEjerlav1u); Ejerlav update1 = new Ejerlav() { Kode = 101 }; update1.SetEntityFields(update1item); JObject update2item = JObject.Parse(TxidEjerlav2u); Ejerlav update2 = new Ejerlav() { Kode = 102 }; update2.SetEntityFields(update2item); JObject update3item = JObject.Parse(TxidEjerlav3u); Ejerlav update3 = new Ejerlav() { Kode = 103 }; update3.SetEntityFields(update3item); JObject delete1item = JObject.Parse(TxidEjerlav3d); Ejerlav delete1 = new Ejerlav() { Kode = 104 }; delete1.SetEntityFields(delete1item); JObject delete2item = JObject.Parse(TxidEjerlav4d); Ejerlav delete2 = new Ejerlav() { Kode = 105 }; delete2.SetEntityFields(delete2item); JObject delete3item = JObject.Parse(TxidEjerlav5d); Ejerlav delete3 = new Ejerlav() { Kode = 106 }; delete3.SetEntityFields(delete3item); listInsertOrUpdate.Add(update1); listInsertOrUpdate.Add(update2); listDelete.Add(delete1); listDelete.Add(delete2); listDelete.Add(delete3); listInsertOrUpdate.Add(update3); int expectedDelCount = 3; int expectedUpsertCount = 3; int expectedTxid = 8; // Act UpdateEntityHelper.ProcessOperationLists(listDelete, listInsertOrUpdate); // Assert int delCount = listDelete.Count(); int upsertCount = listInsertOrUpdate.Count(); long txid = listInsertOrUpdate.Max(f => f.EntityTxid); Assert.AreEqual(expectedDelCount, delCount); Assert.AreEqual(expectedUpsertCount, upsertCount); Assert.AreEqual(expectedTxid, txid); }