kraken

Форк
0
76 строк · 1.8 Кб
1
// Copyright (c) 2016-2019 Uber Technologies, Inc.
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//     http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
package piecereader
15

16
import (
17
	"fmt"
18
	"io"
19
	"os"
20

21
	"github.com/uber/kraken/lib/store"
22
)
23

24
// Opener opens files.
25
type Opener interface {
26
	Open() (store.FileReader, error)
27
}
28

29
// FileReader is a storage.PieceReader which reads a piece from a file.
30
type FileReader struct {
31
	offset int64
32
	length int64
33

34
	opener Opener
35
	closer io.Closer
36
	reader io.Reader
37
}
38

39
// NewFileReader creates a FileReader which reads a piece from f. f should not
40
// be used once it is given to a FileReader.
41
func NewFileReader(offset, length int64, opener Opener) *FileReader {
42
	return &FileReader{
43
		offset: offset,
44
		length: length,
45
		opener: opener,
46
	}
47
}
48

49
// Read reads a piece in p.
50
func (r *FileReader) Read(p []byte) (int, error) {
51
	if r.reader == nil {
52
		f, err := r.opener.Open()
53
		if err != nil {
54
			return 0, fmt.Errorf("open: %s", err)
55
		}
56
		if _, err := f.Seek(r.offset, os.SEEK_SET); err != nil {
57
			return 0, fmt.Errorf("seek: %s", err)
58
		}
59
		r.reader = io.LimitReader(f, r.length)
60
		r.closer = f
61
	}
62
	return r.reader.Read(p)
63
}
64

65
// Close closes the underlying file.
66
func (r *FileReader) Close() error {
67
	if r.closer == nil {
68
		return nil
69
	}
70
	return r.closer.Close()
71
}
72

73
// Length returns the length of the piece.
74
func (r *FileReader) Length() int {
75
	return int(r.length)
76
}
77

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.