private void BetSettlement(bet_settlement e, dbEntities db, string routeKey) { using (var dbContextTransaction = db.Database.BeginTransaction()) { var sectionName = string.Empty; var spParams = string.Empty; try { var marketIdList = string.Empty; var specifierList = string.Empty; var outcomeIdList = string.Empty; var resultList = string.Empty; var certaintyList = string.Empty; var productList = string.Empty; foreach (var market in e.outcomes) { var marketId = market.id; var specifier = market.specifiers?.Split('=').LastOrDefault()?.Trim(); foreach (var outcome in market.Items) { marketIdList += marketId + ","; specifierList += specifier + ","; outcomeIdList += outcome.id.Split(':').LastOrDefault() + ","; resultList += outcome.result + ","; certaintyList += e.certainty + ","; productList += e.product + ","; marketId = 0; if (!string.IsNullOrEmpty(specifier)) { specifier = "*"; } } } sectionName = "bet_settlement"; spParams = "EXECUTE PROCEDURE BET_EVENTRESULTS_I_MULTI("; spParams += SourceId + ","; spParams += e.event_id.Split(':').Last() + ","; spParams += "'" + marketIdList.Substring(0).Trim() + "',"; spParams += "'" + specifierList.Substring(0).Trim() + "',"; spParams += "'" + outcomeIdList.Substring(0).Trim() + "',"; spParams += "'" + resultList.Substring(0).Trim() + "',"; spParams += "'" + certaintyList.Substring(0).Trim() + "',"; spParams += "'" + productList.Substring(0).Trim() + "',"; spParams += e.GeneratedAt + ")"; db.Database.ExecuteSqlCommand(spParams.Trim()); dbContextTransaction.Commit(); SerilogHelper.Information($"{routeKey} {UtcHelper.GetDifferenceFromTimestamp(e.timestamp) + "ms"}"); } catch (Exception ex) { dbContextTransaction.Rollback(); SerilogHelper.Exception($"Unknown exception in {routeKey} SectionName:{sectionName} SQL:{spParams.Trim()}", ex); } } }
public IBetSettlement <T> MapBetSettlement <T>(bet_settlement message, IEnumerable <CultureInfo> cultures, byte[] rawMessage) where T : ISportEvent { Contract.Requires(message != null); Contract.Ensures(Contract.Result <IBetSettlement <T> >() != null); return(Contract.Result <IBetSettlement <T> >()); }
/// <summary> /// Validates the provided <see cref="bet_settlement" /> message /// </summary> /// <param name="message">The <see cref="bet_settlement" /> message to validate</param> /// <returns>The <see cref="ValidationResult" /> specifying the result of validation</returns> protected ValidationResult ValidateBetSettlement(bet_settlement message) { Contract.Requires(message != null); ValidateMessageProducer(message); if (!ValidateMessage(message)) { return(ValidationResult.FAILURE); } if (message.outcomes == null || !message.outcomes.Any()) { return(ValidationResult.SUCCESS); } var result = ValidationResult.SUCCESS; for (var marketIndex = 0; marketIndex < message.outcomes.Length; marketIndex++) { var market = message.outcomes[marketIndex]; if (!ValidateSpecifiers(message, market, marketIndex)) { result = ValidationResult.PROBLEMS_DETECTED; } if (!CheckSpecifiersAsync(message.ProducerId, market.id, market.Specifiers).Result) { result = ValidationResult.PROBLEMS_DETECTED; } } return(result); }
/// <summary> /// Validates the provided <see cref="bet_settlement" /> message /// </summary> /// <param name="message">The <see cref="bet_settlement" /> message to validate</param> /// <returns>The <see cref="ValidationResult" /> specifying the result of validation</returns> protected ValidationResult ValidateBetSettlement(bet_settlement message) { Guard.Argument(message, nameof(message)).NotNull(); ValidateMessageProducer(message); if (!ValidateMessage(message)) { return(ValidationResult.FAILURE); } if (message.outcomes == null || !message.outcomes.Any()) { return(ValidationResult.SUCCESS); } var result = ValidationResult.SUCCESS; foreach (var market in message.outcomes) { if (!ValidateSpecifiers(message, market, market.id)) { result = ValidationResult.PROBLEMS_DETECTED; } if (!CheckSpecifiersAsync(message.ProducerId, market.id, market.Specifiers).Result) { result = ValidationResult.PROBLEMS_DETECTED; } } return(result); }
/// <summary> /// Initializes a new instance of the <see cref="OddsChangeEventArgs{T}"/> class /// </summary> /// <param name="messageMapper">A <see cref="IFeedMessageMapper"/> used to map feed message to the one dispatched to the user</param> /// <param name="feedMessage">A <see cref="bet_settlement"/> message received from the feed</param> /// <param name="cultures">A <see cref="IEnumerable{CultureInfo}"/> specifying the default languages to which the received message is translated</param> /// <param name="rawMessage">A raw message received from the feed</param> internal BetSettlementEventArgs(IFeedMessageMapper messageMapper, bet_settlement feedMessage, IEnumerable <CultureInfo> cultures, byte[] rawMessage) { Guard.Argument(messageMapper, nameof(messageMapper)).NotNull(); Guard.Argument(feedMessage, nameof(feedMessage)).NotNull(); Guard.Argument(cultures, nameof(cultures)).NotNull().NotEmpty(); _messageMapper = messageMapper; _feedMessage = feedMessage; _defaultCultures = cultures as IReadOnlyCollection <CultureInfo>; _rawMessage = rawMessage; }
private void LoadEntityFromFile(bool load = false) { if (_entity == null || load) { var stream = FileHelper.OpenFile(TestData.FeedXmlPath, "bet_settlement.xml"); _record = Deserializer.Deserialize <bet_settlement>(stream); TestData.FillMessageTimestamp(_record); _record.SportId = URN.Parse("sr:sport:1000"); _entity = _mapper.MapBetSettlement <ICompetition>(_record, new[] { TestData.Culture }, null); } }
/// <summary> /// Initializes a new instance of the <see cref="OddsChangeEventArgs{T}"/> class /// </summary> /// <param name="messageMapper">A <see cref="IFeedMessageMapper"/> used to map feed message to the one dispatched to the user</param> /// <param name="feedMessage">A <see cref="bet_settlement"/> message received from the feed</param> /// <param name="cultures">A <see cref="IEnumerable{CultureInfo}"/> specifying the default languages to which the received message is translated</param> /// <param name="rawMessage">A raw message received from the feed</param> internal BetSettlementEventArgs(IFeedMessageMapper messageMapper, bet_settlement feedMessage, IEnumerable <CultureInfo> cultures, byte[] rawMessage) { Contract.Requires(messageMapper != null); Contract.Requires(feedMessage != null); Contract.Requires(cultures != null && cultures.Any()); _messageMapper = messageMapper; _feedMessage = feedMessage; _defaultCultures = cultures as IReadOnlyCollection <CultureInfo>; _rawMessage = rawMessage; }
/// <summary> /// Maps (converts) the provided <see cref="bet_settlement"/> instance to the <see cref="IBetSettlement{T}"/> instance /// </summary> /// <param name="message">A <see cref="bet_settlement"/> instance to be mapped (converted)</param> /// <param name="cultures">A <see cref="IEnumerable{CultureInfo}" /> specifying the languages to which the mapped message will be translated</param> /// <param name="rawMessage">The raw message</param> /// <returns>A <see cref="IBetSettlement{T}"/> instance constructed from information in the provided <see cref="bet_settlement"/></returns> public IBetSettlement <T> MapBetSettlement <T>(bet_settlement message, IEnumerable <CultureInfo> cultures, byte[] rawMessage) where T : ISportEvent { var culturesList = cultures as List <CultureInfo> ?? cultures.ToList(); return(new BetSettlement <T>(new MessageTimestamp(message.GeneratedAt, message.SentAt, message.ReceivedAt, SdkInfo.ToEpochTime(DateTime.Now)), _producerManager.Get(message.product), GetEventForMessage <T>(URN.Parse(message.event_id), message.SportId, culturesList), message.request_idSpecified ? (long?)message.request_id : null, message.outcomes.Select(m => GetMarketWithResults(GetEventForNameProvider <T>(URN.Parse(message.event_id), message.SportId, culturesList), m, message.ProducerId, message.SportId, culturesList)), message.certainty, rawMessage)); }
private void TestEntityValues(IBetSettlement <ICompetition> entity, bet_settlement record, AssertHelper assertHelper) { assertHelper.AreEqual(() => entity.Event.Id.ToString(), record.event_id); var rProduct = TestProducerManager.Create().Get(record.product); assertHelper.AreEqual(() => entity.Producer, rProduct); assertHelper.AreEqual(() => entity.RequestId, record.request_idSpecified ? (long?)record.request_id : null); assertHelper.AreEqual(() => entity.Timestamps.Created, record.timestamp); TestMarketOutcomes(entity.Markets.ToList(), record.outcomes, assertHelper); }
/// <summary> /// Initializes a new instance of the <see cref="OddsChangeEventArgs{T}"/> class /// </summary> /// <param name="messageMapper">A <see cref="IFeedMessageMapper"/> used to map feed message to the one dispatched to the user</param> /// <param name="feedMessage">A <see cref="bet_settlement"/> message received from the feed</param> /// <param name="cultures">A <see cref="IEnumerable{CultureInfo}"/> specifying the default languages to which the received message is translated</param> /// <param name="rawMessage">A raw message received from the feed</param> internal BetSettlementEventArgs(IFeedMessageMapper messageMapper, bet_settlement feedMessage, IEnumerable <CultureInfo> cultures, byte[] rawMessage) { Guard.Argument(messageMapper, nameof(messageMapper)).NotNull(); Guard.Argument(feedMessage, nameof(feedMessage)).NotNull(); if (!cultures.Any()) { throw new ArgumentOutOfRangeException(nameof(cultures)); } _messageMapper = messageMapper; _feedMessage = feedMessage; _defaultCultures = cultures as IReadOnlyCollection <CultureInfo>; _rawMessage = rawMessage; _betSettlement = GetBetSettlement(); }
/// <summary> /// Dispatches the <see cref="bet_settlement"/> message /// </summary> /// <param name="message">The <see cref="bet_settlement"/> message to dispatch</param> /// <param name="rawMessage">A raw message received from the feed</param> private void DispatchBetSettlement(bet_settlement message, byte[] rawMessage) { var eventArgs = new BetSettlementEventArgs <T>(MessageMapper, message, DefaultCultures, rawMessage); Dispatch(OnBetSettlement, eventArgs, message); }