/// <summary> /// Saves the specified egm metrics. /// </summary> /// <param name="egmMetrics">The egm metrics.</param> public void Save(ICollection <EgmMetric> egmMetrics) { using (var context = new HmsDbContext()) { //context.Database.Log = Console.Write; foreach (var egmMetric in egmMetrics) { if (!context.EgmMetrics.Any(metric => metric.Id == egmMetric.Id)) { // no matching PK for this EgmMetric in database, // thus we create new entity and add it to db DaoUtilities.SaveCreatedEntity(context, context.EgmMetrics, egmMetric, SetNewEntityState, false); } else { // matching PK found, thus we update state of existing EgmMetric entity DaoUtilities.SaveUpdatedEntity(context, context.EgmMetrics, egmMetric, UpdateExistingEntityState, false); } } DaoUtilities.SaveToDbWithRetry(context, DaoUtilities.SaveType.UpdateExistingEntity, ResolveEntityUpdateConflict); } }
/// <summary> /// Gets the EgmWindowsEvent entity with the specified ID/PK. /// </summary> /// <param name="windowsEventId">The windows event identifier.</param> /// <returns>EgmWindowsEvent.</returns> public EgmWindowsEvent GetById(long windowsEventId) { using (var context = new HmsDbContext()) { return(context.EgmWindowsEvents.Find(windowsEventId)); } }
/// <summary> /// Gets the EgmMetric entity with the specified ID/PK. /// </summary> /// <param name="metricId">The metric identifier.</param> /// <returns>EgmMetric.</returns> public EgmMetric GetById(long metricId) { using (var context = new HmsDbContext()) { return(context.EgmMetrics.Find(metricId)); } }
/// <summary> /// Gets the CompositeEgmMeterData entity with the specified ID/PK. /// </summary> /// <param name="compositeMeterDataId">The composite EGM meter data identifier.</param> /// <returns>CompositeEgmMeterData.</returns> public CompositeEgmMeterData GetById(long compositeMeterDataId) { using (var context = new HmsDbContext()) { return(context.CompositeEgmMeterDatas.Find(compositeMeterDataId)); } }
/// <summary> /// Saves the specified composite egm meter datas. /// </summary> /// <param name="compositeEgmMeterDatas">The composite egm meter datas.</param> public void Save(ICollection <CompositeEgmMeterData> compositeEgmMeterDatas) { using (var context = new HmsDbContext()) { //context.Database.Log = Console.Write; foreach (var compositeEgmMeterData in compositeEgmMeterDatas) { if (!context.CompositeEgmMeterDatas.Any(cemd => cemd.Id == compositeEgmMeterData.Id)) { // no matching PK for this CompositeEgmMeterData in database, // thus we create new entity and add it to db DaoUtilities.SaveCreatedEntity(context, context.CompositeEgmMeterDatas, compositeEgmMeterData, SetNewEntityState, false); } else { // matching PK found, thus we update state of existing CompositeEgmMeterData entity DaoUtilities.SaveUpdatedEntity(context, context.CompositeEgmMeterDatas, compositeEgmMeterData, UpdateExistingEntityState, false); } } DaoUtilities.SaveToDbWithRetry(context, DaoUtilities.SaveType.UpdateExistingEntity, ResolveEntityUpdateConflict); } }
/// <summary> /// Gets all unsent EgmWindowsEvent entities. /// </summary> /// <param name="reported">if set to <c>true</c> includes only EgmWindowsEvents which have been reported.</param> /// <param name="maxRecords">The maximum records to return from a query.</param> /// <returns>ICollection<EgmWindowsEvent>.</returns> public ICollection <EgmWindowsEvent> GetUnsent(bool reported = false, int maxRecords = DaoUtilities.NoRecordLimit) { using (var context = new HmsDbContext()) { var query = context.EgmWindowsEvents.AsQueryable().Where(winEvt => winEvt.SentAt == DaoUtilities.UnsentData); if (reported) { query = query.Where(winEvt => winEvt.ReportGuid != Guid.Empty); } query = query.OrderBy(winEvt => winEvt.CasinoCode) .ThenBy(winEvt => winEvt.EgmSerialNumber) .ThenBy(winEvt => winEvt.EgmAssetNumber) .ThenBy(winEvt => winEvt.ReportedAt) .ThenBy(winEvt => winEvt.OccurredAt); if (DaoUtilities.NoRecordLimit != maxRecords && 0 < maxRecords) { query = query.Take(maxRecords); } return(query.ToList()); } }
/// <summary> /// Saves Pending Changes in the Open Context to the database. /// </summary> /// <param name="context">The context.</param> public static void SaveToDb(HmsDbContext context) { try { context.SaveChanges(); } catch (DbUpdateConcurrencyException dbcex) { // This type of exception is indicative of an optimistic locking conflict - e.g., another // thread has updated the same db record after we had pulled the entity out of the db, but before // we saved. In such situations, we re-throw here so the calling code can retry the save if possible. Logger.Warn( $"DaoUtilities.SaveToDb : DbUpdateConcurrencyException caught - [{dbcex.Message}]"); throw; } catch (Exception ex) { Logger.Warn($"DaoUtilities.SaveToDb : Exception caught - [{ex.Message}]"); var innerEx = ex.InnerException; while (null != innerEx) { Logger.Warn($"DaoUtilities.SaveToDb : Inner Exception: [{innerEx.Message}]"); innerEx = innerEx.InnerException; } } }
/// <summary> /// Updates the version of the specified entity. /// </summary> /// <param name="context">The context.</param> /// <param name="entityEntry">The entity entry</param> public static void UpdateVersion(HmsDbContext context, DbEntityEntry entityEntry) { if ((entityEntry.State & EntityState.Modified) != 0) { ((EntityBase)entityEntry.Entity).Version++; } }
/// <summary> /// Gets the EgmMeterReading entity with the specified ID/PK. /// </summary> /// <param name="meterReadingId">The meter reading identifier.</param> /// <returns>EgmMeterReading.</returns> public EgmMeterReading GetById(long meterReadingId) { using (var context = new HmsDbContext()) { return(context.EgmMeterReadings.Find(meterReadingId)); } }
/// <summary> /// Gets all unsent EgmMeterReading entities. /// </summary> /// <param name="reported">if set to <c>true</c> includes only EgmMeterReadings which have been reported.</param> /// <param name="maxRecords">The maximum records to include in the query result.</param> /// <returns>ICollection<EgmMeterReading>.</returns> public ICollection <EgmMeterReading> GetUnsent(bool reported = false, int maxRecords = DaoUtilities.NoRecordLimit) { using (var context = new HmsDbContext()) { var query = context.EgmMeterReadings.AsQueryable().Where(mr => mr.SentAt == DaoUtilities.UnsentData); if (reported) { query = query.Where(mr => mr.ReportGuid != Guid.Empty); } query = query.OrderBy(mr => mr.CasinoCode) .ThenBy(mr => mr.EgmSerialNumber) .ThenBy(mr => mr.EgmAssetNumber) .ThenBy(mr => mr.GameTitle) .ThenBy(mr => mr.GameDenomination) .ThenBy(mr => mr.ReportedAt).ThenBy(mr => mr.ReadAt); if (DaoUtilities.NoRecordLimit != maxRecords && 0 < maxRecords) { query = query.Take(maxRecords); } return(query.ToList()); } }
/// <summary> /// Gets the EgmVersion entity with the specified ID/PK. /// </summary> /// <param name="versionId">The version identifier.</param> /// <returns>EgmMeterReading.</returns> public EgmVersion GetById(long versionId) { using (var context = new HmsDbContext()) { return(context.EgmVersions.Find(versionId)); } }
/// <summary> /// Gets EgmMetric Entities older than specified date-time. /// </summary> /// <param name="oldDateTime">The time to use for the older-than comparison.</param> /// <returns>ICollection<EgmMetric>.</returns> public ICollection <EgmMetric> GetOlderThan(DateTime oldDateTime) { using (var context = new HmsDbContext()) { return (context.EgmMetrics.AsQueryable() .Where(mr => mr.ReportedAt != DaoUtilities.UnsentData && mr.ReportedAt <= oldDateTime) .ToList()); } }
/// <summary> /// Gets EgmEvent Entities older than specified date-time. /// </summary> /// <param name="oldDateTime">The time to use for the older-than comparison.</param> /// <returns>ICollection<EgmEvent>.</returns> public ICollection <EgmEvent> GetOlderThan(DateTime oldDateTime) { using (var context = new HmsDbContext()) { return (context.EgmEvents.AsQueryable() .Where(evt => evt.ReportedAt != DaoUtilities.UnsentData && evt.ReportedAt < oldDateTime) .ToList()); } }
/// <summary> /// Cleans EgmMetric Entities older than specified date-time. /// </summary> /// <param name="oldDateTime">The old date time.</param> public void CleanOlderThan(DateTime oldDateTime) { using (var context = new HmsDbContext()) { context.EgmMetrics.RemoveRange( context.EgmMetrics.Where( mr => mr.ReportedAt != DaoUtilities.UnsentData && mr.ReportedAt < oldDateTime)); DaoUtilities.SaveToDbWithRetry(context, DaoUtilities.SaveType.DeleteExistingEntity, ResolveEntityUpdateConflict); } }
/// <summary> /// Saves the created entity. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="context">The context.</param> /// <param name="dbSet">The database set.</param> /// <param name="entity">The entity.</param> /// <param name="createEntityAction">The create entity action.</param> /// <param name="doSaveChanges">if true, save changes in HmsDbContext; otherwise do not</param> public static void SaveCreatedEntity <T>(HmsDbContext context, DbSet <T> dbSet, T entity, Action <T> createEntityAction, bool doSaveChanges = true) where T : EntityBase { createEntityAction(entity); dbSet.Add(entity); if (doSaveChanges) { SaveToDb(context); } }
/// <summary> /// Saves to database with retry. /// </summary> /// <param name="context">The context.</param> /// <param name="saveType">Type of the save.</param> /// <param name="resolveConflict">The function to call when conflict resolution is needed.</param> public static void SaveToDbWithRetry(HmsDbContext context, SaveType saveType, Action <HmsDbContext, DbEntityEntry> resolveConflict) { var numSaveAttempts = 0; while (MaxSaveRetries > numSaveAttempts) { try { SaveToDb(context); break; } catch (DbUpdateConcurrencyException ex) { if (MaxSaveRetries <= ++numSaveAttempts) { Logger.Warn( $"DaoUtilities.SaveToDbWithRetry - DbUpdateConcurrencyException retry count exceeded max limit of {MaxSaveRetries}. Aborting."); } else { Logger.Info( $"DaoUtilities.SaveToDbWithRetry - DbUpdateConcurrencyException caught [{ex.Message}]; retrying context save"); switch (saveType) { case SaveType.AddNewEntity: // This should never happen - No-op break; case SaveType.DeleteExistingEntity: foreach (var failedEntityEntry in ex.Entries) { failedEntityEntry.Reload(); failedEntityEntry.State = EntityState.Deleted; } break; case SaveType.UpdateExistingEntity: foreach (var failedEntityEntry in ex.Entries) { resolveConflict(context, failedEntityEntry); } break; default: throw new ArgumentOutOfRangeException(nameof(saveType), saveType, null); } } } } }
/// <summary> /// Gets all EgmVersion Entities. /// </summary> /// <returns>ICollection<EgmVersion>.</returns> public ICollection <EgmVersion> GetAll() { using (var context = new HmsDbContext()) { return(context.EgmVersions.AsQueryable() .OrderBy(v => v.CasinoCode) .ThenBy(v => v.EgmSerialNumber) .ThenBy(v => v.EgmAssetNumber) .ThenBy(v => v.ReportedAt) .ToList()); } }
/// <summary> /// Deletes the specified egm windows event entity. /// </summary> /// <param name="egmWindowsEvent">The egm windows event entity.</param> public void Delete(EgmWindowsEvent egmWindowsEvent) { using (var context = new HmsDbContext()) { if (!context.EgmWindowsEvents.Any(winEvt => winEvt.Id == egmWindowsEvent.Id)) { return; } // matching PK found, thus we proceed with Delete DaoUtilities.DeleteEntity(context, context.EgmWindowsEvents, egmWindowsEvent); } }
/// <summary> /// Gets the Number of unsent EgmVersion entities. /// </summary> /// <param name="reported">if set to <c>true</c> includes only EgmVersion entities which have been reported.</param> /// <returns>The number of unsent EgmVersion entities</returns> public int NumUnsent(bool reported = false) { using (var context = new HmsDbContext()) { var query = context.EgmVersions.AsQueryable().Where(v => v.SentAt == DaoUtilities.UnsentData); if (reported) { query = query.Where(v => v.ReportGuid != Guid.Empty); } return(query.Count()); } }
/// <summary> /// Are there any unsent EgmMetric entities? /// </summary> /// <param name="reported">if set to <c>true</c> includes only EgmMetric entities which have been reported.</param> /// <returns><c>true</c> if there are any unsent EgmMetric entities, <c>false</c> otherwise.</returns> public bool AreUnsent(bool reported = false) { using (var context = new HmsDbContext()) { var query = context.EgmMetrics.AsQueryable().Where(evt => evt.SentAt == DaoUtilities.UnsentData); if (reported) { query = query.Where(evt => evt.ReportGuid != Guid.Empty); } return(query.Any()); } }
/// <summary> /// Deletes the specified composite egm meter data. /// </summary> /// <param name="compositeEgmMeterData">The composite egm meter data.</param> public void Delete(CompositeEgmMeterData compositeEgmMeterData) { using (var context = new HmsDbContext()) { if (!context.CompositeEgmMeterDatas.Any(cemd => cemd.Id == compositeEgmMeterData.Id)) { return; } // matching PK found, thus we proceed with Delete DaoUtilities.DeleteEntity(context, context.CompositeEgmMeterDatas, compositeEgmMeterData); } }
/// <summary> /// Gets all EgmMetric Entities. /// </summary> /// <returns>ICollection<EgmMetric>.</returns> public ICollection <EgmMetric> GetAll() { using (var context = new HmsDbContext()) { return (context.EgmMetrics.AsQueryable() .OrderBy(mr => mr.CasinoCode) .ThenBy(mr => mr.EgmSerialNumber) .ThenBy(mr => mr.EgmAssetNumber) .ThenBy(mr => mr.ReportedAt).ThenBy(mr => mr.ReadAt) .ToList()); } }
/// <summary> /// Deletes the specified EgmMetric entity. /// </summary> /// <param name="egmMetric">The EgmMetric entity to delete.</param> public void Delete(EgmMetric egmMetric) { using (var context = new HmsDbContext()) { if (!context.EgmMetrics.Any(mr => mr.Id == egmMetric.Id)) { return; } // matching PK found, thus we proceed with Delete DaoUtilities.DeleteEntity(context, context.EgmMetrics, egmMetric); } }
/// <summary> /// Deletes the specified EgmVersion entity. /// </summary> /// <param name="egmVersion">The EgmVersion entity to delete.</param> public void Delete(EgmVersion egmVersion) { using (var context = new HmsDbContext()) { if (!context.EgmVersions.Any(v => v.Id == egmVersion.Id)) { return; } // matching PK found, thus we proceed with Delete DaoUtilities.DeleteEntity(context, context.EgmVersions, egmVersion); } }
/// <summary> /// Gets all EgmWindowsEvent Entities. /// </summary> /// <returns>ICollection<EgmWindowsEvent>.</returns> public ICollection <EgmWindowsEvent> GetAll() { using (var context = new HmsDbContext()) { return (context.EgmWindowsEvents.AsQueryable() .OrderBy(winEvt => winEvt.CasinoCode) .ThenBy(winEvt => winEvt.EgmSerialNumber) .ThenBy(winEvt => winEvt.EgmAssetNumber) .ThenBy(winEvt => winEvt.ReportedAt) .ThenBy(winEvt => winEvt.OccurredAt) .ToList()); } }
/// <summary> /// Gets all unreported EgmEvent entities. /// </summary> /// <returns>ICollection<EgmEvent>.</returns> public ICollection <EgmEvent> GetUnreported() { using (var context = new HmsDbContext()) { return (context.EgmEvents.AsQueryable() .Where(evt => evt.ReportGuid == Guid.Empty) .OrderBy(evt => evt.CasinoCode) .ThenBy(evt => evt.EgmSerialNumber) .ThenBy(evt => evt.EgmAssetNumber) .ThenBy(evt => evt.ReportedAt) .ThenBy(evt => evt.OccurredAt) .ToList()); } }
/// <summary> /// Gets all CompositeEgmMeterData Entities. /// </summary> /// <returns>ICollection<CompositeEgmMeterData>.</returns> public ICollection <CompositeEgmMeterData> GetAll() { using (var context = new HmsDbContext()) { return (context.CompositeEgmMeterDatas.AsQueryable() .OrderBy(cemd => cemd.CasinoName) .ThenBy(cemd => cemd.SerialNumber) .ThenBy(cemd => cemd.AssetNumber) .ThenBy(cemd => cemd.GameTheme) .ThenBy(cemd => cemd.Denomination) .ThenBy(cemd => cemd.AuditDate) .ToList()); } }
/// <summary> /// Gets all unreported EgmMeterReading entities. /// </summary> /// <returns>ICollection<EgmMeterReading>.</returns> public ICollection <EgmMeterReading> GetUnreported() { using (var context = new HmsDbContext()) { return (context.EgmMeterReadings.AsQueryable() .Where(mr => mr.ReportGuid == Guid.Empty) .OrderBy(mr => mr.CasinoCode) .ThenBy(mr => mr.EgmSerialNumber) .ThenBy(mr => mr.EgmAssetNumber) .ThenBy(mr => mr.GameTitle) .ThenBy(mr => mr.GameDenomination) .ThenBy(mr => mr.ReportedAt).ThenBy(mr => mr.ReadAt) .ToList()); } }
/// <summary> /// Updates the state of the existing entity. /// </summary> /// <param name="context">The context.</param> /// <param name="entityEntry">The entity entry.</param> /// <param name="egmWindowsEvent">The egm windows event entity.</param> private static void UpdateExistingEntityState(HmsDbContext context, DbEntityEntry entityEntry, EgmWindowsEvent egmWindowsEvent) { var winEvtEntity = (EgmWindowsEvent)entityEntry.Entity; if (!winEvtEntity.SentAt.Equals(egmWindowsEvent.SentAt)) { winEvtEntity.SentAt = egmWindowsEvent.SentAt; } if (!winEvtEntity.ReportGuid.Equals(egmWindowsEvent.ReportGuid)) { winEvtEntity.ReportGuid = egmWindowsEvent.ReportGuid; } DaoUtilities.UpdateVersion(context, entityEntry); }
/// <summary> /// Updates the state of the existing entity. /// </summary> /// <param name="context">The context.</param> /// <param name="entityEntry">The entity entry.</param> /// <param name="egmMetric">The egm metric.</param> private static void UpdateExistingEntityState(HmsDbContext context, DbEntityEntry entityEntry, EgmMetric egmMetric) { var metricEntity = (EgmMetric)entityEntry.Entity; if (!metricEntity.SentAt.Equals(egmMetric.SentAt)) { metricEntity.SentAt = egmMetric.SentAt; } if (!metricEntity.ReportGuid.Equals(egmMetric.ReportGuid)) { metricEntity.ReportGuid = egmMetric.ReportGuid; } DaoUtilities.UpdateVersion(context, entityEntry); }