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