package swampfile import ( "time" "os" "path" "caj-larsson/bog/dataswamp/swampfile" ) type FileSystemSwampFileData struct { path string size int64 mod_time time.Time file *os.File } func (f FileSystemSwampFileData) Read(p []byte) (int, error) { return f.file.Read(p) } func (f FileSystemSwampFileData) Write(p []byte) (int, error) { return f.file.Write(p) } func (f FileSystemSwampFileData) Close() error { return f.file.Close() } func (f FileSystemSwampFileData) Seek(offset int64, whence int) (int64, error) { return f.file.Seek(offset, whence) } func (f FileSystemSwampFileData) Path() string { return f.path } func (f FileSystemSwampFileData) Size() int64 { return f.size } func (f FileSystemSwampFileData) Modified() time.Time{ return time.Now() } type Repository struct { Root string } func (f Repository) absPath(filename string, namespace_ns string) string { return path.Join(f.Root, namespace_ns, filename) } func (f Repository) Create(filename string, namespace_ns string) (swampfile.SwampInFile, error) { abs_path := f.absPath(filename, namespace_ns) dir := path.Dir(abs_path) os.MkdirAll(dir, 0750) file, err := os.OpenFile(abs_path, os.O_RDWR|os.O_CREATE, 0644) if err != nil { panic(err) } stat_info, err := file.Stat() if err != nil { panic(err) } bfd := FileSystemSwampFileData {filename, stat_info.Size(), stat_info.ModTime(), file} return bfd, nil } func (f Repository) Open(filename string, namespace_ns string) (swampfile.SwampOutFile, error) { abs_path := f.absPath(filename, namespace_ns) dir := path.Dir(abs_path) os.MkdirAll(dir, 0750) file, err := os.OpenFile(abs_path, os.O_RDONLY, 0644) if err != nil { return nil, swampfile.ErrNotExists } bfd := FileSystemSwampFileData {filename, 0, time.Now(), file} return bfd, nil } func (f Repository) Delete(filename string, namespace_ns string) { abs_path := f.absPath(filename, namespace_ns) os.Remove(abs_path) }