package txlog import ( "fmt" "io" "os" bin "gordenko.dev/dima/bin/little" "gordenko.dev/dima/qb" "gordenko.dev/dima/qb/atree" "gordenko.dev/dima/qb/util" ) func LoadSnapshot(fileName string) (snapshot Snapshot, err error) { var ( hasher = util.NewHasher() header = make([]byte, metricHeaderSize) body = make([]byte, atree.PageSize) ) file, err := os.Open(fileName) if err != nil { return } src := io.TeeReader(file, hasher) metricsQty, err := bin.ReadVarSize(src) if err != nil { return } for range metricsQty { var metric Metric err = bin.ReadNInto(src, header) if err != nil { return } metric.MetricID, _ = bin.GetUint32(header[0:]) metric.MetricType = qb.MetricType(header[4]) metric.FracDigits = header[5] metric.LastPageNo, _ = bin.GetUint32(header[6:]) metric.Since, _ = bin.GetUint32(header[10:]) metric.SinceValue, _ = bin.GetFloat64(header[14:]) metric.Until, _ = bin.GetUint32(header[22:]) metric.UntilValue, _ = bin.GetFloat64(header[26:]) tSize, _ := bin.GetUint16(header[34:]) vSize, _ := bin.GetUint16(header[36:]) buf := body[:tSize] err = bin.ReadNInto(src, buf) if err != nil { return } // FIX // metric.Timestamps = chunkenc.NewReverseTimeDeltaCompressor( // conbuf.NewFromBuffer(buf), // int(tSize), // ) buf = body[:vSize] err = bin.ReadNInto(src, buf) if err != nil { return } // FIX // if metric.MetricType == qb.Cumulative { // metric.Values = chunkenc.NewReverseCumulativeDeltaCompressor( // conbuf.NewFromBuffer(buf), // int(vSize), // metric.FracDigits, // ) // } else { // metric.Values = chunkenc.NewReverseInstantDeltaCompressor( // conbuf.NewFromBuffer(buf), // int(vSize), // metric.FracDigits, // ) // } // s.metrics[metricID] = &metric } // FIX // err = restoreFreeList(s.dataFreeList, src) // if err != nil { // return fmt.Errorf("restore dataFreeList: %s", err) // } // FIX // err = restoreFreeList(s.indexFreeList, src) // if err != nil { // return fmt.Errorf("restore indexFreeList: %s", err) // } calculatedChecksum := hasher.Sum32() writtenChecksum, err := bin.ReadUint32(file) if err != nil { return } if calculatedChecksum != writtenChecksum { err = fmt.Errorf("calculated checksum %d not equal written checksum %d", calculatedChecksum, writtenChecksum) return } return } // serialized + frozen pages count // func restoreFreeList(freeList *freelist.FreeList, src io.Reader) error { // size, err := bin.ReadVarSize(src) // if err != nil { // return err // } // serialized, err := bin.ReadN(src, size) // if err != nil { // return err // } // freeList.Restore(serialized) // return nil // }