blob: 7a98d792863db1da6396e212e0a6ca4bbc6b3fac [file] [log] [blame]
giolekva7be17df2020-03-21 13:57:02 +04001package client
2
giolekva1f6577a2020-03-25 12:53:06 +04003import (
4 "context"
5 "os"
giolekva7be17df2020-03-21 13:57:02 +04006
giolekva1f6577a2020-03-25 12:53:06 +04007 "pcloud/api"
8 "pcloud/chunk"
9)
giolekva7be17df2020-03-21 13:57:02 +040010
11type FileUploader struct {
giolekva1f6577a2020-03-25 12:53:06 +040012 client api.MetadataStorageClient
giolekva7be17df2020-03-21 13:57:02 +040013}
14
giolekva1f6577a2020-03-25 12:53:06 +040015func NewFileUploader(client api.MetadataStorageClient) *FileUploader {
16 return &FileUploader{client}
giolekva7be17df2020-03-21 13:57:02 +040017}
18
giolekva1f6577a2020-03-25 12:53:06 +040019func (fu *FileUploader) Upload(f *os.File) {
20 info, err := f.Stat()
21 if err != nil {
22 return
giolekva7be17df2020-03-21 13:57:02 +040023 }
giolekva1f6577a2020-03-25 12:53:06 +040024 resp, err := fu.client.CreateBlob(
25 context.Background(), &api.CreateBlobRequest{
26 SizeBytes: int32(info.Size()),
27 NumReplicas: 1})
28 if len(resp.Chunk) != 1 {
29 panic(resp)
30 }
31 if err != nil {
32 panic(err)
33 }
34 primaryListener := chunk.NewNonChangingPrimaryReplicaChangeListener(
35 resp.Chunk[0].ChunkId,
36 resp.Chunk[0].Server[0])
37 chunk.WriteToPrimary(
38 context.Background(),
39 chunk.NewReadOnlyFileChunk(f, 0, int(info.Size())),
40 primaryListener)
giolekva7be17df2020-03-21 13:57:02 +040041}