github.com/sashka/siva@v1.6.0/readwriter.go (about)

     1  package siva
     2  
     3  import "io"
     4  
     5  //ReadWriter can read and write to the same siva file.
     6  //It is not thread-safe.
     7  type ReadWriter struct {
     8  	*reader
     9  	*writer
    10  }
    11  
    12  func NewReaderWriter(rw io.ReadWriteSeeker) (*ReadWriter, error) {
    13  	_, ok := rw.(io.ReaderAt)
    14  	if !ok {
    15  		return nil, ErrInvalidReaderAt
    16  	}
    17  
    18  	i, err := readIndex(rw, 0)
    19  	if err != nil && err != ErrEmptyIndex {
    20  		return nil, err
    21  	}
    22  
    23  	end, err := rw.Seek(0, io.SeekEnd)
    24  	if err != nil {
    25  		return nil, err
    26  	}
    27  
    28  	w := newWriter(rw)
    29  	w.oIndex = OrderedIndex(i.filter())
    30  	w.oIndex.Sort()
    31  
    32  	getIndexFunc := func() (Index, error) {
    33  		for _, e := range w.index {
    34  			e.absStart = uint64(end) + e.Start
    35  		}
    36  
    37  		return Index(w.oIndex), nil
    38  	}
    39  
    40  	r := newReaderWithIndex(rw, getIndexFunc)
    41  	return &ReadWriter{r, w}, nil
    42  }