// Put puts a file as a new object into the bucket func (m master) Put(owner s3intf.Owner, bucket, object, filename, media string, body io.Reader, size int64, md5hash []byte) ( err error) { m.Lock() o, ok := m.owners[owner.ID()] m.Unlock() if !ok { err = errors.New("cannot find owner " + owner.ID()) return } o.Lock() b, ok := o.buckets[bucket] o.Unlock() if !ok { err = errors.New("cannot find bucket " + bucket) return } if err = b.db.BeginTransaction(); err != nil { return fmt.Errorf("cannot start transaction: %s", err) } defer func() { if err != nil { b.db.Rollback() } }() //upload fid, publicURL, err := m.wm.AssignFid() if err != nil { err = fmt.Errorf("error getting fid: %s", err) return } vi := weedutils.ValInfo{Filename: filename, ContentType: media, Fid: fid, Created: time.Now(), Size: size, MD5: md5hash} val, err := vi.Encode(nil) if err != nil { err = fmt.Errorf("error serializing %v: %s", vi, err) return } if err = b.db.Set([]byte(object), val); err != nil { err = fmt.Errorf("error storing key in db: %s", err) return } //log.Printf("filename=%q", filename) var hsh hash.Hash if vi.MD5 == nil { hsh = md5.New() body = io.TeeReader(body, hsh) } if _, err = m.wm.UploadAssigned(fid, publicURL, filename, media, body); err != nil { b.db.Rollback() err = fmt.Errorf("error uploading to %s: %s", fid, err) return } if vi.MD5 == nil { vi.MD5 = hsh.Sum(nil) if val, err = vi.Encode(nil); err != nil { err = fmt.Errorf("error serializing %v: %s", vi, err) return } if err = b.db.Set([]byte(object), val); err != nil { err = fmt.Errorf("error storing key in db: %s", err) return } } //log.Printf("uploading %s [%d] resulted in %s", filename, size, resp) err = nil return b.db.Commit() }