blob: 60aeb1346339fb8e2e42da81c67573e47c6fca33 [file] [log] [blame]
giolekva7be17df2020-03-21 13:57:02 +04001package chunk
2
giolekvac5126d92020-03-21 16:39:56 +04003import (
4 "context"
giolekvac5126d92020-03-21 16:39:56 +04005 "io"
giolekva7be17df2020-03-21 13:57:02 +04006
giolekvad2a029d2020-03-25 23:06:08 +04007 "github.com/giolekva/pcloud/api"
giolekvac5126d92020-03-21 16:39:56 +04008)
giolekva7be17df2020-03-21 13:57:02 +04009
10type RemoteChunk struct {
11 chunkId string
12 client api.ChunkStorageClient
13}
14
giolekva1f6577a2020-03-25 12:53:06 +040015func (r *RemoteChunk) Stats() (info ChunkInfo, err error) {
16 resp, err := r.client.GetChunkStatus(
17 context.Background(),
18 &api.GetChunkStatusRequest{ChunkId: r.chunkId})
19 if err != nil {
20 return
21 }
22 info = ChunkInfo{
23 resp.Status,
24 int(resp.TotalBytes),
25 int(resp.CommittedBytes)}
26 return
giolekva7be17df2020-03-21 13:57:02 +040027}
28
giolekva1f6577a2020-03-25 12:53:06 +040029func (r *RemoteChunk) ReaderAt() io.ReaderAt {
30 return &remoteChunkReaderAt{
giolekva7be17df2020-03-21 13:57:02 +040031 chunkId: r.chunkId,
32 client: r.client}
33}
34
giolekva1f6577a2020-03-25 12:53:06 +040035func (r *RemoteChunk) WriterAt() io.WriterAt {
36 return &remoteChunkWriterAt{
37 chunkId: r.chunkId,
38 client: r.client}
giolekva7be17df2020-03-21 13:57:02 +040039}
40
giolekva1f6577a2020-03-25 12:53:06 +040041type remoteChunkReaderAt struct {
giolekva7be17df2020-03-21 13:57:02 +040042 chunkId string
43 client api.ChunkStorageClient
giolekva7be17df2020-03-21 13:57:02 +040044}
45
giolekva1f6577a2020-03-25 12:53:06 +040046func (c *remoteChunkReaderAt) ReadAt(p []byte, offset int64) (n int, err error) {
giolekva7be17df2020-03-21 13:57:02 +040047 req := api.ReadChunkRequest{
48 ChunkId: c.chunkId,
giolekva1f6577a2020-03-25 12:53:06 +040049 Offset: int32(offset),
giolekva7be17df2020-03-21 13:57:02 +040050 NumBytes: int32(len(p))}
51 resp, err := c.client.ReadChunk(context.Background(), &req)
52 if err != nil {
53 return
54 }
55 n = copy(p, resp.Data)
giolekva7be17df2020-03-21 13:57:02 +040056 return
57}
58
giolekva1f6577a2020-03-25 12:53:06 +040059type remoteChunkWriterAt struct {
giolekva7be17df2020-03-21 13:57:02 +040060 chunkId string
giolekva1f6577a2020-03-25 12:53:06 +040061 client api.ChunkStorageClient
62}
63
64func (c *remoteChunkWriterAt) WriteAt(p []byte, offset int64) (n int, err error) {
65 req := api.WriteChunkRequest{
66 ChunkId: c.chunkId,
67 Offset: int32(offset),
68 Data: p}
69 resp, err := c.client.WriteChunk(context.Background(), &req)
70 if resp != nil {
71 n = int(resp.BytesWritten)
72 }
73 return
giolekva7be17df2020-03-21 13:57:02 +040074}