| giolekva | 7be17df | 2020-03-21 13:57:02 +0400 | [diff] [blame] | 1 | package chunk |
| 2 | |
| giolekva | c5126d9 | 2020-03-21 16:39:56 +0400 | [diff] [blame] | 3 | import ( |
| 4 | "context" |
| giolekva | c5126d9 | 2020-03-21 16:39:56 +0400 | [diff] [blame] | 5 | "io" |
| giolekva | 7be17df | 2020-03-21 13:57:02 +0400 | [diff] [blame] | 6 | |
| giolekva | c5126d9 | 2020-03-21 16:39:56 +0400 | [diff] [blame] | 7 | "pcloud/api" |
| 8 | ) |
| giolekva | 7be17df | 2020-03-21 13:57:02 +0400 | [diff] [blame] | 9 | |
| 10 | type RemoteChunk struct { |
| 11 | chunkId string |
| 12 | client api.ChunkStorageClient |
| 13 | } |
| 14 | |
| giolekva | 1f6577a | 2020-03-25 12:53:06 +0400 | [diff] [blame] | 15 | func (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 |
| giolekva | 7be17df | 2020-03-21 13:57:02 +0400 | [diff] [blame] | 27 | } |
| 28 | |
| giolekva | 1f6577a | 2020-03-25 12:53:06 +0400 | [diff] [blame] | 29 | func (r *RemoteChunk) ReaderAt() io.ReaderAt { |
| 30 | return &remoteChunkReaderAt{ |
| giolekva | 7be17df | 2020-03-21 13:57:02 +0400 | [diff] [blame] | 31 | chunkId: r.chunkId, |
| 32 | client: r.client} |
| 33 | } |
| 34 | |
| giolekva | 1f6577a | 2020-03-25 12:53:06 +0400 | [diff] [blame] | 35 | func (r *RemoteChunk) WriterAt() io.WriterAt { |
| 36 | return &remoteChunkWriterAt{ |
| 37 | chunkId: r.chunkId, |
| 38 | client: r.client} |
| giolekva | 7be17df | 2020-03-21 13:57:02 +0400 | [diff] [blame] | 39 | } |
| 40 | |
| giolekva | 1f6577a | 2020-03-25 12:53:06 +0400 | [diff] [blame] | 41 | type remoteChunkReaderAt struct { |
| giolekva | 7be17df | 2020-03-21 13:57:02 +0400 | [diff] [blame] | 42 | chunkId string |
| 43 | client api.ChunkStorageClient |
| giolekva | 7be17df | 2020-03-21 13:57:02 +0400 | [diff] [blame] | 44 | } |
| 45 | |
| giolekva | 1f6577a | 2020-03-25 12:53:06 +0400 | [diff] [blame] | 46 | func (c *remoteChunkReaderAt) ReadAt(p []byte, offset int64) (n int, err error) { |
| giolekva | 7be17df | 2020-03-21 13:57:02 +0400 | [diff] [blame] | 47 | req := api.ReadChunkRequest{ |
| 48 | ChunkId: c.chunkId, |
| giolekva | 1f6577a | 2020-03-25 12:53:06 +0400 | [diff] [blame] | 49 | Offset: int32(offset), |
| giolekva | 7be17df | 2020-03-21 13:57:02 +0400 | [diff] [blame] | 50 | 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) |
| giolekva | 7be17df | 2020-03-21 13:57:02 +0400 | [diff] [blame] | 56 | return |
| 57 | } |
| 58 | |
| giolekva | 1f6577a | 2020-03-25 12:53:06 +0400 | [diff] [blame] | 59 | type remoteChunkWriterAt struct { |
| giolekva | 7be17df | 2020-03-21 13:57:02 +0400 | [diff] [blame] | 60 | chunkId string |
| giolekva | 1f6577a | 2020-03-25 12:53:06 +0400 | [diff] [blame] | 61 | client api.ChunkStorageClient |
| 62 | } |
| 63 | |
| 64 | func (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 |
| giolekva | 7be17df | 2020-03-21 13:57:02 +0400 | [diff] [blame] | 74 | } |