github.com/scottcagno/storage@v1.8.0/pkg/bw/v3/reader.go (about) 1 package v3 2 3 import ( 4 "bufio" 5 "hash/crc32" 6 "io" 7 ) 8 9 type DataReader struct { 10 br *bufio.Reader 11 opts *Options 12 } 13 14 func NewDataReader(r io.Reader, opt *Options) *DataReader { 15 if opt == nil { 16 opt = defaultOptions 17 } 18 return &DataReader{ 19 br: bufio.NewReaderSize(r, opt.pageSize), 20 opts: opt, 21 } 22 } 23 24 func (d *DataReader) readHeader(h *header) (int, error) { 25 // read data into header 26 n, err := h.ReadFrom(d.br) 27 if err != nil { 28 return int(n), err 29 } 30 return int(n), nil 31 } 32 33 func (d *DataReader) Read(p []byte) (int, error) { 34 // create header 35 var h header 36 // and read into header 37 n, err := d.readHeader(&h) 38 if err != nil { 39 return n, err 40 } 41 var nn int 42 nn += n 43 // check len(p) to make sure it's large enough 44 if len(p[:h.size]) < int(h.size) { 45 return nn, ErrNotEnoughRoom 46 } 47 // it is, so let's read 48 n, err = d.br.Read(p[:h.size]) 49 if err != nil { 50 return n + nn, err 51 } 52 nn += n 53 // check crc 54 if h.crc32 != crc32.ChecksumIEEE(p[:h.size]) { 55 return nn, ErrBadChecksum 56 } 57 // return bytes read 58 return nn, nil 59 }