// fillArchive() is a private function that fills data points from srcWSP // into dstWsp. Used by FIll() // * srcWsp and dstWsp are *whisper.Whisper open files // * start and stop define an inclusive time window to fill // On error an error value is returned. // // This code heavily inspired by https://github.com/jssjr/carbonate func fillArchive(srcWsp, dstWsp *whisper.Whisper, start, stop int) error { // Fetch the range defined by start and stop always taking the values // from the highest precision archive, which man require multiple // fetch/merge updates. srcRetentions := whisper.RetentionsByPrecision{srcWsp.Retentions()} sort.Sort(srcRetentions) if start < srcWsp.StartTime() && stop < srcWsp.StartTime() { // Nothing to fill/merge return nil } // Begin our backwards walk in time for _, v := range srcRetentions.Iterator() { points := make([]*whisper.TimeSeriesPoint, 0) rTime := int(time.Now().Unix()) - v.MaxRetention() if stop <= rTime { // This archive contains no data points in the window continue } // Start and the start time or the beginning of this archive fromTime := start if rTime > start { fromTime = rTime } ts, err := srcWsp.Fetch(fromTime, stop) if err != nil { return err } // Build a list of points to merge tsStart := ts.FromTime() for _, dp := range ts.Values() { if !math.IsNaN(dp) { points = append(points, &whisper.TimeSeriesPoint{tsStart, dp}) } tsStart += ts.Step() } dstWsp.UpdateMany(points) stop = fromTime if start >= stop { // Nothing more to fetch break } } return nil }