You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							145 lines
						
					
					
						
							3.4 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							145 lines
						
					
					
						
							3.4 KiB
						
					
					
				
								package filer
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"os"
							 | 
						|
									"time"
							 | 
						|
								
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/util"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								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
							 | 
						|
									Mime          string      // mime type
							 | 
						|
									TtlSec        int32       // ttl in seconds
							 | 
						|
									UserName      string
							 | 
						|
									GroupNames    []string
							 | 
						|
									SymlinkTarget string
							 | 
						|
									Md5           []byte
							 | 
						|
									FileSize      uint64
							 | 
						|
									Rdev          uint32
							 | 
						|
									Inode         uint64
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (attr Attr) IsDirectory() bool {
							 | 
						|
									return attr.Mode&os.ModeDir > 0
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								type Entry struct {
							 | 
						|
									util.FullPath
							 | 
						|
								
							 | 
						|
									Attr
							 | 
						|
									Extended map[string][]byte
							 | 
						|
								
							 | 
						|
									// the following is for files
							 | 
						|
									Chunks []*filer_pb.FileChunk `json:"chunks,omitempty"`
							 | 
						|
								
							 | 
						|
									HardLinkId         HardLinkId
							 | 
						|
									HardLinkCounter    int32
							 | 
						|
									Content            []byte
							 | 
						|
									Remote             *filer_pb.RemoteEntry
							 | 
						|
									Quota              int64
							 | 
						|
									WORMEnforcedAtTsNs int64
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (entry *Entry) Size() uint64 {
							 | 
						|
									return maxUint64(maxUint64(TotalSize(entry.GetChunks()), entry.FileSize), uint64(len(entry.Content)))
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (entry *Entry) Timestamp() time.Time {
							 | 
						|
									if entry.IsDirectory() {
							 | 
						|
										return entry.Crtime
							 | 
						|
									} else {
							 | 
						|
										return entry.Mtime
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (entry *Entry) ShallowClone() *Entry {
							 | 
						|
									if entry == nil {
							 | 
						|
										return nil
							 | 
						|
									}
							 | 
						|
									newEntry := &Entry{}
							 | 
						|
									newEntry.FullPath = entry.FullPath
							 | 
						|
									newEntry.Attr = entry.Attr
							 | 
						|
									newEntry.Chunks = entry.Chunks
							 | 
						|
									newEntry.Extended = entry.Extended
							 | 
						|
									newEntry.HardLinkId = entry.HardLinkId
							 | 
						|
									newEntry.HardLinkCounter = entry.HardLinkCounter
							 | 
						|
									newEntry.Content = entry.Content
							 | 
						|
									newEntry.Remote = entry.Remote
							 | 
						|
									newEntry.Quota = entry.Quota
							 | 
						|
								
							 | 
						|
									return newEntry
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (entry *Entry) ToProtoEntry() *filer_pb.Entry {
							 | 
						|
									if entry == nil {
							 | 
						|
										return nil
							 | 
						|
									}
							 | 
						|
									message := &filer_pb.Entry{}
							 | 
						|
									message.Name = entry.FullPath.Name()
							 | 
						|
									entry.ToExistingProtoEntry(message)
							 | 
						|
									return message
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (entry *Entry) ToExistingProtoEntry(message *filer_pb.Entry) {
							 | 
						|
									if entry == nil {
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
									message.IsDirectory = entry.IsDirectory()
							 | 
						|
									message.Attributes = EntryAttributeToPb(entry)
							 | 
						|
									message.Chunks = entry.GetChunks()
							 | 
						|
									message.Extended = entry.Extended
							 | 
						|
									message.HardLinkId = entry.HardLinkId
							 | 
						|
									message.HardLinkCounter = entry.HardLinkCounter
							 | 
						|
									message.Content = entry.Content
							 | 
						|
									message.RemoteEntry = entry.Remote
							 | 
						|
									message.Quota = entry.Quota
							 | 
						|
									message.WormEnforcedAtTsNs = entry.WORMEnforcedAtTsNs
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func FromPbEntryToExistingEntry(message *filer_pb.Entry, fsEntry *Entry) {
							 | 
						|
									fsEntry.Attr = PbToEntryAttribute(message.Attributes)
							 | 
						|
									fsEntry.Chunks = message.Chunks
							 | 
						|
									fsEntry.Extended = message.Extended
							 | 
						|
									fsEntry.HardLinkId = HardLinkId(message.HardLinkId)
							 | 
						|
									fsEntry.HardLinkCounter = message.HardLinkCounter
							 | 
						|
									fsEntry.Content = message.Content
							 | 
						|
									fsEntry.Remote = message.RemoteEntry
							 | 
						|
									fsEntry.Quota = message.Quota
							 | 
						|
									fsEntry.FileSize = FileSize(message)
							 | 
						|
									fsEntry.WORMEnforcedAtTsNs = message.WormEnforcedAtTsNs
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (entry *Entry) ToProtoFullEntry() *filer_pb.FullEntry {
							 | 
						|
									if entry == nil {
							 | 
						|
										return nil
							 | 
						|
									}
							 | 
						|
									dir, _ := entry.FullPath.DirAndName()
							 | 
						|
									return &filer_pb.FullEntry{
							 | 
						|
										Dir:   dir,
							 | 
						|
										Entry: entry.ToProtoEntry(),
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (entry *Entry) GetChunks() []*filer_pb.FileChunk {
							 | 
						|
									return entry.Chunks
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func FromPbEntry(dir string, entry *filer_pb.Entry) *Entry {
							 | 
						|
									t := &Entry{}
							 | 
						|
									t.FullPath = util.NewFullPath(dir, entry.Name)
							 | 
						|
									FromPbEntryToExistingEntry(entry, t)
							 | 
						|
									return t
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func maxUint64(x, y uint64) uint64 {
							 | 
						|
									if x > y {
							 | 
						|
										return x
							 | 
						|
									}
							 | 
						|
									return y
							 | 
						|
								}
							 |