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  }