package main import ( "crypto/sha256" "encoding/binary" "encoding/hex" "fmt" log "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/bson/primitive" "io" "os" "time" ) func Sha256Sum(fileName string) (string, error) { f, err := os.Open(fileName) if err != nil { return "", err } defer func() { err = f.Close() if err != nil { log.WithError(err).WithField("filename", fileName).Error("failed to close file") } }() h := sha256.New() if _, err := io.Copy(h, f); err != nil { return "", err } return fmt.Sprintf("%x", h.Sum(nil)), nil } func CustomRowID(payload uint64, timestamp time.Time) RowID { var key [12]byte binary.BigEndian.PutUint32(key[0:4], uint32(timestamp.Unix())) binary.BigEndian.PutUint64(key[4:12], payload) if oid, err := primitive.ObjectIDFromHex(hex.EncodeToString(key[:])); err == nil { return oid } else { log.WithError(err).Warn("failed to create object id") return primitive.NewObjectID() } } func NewRowID() RowID { return primitive.NewObjectID() } func EmptyRowID() RowID { return [12]byte{} } func RowIDFromHex(hex string) (RowID, error) { rowID, err := primitive.ObjectIDFromHex(hex) return rowID, err } func FileExists(filename string) bool { info, err := os.Stat(filename) if os.IsNotExist(err) { return false } return !info.IsDir() } func FileSize(filename string) int64 { info, err := os.Stat(filename) if os.IsNotExist(err) { return -1 } return info.Size() }