From a03d1e5016ce2185592e6d27773c91ee53ea6f59 Mon Sep 17 00:00:00 2001 From: Felicitas Pojtinger Date: Mon, 27 Dec 2021 16:48:22 +0100 Subject: [PATCH] feat: Start transfering `open` flags from `FileSystem` to `File` --- internal/fs/file.go | 22 +++++++++-- internal/fs/filesystem.go | 78 +++++++++++++++++++++++++++++---------- 2 files changed, 76 insertions(+), 24 deletions(-) diff --git a/internal/fs/file.go b/internal/fs/file.go index a437a66..988b484 100644 --- a/internal/fs/file.go +++ b/internal/fs/file.go @@ -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, diff --git a/internal/fs/filesystem.go b/internal/fs/filesystem.go index c86b453..3f27710 100644 --- a/internal/fs/filesystem.go +++ b/internal/fs/filesystem.go @@ -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)