Chunk Reader/Writer interface
diff --git a/chunk/server.go b/chunk/server.go
index c35d761..315ec00 100644
--- a/chunk/server.go
+++ b/chunk/server.go
@@ -1,6 +1,8 @@
package chunk
+import "bytes"
import "context"
+import "io"
import "sync"
import "pcloud/api"
@@ -15,7 +17,7 @@
func (s *ChunkServer) ListChunks(
ctx context.Context,
- request *api.ListChunksRequest) (*api.ListChunksResponse, error) {
+ req *api.ListChunksRequest) (*api.ListChunksResponse, error) {
resp := api.ListChunksResponse{}
s.chunks.Range(func(k, v interface{}) bool {
resp.ChunkId = append(resp.ChunkId, k.(string))
@@ -26,16 +28,34 @@
func (s *ChunkServer) ReadChunk(
ctx context.Context,
- request *api.ReadChunkRequest) (*api.ReadChunkResponse, error) {
- if data, ok := s.chunks.Load(request.ChunkId); ok {
- return &api.ReadChunkResponse{Data: data.([]byte)}, nil
+ req *api.ReadChunkRequest) (resp *api.ReadChunkResponse, err error) {
+ if value, ok := s.chunks.Load(req.ChunkId); ok {
+ chunk := value.(Chunk)
+ src := chunk.ReadSeeker()
+ if req.Offset != 0 {
+ _, err = src.Seek(int64(req.Offset), io.SeekStart)
+ if err != nil {
+ return
+ }
+ }
+ var dst bytes.Buffer
+ if req.NumBytes != 0 {
+ _, err = io.CopyN(&dst, src, int64(req.NumBytes))
+ } else {
+ _, err = io.Copy(&dst, src)
+ }
+ if err == nil {
+ resp = &api.ReadChunkResponse{Data: dst.Bytes()}
+ }
}
- return nil, nil
+ return
}
func (s *ChunkServer) StoreChunk(
ctx context.Context,
- request *api.StoreChunkRequest) (*api.StoreChunkResponse, error) {
- s.chunks.Store(request.ChunkId, request.Data)
+ req *api.StoreChunkRequest) (*api.StoreChunkResponse, error) {
+ data := req.Data
+ chunk := NewInMemoryChunk(&data)
+ s.chunks.Store(req.ChunkId, chunk)
return &api.StoreChunkResponse{}, nil
}