feat: Start transfering open flags from FileSystem to File

This commit is contained in:
Felicitas Pojtinger
2021-12-27 16:48:22 +01:00
parent 19fc63459e
commit a03d1e5016
2 changed files with 76 additions and 24 deletions

View File

@@ -33,6 +33,17 @@ type WriteCache interface {
Sync() error
}
type FileFlags struct {
readOnly bool
writeOnly bool
append bool
createIfNotExists bool
mostNotExist bool // If `create` is set, abort if file already exists
sync bool // Sync after each operation
truncate bool
}
type File struct {
afero.File
@@ -41,8 +52,9 @@ type File struct {
metadata config.MetadataConfig
path string
link string
path string
link string
flags *FileFlags
compressionLevel string
getFileBuffer func() (WriteCache, func() error, error)
@@ -69,6 +81,7 @@ func NewFile(
path string,
link string,
flags *FileFlags,
compressionLevel string,
getFileBuffer func() (WriteCache, func() error, error),
@@ -84,8 +97,9 @@ func NewFile(
metadata: metadata,
path: path,
link: link,
path: path,
link: link,
flags: flags,
compressionLevel: compressionLevel,
getFileBuffer: getFileBuffer,

View File

@@ -176,6 +176,46 @@ func (f *FileSystem) MkdirAll(path string, perm os.FileMode) error {
func (f *FileSystem) Open(name string) (afero.File, error) {
log.Println("FileSystem.Open", name)
return f.OpenFile(name, os.O_RDWR, os.ModePerm)
}
func (f *FileSystem) OpenFile(name string, flag int, perm os.FileMode) (afero.File, error) {
log.Println("FileSystem.OpenFile", name, flag, perm)
flags := &FileFlags{}
if flag&os.O_RDONLY != 0 {
flags.readOnly = true
}
if flag&os.O_WRONLY != 0 {
flags.writeOnly = true
}
if flag&os.O_RDWR != 0 {
flags.readOnly = true
flags.writeOnly = true
}
if flag&os.O_APPEND != 0 {
flags.append = true
}
if flag&os.O_CREATE != 0 {
flags.createIfNotExists = true
}
if flag&os.O_EXCL != 0 {
flags.mostNotExist = true
}
if flag&os.O_SYNC != 0 {
flags.sync = true
}
if flag&os.O_TRUNC != 0 {
flags.truncate = true
}
hdr, err := inventory.Stat(
f.metadata,
@@ -184,11 +224,24 @@ func (f *FileSystem) Open(name string) (afero.File, error) {
f.onHeader,
)
if err != nil {
if err == sql.ErrNoRows {
return nil, os.ErrNotExist
}
if err == sql.ErrNoRows && flags.createIfNotExists {
if err := f.mknode(false, name, perm); err != nil {
return nil, err
}
panic(err)
hdr, err = inventory.Stat(
f.metadata,
name,
f.onHeader,
)
if err != nil {
return nil, err
}
} else {
return nil, err
}
}
return NewFile(
@@ -199,6 +252,7 @@ func (f *FileSystem) Open(name string) (afero.File, error) {
hdr.Name,
hdr.Linkname,
flags,
f.compressionLevel,
f.getFileBuffer,
@@ -210,22 +264,6 @@ func (f *FileSystem) Open(name string) (afero.File, error) {
), nil
}
func (f *FileSystem) OpenFile(name string, flag int, perm os.FileMode) (afero.File, error) {
log.Println("FileSystem.OpenFile", name, flag, perm)
if _, err := f.Stat(name); err != nil {
if err == os.ErrNotExist && flag&os.O_CREATE != 0 {
if err := f.mknode(false, name, perm); err != nil {
return nil, err
}
} else {
return nil, err
}
}
return f.Open(name)
}
func (f *FileSystem) Remove(name string) error {
log.Println("FileSystem.Remove", name)