github.com/TrueBlocks/trueblocks-core/src/apps/chifra@v0.0.0-20241022031540-b362680128f7/pkg/tslib/truncate.go (about) 1 package tslib 2 3 import ( 4 "encoding/binary" 5 "io" 6 "os" 7 "path/filepath" 8 9 "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base" 10 "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/config" 11 "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/file" 12 ) 13 14 // var writeMutex sync.Mutex 15 16 func Truncate(chain string, maxBn base.Blknum) error { 17 cnt, err := NTimestamps(chain) 18 if err != nil { 19 return err 20 } 21 22 // It's already done 23 if maxBn >= base.Blknum(cnt) { 24 return nil 25 } 26 27 err = loadTimestamps(chain) 28 if err != nil { 29 return err 30 } 31 32 truncated := perChainTimestamps[chain].memory[0:maxBn] 33 34 tsFn := config.PathToTimestamps(chain) 35 tmpPath := filepath.Join(config.PathToCache(chain), "tmp") 36 if backup, err := file.MakeBackup(tmpPath, tsFn); err == nil { 37 defer func() { 38 ClearCache(chain) 39 backup.Restore() 40 }() 41 42 // remove the file and... 43 if err := os.Remove(tsFn); err != nil { 44 return err 45 } 46 47 // ...open it fresh 48 if fp, err := os.OpenFile(tsFn, os.O_WRONLY|os.O_CREATE, 0644); err == nil { 49 defer func() { 50 fp.Close() 51 }() 52 53 _, _ = fp.Seek(0, io.SeekStart) 54 err = binary.Write(fp, binary.LittleEndian, truncated) 55 if err != nil { 56 return err 57 } 58 _ = fp.Sync() 59 60 backup.Clear() 61 return nil 62 } else { 63 return err 64 } 65 } else { 66 return err 67 } 68 }