// This is the simple 1MB chunk version. The rolling checksum version is below. func writeFileMapOld(bs blobserver.StatReceiver, file *Builder, r io.Reader) (*blobref.BlobRef, error) { parts, size := []BytesPart{}, int64(0) var buf bytes.Buffer for { buf.Reset() n, err := io.Copy(&buf, io.LimitReader(r, maxBlobSize)) if err != nil { return nil, err } if n == 0 { break } hash := blobref.NewHash() io.Copy(hash, bytes.NewReader(buf.Bytes())) br := blobref.FromHash(hash) hasBlob, err := serverHasBlob(bs, br) if err != nil { return nil, err } if !hasBlob { sb, err := bs.ReceiveBlob(br, &buf) if err != nil { return nil, err } if expect := (blobref.SizedBlobRef{br, n}); !expect.Equal(sb) { return nil, fmt.Errorf("schema/filewriter: wrote %s bytes, got %s ack'd", expect, sb) } } size += n parts = append(parts, BytesPart{ BlobRef: br, Size: uint64(n), Offset: 0, // into BlobRef to read from (not of dest) }) } err := file.PopulateParts(size, parts) if err != nil { return nil, err } json := file.Blob().JSON() if err != nil { return nil, err } br := blobref.SHA1FromString(json) sb, err := bs.ReceiveBlob(br, strings.NewReader(json)) if err != nil { return nil, err } if expect := (blobref.SizedBlobRef{br, int64(len(json))}); !expect.Equal(sb) { return nil, fmt.Errorf("schema/filewriter: wrote %s bytes, got %s ack'd", expect, sb) } return br, nil }
// Blob builds the Blob. The builder continues to be usable after a call to Build. func (bb *Builder) Blob() *Blob { json, err := mapJSON(bb.m) if err != nil { panic(err) } ss, err := parseSuperset(strings.NewReader(json)) if err != nil { panic(err) } h := blobref.NewHash() h.Write([]byte(json)) return &Blob{ str: json, ss: ss, br: blobref.FromHash(h), } }
func stdinBlobHandle() (uh *client.UploadHandle, err error) { var buf bytes.Buffer size, err := io.Copy(&buf, cmdmain.Stdin) if err != nil { return } // TODO(bradfitz,mpl): limit this buffer size? file := buf.Bytes() h := blobref.NewHash() size, err = io.Copy(h, bytes.NewReader(file)) if err != nil { return } return &client.UploadHandle{ BlobRef: blobref.FromHash(h), Size: size, Contents: io.LimitReader(bytes.NewReader(file), size), }, nil }