66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
|
package mailserver
|
||
|
|
||
|
import (
|
||
|
"encoding/binary"
|
||
|
"errors"
|
||
|
|
||
|
"github.com/ethereum/go-ethereum/common"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
// DBKeyLength is a size of the envelope key.
|
||
|
DBKeyLength = common.HashLength + timestampLength
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
// ErrInvalidByteSize is returned when DBKey can't be created
|
||
|
// from a byte slice because it has invalid length.
|
||
|
ErrInvalidByteSize = errors.New("byte slice has invalid length")
|
||
|
)
|
||
|
|
||
|
// DBKey key to be stored in a db.
|
||
|
type DBKey struct {
|
||
|
timestamp uint32
|
||
|
hash common.Hash
|
||
|
raw []byte
|
||
|
}
|
||
|
|
||
|
// Bytes returns a bytes representation of the DBKey.
|
||
|
func (k *DBKey) Bytes() []byte {
|
||
|
return k.raw
|
||
|
}
|
||
|
|
||
|
// NewDBKey creates a new DBKey with the given values.
|
||
|
func NewDBKey(timestamp uint32, h common.Hash) *DBKey {
|
||
|
var k DBKey
|
||
|
k.timestamp = timestamp
|
||
|
k.hash = h
|
||
|
k.raw = make([]byte, DBKeyLength)
|
||
|
binary.BigEndian.PutUint32(k.raw, k.timestamp)
|
||
|
copy(k.raw[4:], k.hash[:])
|
||
|
return &k
|
||
|
}
|
||
|
|
||
|
// NewDBKeyFromBytes creates a DBKey from a byte slice.
|
||
|
func NewDBKeyFromBytes(b []byte) (*DBKey, error) {
|
||
|
if len(b) != DBKeyLength {
|
||
|
return nil, ErrInvalidByteSize
|
||
|
}
|
||
|
|
||
|
return &DBKey{
|
||
|
raw: b,
|
||
|
timestamp: binary.BigEndian.Uint32(b),
|
||
|
hash: common.BytesToHash(b[4:]),
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
|
// mustNewDBKeyFromBytes panics if creating a key from a byte slice fails.
|
||
|
// Check if a byte slice has DBKeyLength length before using it.
|
||
|
func mustNewDBKeyFromBytes(b []byte) *DBKey {
|
||
|
k, err := NewDBKeyFromBytes(b)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
return k
|
||
|
}
|