/
base.go
146 lines (126 loc) · 3.97 KB
/
base.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package common
import (
"fmt"
"io"
"net/url"
"strings"
"time"
)
type (
// FileInfo contains file information.
FileInfo struct {
name string
size uint64
modified time.Time
isfile bool
}
// StorageBackend is a generic interface to storage backends.
// Currently, it provisions following methods:
// * GetFileInfo to get file information in FileInfo struct.
// * ListFiles to list files under a given URI.
// * StoreFile to store data to a given URI.
// * RemoveFile to remove files under a given URI.
StorageBackend interface {
GetFileInfo(*url.URL) (*FileInfo, error)
ListFiles(*url.URL) ([]FileInfo, error)
StoreFile(io.ReaderAt, int64, *url.URL) error
RemoveFile(*url.URL) error
}
// DummyBackend defines a dummy backend.
DummyBackend struct {
dummyFiles []FileInfo
dummyError error
}
)
// Common error definitions.
const (
ErrFileNotFound = "file not found"
ErrAccessDenied = "access denied"
ErrInvalidConfig = "invalid backend configuration"
ErrOperationTimeout = "operation timeout"
)
// CreateDummyBackend function that returns a pre-initialized DummyBackend.
var CreateDummyBackend func(cfg *Config) StorageBackend = nil
// CreateStorageBackend is a StorageBackend factory function.
func CreateStorageBackend(uri *url.URL, cfg *Config) (StorageBackend, error) {
switch uri.Scheme {
case "dummy":
if CreateDummyBackend != nil {
return CreateDummyBackend(cfg), nil
} else {
return &DummyBackend{}, nil
}
case "b2":
return CreateB2Backend(cfg), nil
default:
return nil, fmt.Errorf("unknown URL scheme %s", uri.Scheme)
}
}
// Name returns name of the file object.
func (fi *FileInfo) Name() string {
return fi.name
}
// Size returns size of the file object.
func (fi *FileInfo) Size() uint64 {
return fi.size
}
// Modified returns last modified date of the file object.
func (fi *FileInfo) Modified() time.Time {
return fi.modified
}
// IsFile returns true if this object represents a file.
func (fi *FileInfo) IsFile() bool {
return fi.isfile
}
// GenerateDummyFiles generate dummy file info list.
func (d *DummyBackend) GenerateDummyFiles(path string, number uint64) {
d.dummyFiles = make([]FileInfo, number)
// fmt.Printf("GenerateDummyFiles: %s, %d\n", path, number)
for index := range d.dummyFiles {
d.dummyFiles[index].name = path + string(rune(int('A')+index))
d.dummyFiles[index].size = uint64(index)
d.dummyFiles[index].modified = time.Unix(int64(index), 0).UTC()
d.dummyFiles[index].isfile = true
// fmt.Printf("item %d: %v\n", index, dummyFiles[index])
}
}
// GetDummyFiles get dummy file info list.
func (d *DummyBackend) GetDummyFiles() []FileInfo {
return d.dummyFiles
}
// SetDummyError set dummy error.
func (d *DummyBackend) SetDummyError(err error) {
d.dummyError = err
}
// GetDummyError get dummy error.
func (d *DummyBackend) GetDummyError() error {
return d.dummyError
}
// GetFileInfo returns a FileInfo struct filled with information
// about object defined by the input URI.
// Input URI must follow the pattern: dummy://path/to/file.
func (d *DummyBackend) GetFileInfo(uri *url.URL) (*FileInfo, error) {
var path string = uri.Host + uri.Path
return &FileInfo{
name: path,
size: uint64(0),
modified: time.Unix(0, 0).UTC(),
isfile: !strings.HasSuffix(uri.Path, "/"),
}, d.dummyError
}
// ListFiles return an array of FileInfo structs filled with information
// about objects defined by the input URI.
// Input URI must follow the pattern: dummy://path/to/dir.
func (d *DummyBackend) ListFiles(uri *url.URL) ([]FileInfo, error) {
return d.dummyFiles, d.dummyError
}
// StoreFile writes a data from `input` to output URI.
// Output URI must follow the pattern: dummy://path/to/file.
func (d *DummyBackend) StoreFile(input io.ReaderAt, length int64, uri *url.URL) error {
return d.dummyError
}
// RemoveFile remove objects defined by the input URI.
// Input URI must follow the pattern: dummy://path/to/dir.
func (d *DummyBackend) RemoveFile(uri *url.URL) error {
return d.dummyError
}