forked from TrueCloudLab/restic
internal/restic: Make FileType a uint8 instead of a string
The string form was presumably useful before the introduction of layouts, but right now it just makes call sequences and garbage collection more expensive (the latter because every string contains a pointer to be scanned).
This commit is contained in:
parent
22147e1e02
commit
b513597546
2 changed files with 47 additions and 23 deletions
|
@ -7,18 +7,38 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// FileType is the type of a file in the backend.
|
// FileType is the type of a file in the backend.
|
||||||
type FileType string
|
type FileType uint8
|
||||||
|
|
||||||
// These are the different data types a backend can store.
|
// These are the different data types a backend can store.
|
||||||
const (
|
const (
|
||||||
PackFile FileType = "data" // use data, as packs are stored under /data in repo
|
PackFile FileType = 1 + iota
|
||||||
KeyFile FileType = "key"
|
KeyFile
|
||||||
LockFile FileType = "lock"
|
LockFile
|
||||||
SnapshotFile FileType = "snapshot"
|
SnapshotFile
|
||||||
IndexFile FileType = "index"
|
IndexFile
|
||||||
ConfigFile FileType = "config"
|
ConfigFile
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func (t FileType) String() string {
|
||||||
|
s := "invalid"
|
||||||
|
switch t {
|
||||||
|
case PackFile:
|
||||||
|
// Spelled "data" instead of "pack" for historical reasons.
|
||||||
|
s = "data"
|
||||||
|
case KeyFile:
|
||||||
|
s = "key"
|
||||||
|
case LockFile:
|
||||||
|
s = "lock"
|
||||||
|
case SnapshotFile:
|
||||||
|
s = "snapshot"
|
||||||
|
case IndexFile:
|
||||||
|
s = "index"
|
||||||
|
case ConfigFile:
|
||||||
|
s = "config"
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
// Handle is used to store and access data in a backend.
|
// Handle is used to store and access data in a backend.
|
||||||
type Handle struct {
|
type Handle struct {
|
||||||
Type FileType
|
Type FileType
|
||||||
|
@ -36,10 +56,6 @@ func (h Handle) String() string {
|
||||||
|
|
||||||
// Valid returns an error if h is not valid.
|
// Valid returns an error if h is not valid.
|
||||||
func (h Handle) Valid() error {
|
func (h Handle) Valid() error {
|
||||||
if h.Type == "" {
|
|
||||||
return errors.New("type is empty")
|
|
||||||
}
|
|
||||||
|
|
||||||
switch h.Type {
|
switch h.Type {
|
||||||
case PackFile:
|
case PackFile:
|
||||||
case KeyFile:
|
case KeyFile:
|
||||||
|
@ -48,7 +64,7 @@ func (h Handle) Valid() error {
|
||||||
case IndexFile:
|
case IndexFile:
|
||||||
case ConfigFile:
|
case ConfigFile:
|
||||||
default:
|
default:
|
||||||
return errors.Errorf("invalid Type %q", h.Type)
|
return errors.Errorf("invalid Type %d", h.Type)
|
||||||
}
|
}
|
||||||
|
|
||||||
if h.Type == ConfigFile {
|
if h.Type == ConfigFile {
|
||||||
|
|
|
@ -1,20 +1,28 @@
|
||||||
package restic
|
package restic
|
||||||
|
|
||||||
import "testing"
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
var handleTests = []struct {
|
rtest "github.com/restic/restic/internal/test"
|
||||||
h Handle
|
)
|
||||||
valid bool
|
|
||||||
}{
|
func TestHandleString(t *testing.T) {
|
||||||
{Handle{Name: "foo"}, false},
|
rtest.Equals(t, "<data/foobar>", Handle{Type: PackFile, Name: "foobar"}.String())
|
||||||
{Handle{Type: "foobar"}, false},
|
rtest.Equals(t, "<lock/1>", Handle{Type: LockFile, Name: "1"}.String())
|
||||||
{Handle{Type: ConfigFile, Name: ""}, true},
|
|
||||||
{Handle{Type: PackFile, Name: ""}, false},
|
|
||||||
{Handle{Type: "", Name: "x"}, false},
|
|
||||||
{Handle{Type: LockFile, Name: "010203040506"}, true},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHandleValid(t *testing.T) {
|
func TestHandleValid(t *testing.T) {
|
||||||
|
var handleTests = []struct {
|
||||||
|
h Handle
|
||||||
|
valid bool
|
||||||
|
}{
|
||||||
|
{Handle{Name: "foo"}, false},
|
||||||
|
{Handle{Type: 0}, false},
|
||||||
|
{Handle{Type: ConfigFile, Name: ""}, true},
|
||||||
|
{Handle{Type: PackFile, Name: ""}, false},
|
||||||
|
{Handle{Type: LockFile, Name: "010203040506"}, true},
|
||||||
|
}
|
||||||
|
|
||||||
for i, test := range handleTests {
|
for i, test := range handleTests {
|
||||||
err := test.h.Valid()
|
err := test.h.Valid()
|
||||||
if err != nil && test.valid {
|
if err != nil && test.valid {
|
||||||
|
|
Loading…
Reference in a new issue