1
0
mirror of https://github.com/minio/mc.git synced 2025-11-13 12:22:45 +03:00

Filesystem now calculates md5sum and returns

This commit is contained in:
Harshavardhana
2015-04-24 20:15:57 -07:00
parent f8ac1b96d1
commit 9fb94c72a1
5 changed files with 113 additions and 19 deletions

View File

@@ -19,6 +19,8 @@
package fs
import (
"crypto/md5"
"encoding/hex"
"errors"
"io"
"os"
@@ -58,7 +60,7 @@ func (f *fsClient) fsStat() (os.FileInfo, error) {
}
// Get - download an object from bucket
func (f *fsClient) Get() (body io.ReadCloser, size int64, md5 string, err error) {
func (f *fsClient) Get() (io.ReadCloser, int64, string, error) {
item, err := f.getFSMetadata()
if err != nil {
return nil, 0, "", iodine.New(err, nil)
@@ -66,17 +68,27 @@ func (f *fsClient) Get() (body io.ReadCloser, size int64, md5 string, err error)
if item.FileType.IsDir() {
return nil, 0, "", iodine.New(FileISDir{path: f.path}, nil)
}
body, err = os.Open(f.path)
body, err := os.Open(f.path)
if err != nil {
return nil, 0, "", iodine.New(err, nil)
}
// TODO: support md5sum - there is no easier way to do it right now without temporary buffer
// so avoiding it to ensure no out of memory situations
return body, item.Size, "", nil
h := md5.New()
// calculate md5sum
_, err = io.Copy(h, body)
if err != nil {
return nil, 0, "", iodine.New(err, nil)
}
// seek back
_, err = body.Seek(0, 0)
if err != nil {
return nil, 0, "", iodine.New(err, nil)
}
md5Str := hex.EncodeToString(h.Sum(nil))
return body, item.Size, md5Str, nil
}
// GetPartial - download a partial object from bucket
func (f *fsClient) GetPartial(offset, length int64) (body io.ReadCloser, size int64, md5 string, err error) {
func (f *fsClient) GetPartial(offset, length int64) (io.ReadCloser, int64, string, error) {
if offset < 0 {
return nil, 0, "", iodine.New(client.InvalidRange{Offset: offset}, nil)
}
@@ -90,11 +102,27 @@ func (f *fsClient) GetPartial(offset, length int64) (body io.ReadCloser, size in
if offset > item.Size || (offset+length-1) > item.Size {
return nil, 0, "", iodine.New(client.InvalidRange{Offset: offset}, nil)
}
body, err := os.Open(f.path)
if err != nil {
return nil, 0, "", iodine.New(err, nil)
}
_, err = io.CopyN(ioutil.Discard, body, offset)
if err != nil {
return nil, 0, "", iodine.New(err, nil)
}
return body, length, "", nil
h := md5.New()
// calculate md5sum
_, err = io.Copy(h, body)
if err != nil {
return nil, 0, "", iodine.New(err, nil)
}
// seek back
_, err = body.Seek(0, 0)
if err != nil {
return nil, 0, "", iodine.New(err, nil)
}
md5Str := hex.EncodeToString(h.Sum(nil))
return body, length, md5Str, nil
}
func (f *fsClient) List() <-chan client.ItemOnChannel {