/// <summary> /// must be called from a synchronized statement /// </summary> /// <param name="source"></param> /// <param name="dest"></param> /// <param name="newq"></param> /// <returns></returns> private void UpdateCache(TimedQuote newq) { if (newq.Midpoint == 0) { return; } var source = newq.BaseCurrency; var dest = newq.QuoteCurrency; if (quotes.ContainsKey(source)) { if (quotes[source].ContainsKey(dest)) { var existing = quotes[source][dest]; if (existing.UpdatedAtUTC < newq.UpdatedAtUTC) { existing.UpdatedAtUTC = DateTime.UtcNow; existing.Midpoint = newq.Midpoint; } } else { quotes[source].Add(dest, newq); } } else { quotes.Add(source, new Dictionary <Currencies, TimedQuote>()); quotes[source].Add(dest, newq); } }
/// <summary> /// <inheritdoc/> /// </summary> /// <param name="source"><inheritdoc/></param> /// <param name="dest"><inheritdoc/></param> /// <param name="convStatus"><inheritdoc/></param> /// <returns><inheritdoc/></returns> public virtual TimedQuote GetQuote(Currencies source, Currencies dest, ConversionBag convStatus) { if (source == dest) { return new TimedQuote() { BaseCurrency = source, Midpoint = 1, QuoteCurrency = dest, UpdatedAtUTC = DateTime.UtcNow.AddYears(1) } } ; if (CanConvert(source, dest, convStatus) == true) { TimedQuote quote = getQuote(source, dest, convStatus); if (quote != null && quote.UpdatedAtUTC.AddMilliseconds(ConversionProviderFactory.QuotesValidForMillis) >= DateTime.UtcNow) { if (this is CacheConversionProvider == false) // if the provider who got us the quote is not the cache provider { ConversionProviderFactory.AddToCache(quote, quote.UpdatedAtUTC); // add the quote to the cache } return(quote); } } if (TryNext == false) { return(null); } return(ConversionProviderFactory.GetNext(this)?.GetQuote(source, dest, convStatus)); }
public void UpdateCache(Quote quote, DateTime updatedAtUtc) { if (quote.Midpoint == 0) { return; } var source = quote.BaseCurrency; var dest = quote.QuoteCurrency; lock (sync) { // add or update the quote var newq = new TimedQuote() { BaseCurrency = source, QuoteCurrency = dest, Midpoint = quote.Midpoint, UpdatedAtUTC = updatedAtUtc }; UpdateCache(newq); // add or update the opposite quote newq = new TimedQuote() { BaseCurrency = dest, QuoteCurrency = source, Midpoint = 1 / quote.Midpoint, UpdatedAtUTC = updatedAtUtc }; UpdateCache(newq); } }