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 }