diff options
Diffstat (limited to 'weed/storage/file_id.go')
| -rw-r--r-- | weed/storage/file_id.go | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/weed/storage/file_id.go b/weed/storage/file_id.go new file mode 100644 index 000000000..4cfdb16fa --- /dev/null +++ b/weed/storage/file_id.go @@ -0,0 +1,43 @@ +package storage + +import ( + "encoding/hex" + "errors" + "strings" + + "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/util" +) + +type FileId struct { + VolumeId VolumeId + Key uint64 + Hashcode uint32 +} + +func NewFileIdFromNeedle(VolumeId VolumeId, n *Needle) *FileId { + return &FileId{VolumeId: VolumeId, Key: n.Id, Hashcode: n.Cookie} +} +func NewFileId(VolumeId VolumeId, Key uint64, Hashcode uint32) *FileId { + return &FileId{VolumeId: VolumeId, Key: Key, Hashcode: Hashcode} +} +func ParseFileId(fid string) (*FileId, error) { + a := strings.Split(fid, ",") + if len(a) != 2 { + glog.V(1).Infoln("Invalid fid ", fid, ", split length ", len(a)) + return nil, errors.New("Invalid fid " + fid) + } + vid_string, key_hash_string := a[0], a[1] + volumeId, _ := NewVolumeId(vid_string) + key, hash, e := ParseKeyHash(key_hash_string) + return &FileId{VolumeId: volumeId, Key: key, Hashcode: hash}, e +} +func (n *FileId) String() string { + bytes := make([]byte, 12) + util.Uint64toBytes(bytes[0:8], n.Key) + util.Uint32toBytes(bytes[8:12], n.Hashcode) + nonzero_index := 0 + for ; bytes[nonzero_index] == 0; nonzero_index++ { + } + return n.VolumeId.String() + "," + hex.EncodeToString(bytes[nonzero_index:]) +} |
