Chris Lu
7 years ago
5 changed files with 129 additions and 79 deletions
-
42weed/filer2/entry.go
-
43weed/filer2/entry_codec.go
-
79weed/filer2/filer_structure.go
-
13weed/filer2/filerstore.go
-
31weed/filer2/fullpath.go
@ -0,0 +1,42 @@ |
|||||
|
package filer2 |
||||
|
|
||||
|
import ( |
||||
|
"os" |
||||
|
"time" |
||||
|
|
||||
|
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb" |
||||
|
) |
||||
|
|
||||
|
type Attr struct { |
||||
|
Mtime time.Time // time of last modification
|
||||
|
Crtime time.Time // time of creation (OS X only)
|
||||
|
Mode os.FileMode // file mode
|
||||
|
Uid uint32 // owner uid
|
||||
|
Gid uint32 // group gid
|
||||
|
} |
||||
|
|
||||
|
func (attr Attr) IsDirectory() (bool) { |
||||
|
return attr.Mode&os.ModeDir > 0 |
||||
|
} |
||||
|
|
||||
|
type Entry struct { |
||||
|
FullPath |
||||
|
|
||||
|
Attr |
||||
|
|
||||
|
// the following is for files
|
||||
|
Chunks []*filer_pb.FileChunk `json:"chunks,omitempty"` |
||||
|
} |
||||
|
|
||||
|
func (entry Entry) Size() uint64 { |
||||
|
return TotalSize(entry.Chunks) |
||||
|
} |
||||
|
|
||||
|
func (entry Entry) Timestamp() time.Time { |
||||
|
if entry.IsDirectory() { |
||||
|
return entry.Crtime |
||||
|
} else { |
||||
|
return entry.Mtime |
||||
|
} |
||||
|
} |
||||
|
|
@ -0,0 +1,43 @@ |
|||||
|
package filer2 |
||||
|
|
||||
|
import ( |
||||
|
"os" |
||||
|
"time" |
||||
|
|
||||
|
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb" |
||||
|
"github.com/gogo/protobuf/proto" |
||||
|
"fmt" |
||||
|
) |
||||
|
|
||||
|
func (entry Entry) EncodeAttributesAndChunks() ([]byte, error) { |
||||
|
message := &filer_pb.Entry{ |
||||
|
Attributes: &filer_pb.FuseAttributes{ |
||||
|
Crtime: entry.Attr.Crtime.Unix(), |
||||
|
Mtime: entry.Attr.Mtime.Unix(), |
||||
|
FileMode: uint32(entry.Attr.Mode), |
||||
|
Uid: entry.Uid, |
||||
|
Gid: entry.Gid, |
||||
|
}, |
||||
|
Chunks: entry.Chunks, |
||||
|
} |
||||
|
return proto.Marshal(message) |
||||
|
} |
||||
|
|
||||
|
func (entry Entry) DecodeAttributesAndChunks(blob []byte) (error) { |
||||
|
|
||||
|
message := &filer_pb.Entry{} |
||||
|
|
||||
|
if err := proto.UnmarshalMerge(blob, message); err != nil { |
||||
|
return fmt.Errorf("decoding value blob for %s: %v", entry.FullPath, err) |
||||
|
} |
||||
|
|
||||
|
entry.Attr.Crtime = time.Unix(message.Attributes.Crtime, 0) |
||||
|
entry.Attr.Mtime = time.Unix(message.Attributes.Mtime, 0) |
||||
|
entry.Attr.Mode = os.FileMode(message.Attributes.FileMode) |
||||
|
entry.Attr.Uid = message.Attributes.Uid |
||||
|
entry.Attr.Gid = message.Attributes.Gid |
||||
|
|
||||
|
entry.Chunks = message.Chunks |
||||
|
|
||||
|
return nil |
||||
|
} |
@ -1,79 +0,0 @@ |
|||||
package filer2 |
|
||||
|
|
||||
import ( |
|
||||
"errors" |
|
||||
"os" |
|
||||
"time" |
|
||||
"path/filepath" |
|
||||
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb" |
|
||||
"strings" |
|
||||
) |
|
||||
|
|
||||
type FullPath string |
|
||||
|
|
||||
func NewFullPath(dir, name string) FullPath { |
|
||||
if strings.HasSuffix(dir, "/") { |
|
||||
return FullPath(dir + name) |
|
||||
} |
|
||||
return FullPath(dir + "/" + name) |
|
||||
} |
|
||||
|
|
||||
func (fp FullPath) DirAndName() (string, string) { |
|
||||
dir, name := filepath.Split(string(fp)) |
|
||||
if dir == "/" { |
|
||||
return dir, name |
|
||||
} |
|
||||
if len(dir) < 1 { |
|
||||
return "/", "" |
|
||||
} |
|
||||
return dir[:len(dir)-1], name |
|
||||
} |
|
||||
|
|
||||
func (fp FullPath) Name() (string) { |
|
||||
_, name := filepath.Split(string(fp)) |
|
||||
return name |
|
||||
} |
|
||||
|
|
||||
type Attr struct { |
|
||||
Mtime time.Time // time of last modification
|
|
||||
Crtime time.Time // time of creation (OS X only)
|
|
||||
Mode os.FileMode // file mode
|
|
||||
Uid uint32 // owner uid
|
|
||||
Gid uint32 // group gid
|
|
||||
} |
|
||||
|
|
||||
func (attr Attr) IsDirectory() (bool) { |
|
||||
return attr.Mode&os.ModeDir > 0 |
|
||||
} |
|
||||
|
|
||||
type Entry struct { |
|
||||
FullPath |
|
||||
|
|
||||
Attr |
|
||||
|
|
||||
// the following is for files
|
|
||||
Chunks []*filer_pb.FileChunk `json:"chunks,omitempty"` |
|
||||
} |
|
||||
|
|
||||
func (entry Entry) Size() uint64 { |
|
||||
return TotalSize(entry.Chunks) |
|
||||
} |
|
||||
|
|
||||
func (entry Entry) Timestamp() time.Time { |
|
||||
if entry.IsDirectory() { |
|
||||
return entry.Crtime |
|
||||
} else { |
|
||||
return entry.Mtime |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
var ErrNotFound = errors.New("filer: no entry is found in filer store") |
|
||||
|
|
||||
type FilerStore interface { |
|
||||
InsertEntry(*Entry) (error) |
|
||||
UpdateEntry(*Entry) (err error) |
|
||||
FindEntry(FullPath) (found bool, entry *Entry, err error) |
|
||||
DeleteEntry(FullPath) (fileEntry *Entry, err error) |
|
||||
|
|
||||
ListDirectoryEntries(dirPath FullPath, startFileName string, inclusive bool, limit int) ([]*Entry, error) |
|
||||
} |
|
@ -0,0 +1,13 @@ |
|||||
|
package filer2 |
||||
|
|
||||
|
import "errors" |
||||
|
|
||||
|
type FilerStore interface { |
||||
|
InsertEntry(*Entry) (error) |
||||
|
UpdateEntry(*Entry) (err error) |
||||
|
FindEntry(FullPath) (found bool, entry *Entry, err error) |
||||
|
DeleteEntry(FullPath) (fileEntry *Entry, err error) |
||||
|
ListDirectoryEntries(dirPath FullPath, startFileName string, inclusive bool, limit int) ([]*Entry, error) |
||||
|
} |
||||
|
|
||||
|
var ErrNotFound = errors.New("filer: no entry is found in filer store") |
@ -0,0 +1,31 @@ |
|||||
|
package filer2 |
||||
|
|
||||
|
import ( |
||||
|
"path/filepath" |
||||
|
"strings" |
||||
|
) |
||||
|
|
||||
|
type FullPath string |
||||
|
|
||||
|
func NewFullPath(dir, name string) FullPath { |
||||
|
if strings.HasSuffix(dir, "/") { |
||||
|
return FullPath(dir + name) |
||||
|
} |
||||
|
return FullPath(dir + "/" + name) |
||||
|
} |
||||
|
|
||||
|
func (fp FullPath) DirAndName() (string, string) { |
||||
|
dir, name := filepath.Split(string(fp)) |
||||
|
if dir == "/" { |
||||
|
return dir, name |
||||
|
} |
||||
|
if len(dir) < 1 { |
||||
|
return "/", "" |
||||
|
} |
||||
|
return dir[:len(dir)-1], name |
||||
|
} |
||||
|
|
||||
|
func (fp FullPath) Name() (string) { |
||||
|
_, name := filepath.Split(string(fp)) |
||||
|
return name |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue