blob: fb0ce48381b09459d8595c7fc70fe90832e09c4e [file] [log] [blame]
giolekva7be17df2020-03-21 13:57:02 +04001package chunk
2
3import "context"
4import "errors"
5import "io"
6
7import "pcloud/api"
8
9type RemoteChunk struct {
10 chunkId string
11 client api.ChunkStorageClient
12}
13
14func (r *RemoteChunk) SizeBytes() int {
15 return 0
16}
17
18func (r *RemoteChunk) ReadSeeker() io.ReadSeeker {
19 return &remoteChunkReadSeeker{
20 chunkId: r.chunkId,
21 client: r.client}
22}
23
24func (r *RemoteChunk) Writer() io.Writer {
25 return nil
26}
27
28type remoteChunkReadSeeker struct {
29 chunkId string
30 client api.ChunkStorageClient
31 offset int64
32}
33
34func (c *remoteChunkReadSeeker) Seek(offset int64, whence int) (int64, error) {
35 if whence != io.SeekStart {
36 return 0, errors.New("Seek: RemoteChunk only supports SeekStart whence")
37 }
38 c.offset = offset
39 return offset, nil
40}
41
42func (c *remoteChunkReadSeeker) Read(p []byte) (n int, err error) {
43 req := api.ReadChunkRequest{
44 ChunkId: c.chunkId,
45 Offset: int32(c.offset), // TODO(lekva): must be int64
46 NumBytes: int32(len(p))}
47 resp, err := c.client.ReadChunk(context.Background(), &req)
48 if err != nil {
49 return
50 }
51 n = copy(p, resp.Data)
52 c.offset += int64(n)
53 return
54}
55
56type PrimaryReplicaChunk struct {
57 chunkId string
58}