internal async Task <DatabaseMeasurementInfo> GetMetaInformationAsync(string db, string measurementName, TimeSpan?expiration) { var key = new DatabaseMeasurementInfoKey(db, measurementName); DatabaseMeasurementInfo info; lock (_seriesMetaCache) { _seriesMetaCache.TryGetValue(key, out info); } var now = DateTime.UtcNow; if (info != null) { if (!expiration.HasValue) // info never expires { return(info); } if (now - info.Timestamp < expiration.Value) // has not expired { return(info); } } // has expired or never existed, lets retrieve it // get metadata information from the store var tagsResult = await this.ShowTagKeysAsync(db, measurementName).ConfigureAwait(false); var tags = tagsResult.Series.FirstOrDefault()?.Rows; info = new DatabaseMeasurementInfo(now); if (tags != null) { foreach (var row in tags) { info.Tags.Add(row.TagKey); } } lock (_seriesMetaCache) { _seriesMetaCache[key] = info; } return(info); }
internal async Task <DatabaseMeasurementInfo> GetMetaInformationAsync(string db, string measurementName, bool forceRefresh) { var key = new DatabaseMeasurementInfoKey(db, measurementName); DatabaseMeasurementInfo info; if (!forceRefresh) { lock ( _seriesMetaCache ) { if (_seriesMetaCache.TryGetValue(key, out info)) { return(info); } } } // get metadata information from the store var fieldTask = ShowFieldKeysAsync(db, measurementName); var tagTask = ShowTagKeysAsync(db, measurementName); await Task.WhenAll(fieldTask, tagTask).ConfigureAwait(false); var fields = fieldTask.Result.Series.FirstOrDefault()?.Rows; var tags = tagTask.Result.Series.FirstOrDefault()?.Rows; info = new DatabaseMeasurementInfo(); if (fields != null) { foreach (var row in fields) { info.Fields.Add(row.FieldKey); } } if (tags != null) { foreach (var row in tags) { info.Tags.Add(row.TagKey); } } lock ( _seriesMetaCache ) { _seriesMetaCache[key] = info; } return(info); }