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  }