// NewWriter create new initialized table writer. func NewWriter(w desc.Writer, o opt.OptionsGetter) *Writer { t := &Writer{w: w, o: o, cmp: o.GetComparer()} // Creating blocks t.data = block.NewWriter(o.GetBlockRestartInterval()) t.index = block.NewWriter(1) filter := o.GetFilter() if filter != nil { t.filter = block.NewFilterWriter(filter) t.filter.Generate(0) } t.lblock = new(bInfo) return t }
// NewReader create new initialized table reader. func NewReader(r desc.Reader, size uint64, o opt.OptionsGetter, cache cache.Namespace) (p *Reader, err error) { mb, ib, err := readFooter(r, size) if err != nil { return } t := &Reader{r: r, o: o, dataEnd: mb.offset, cache: cache} // index block buf, err := ib.readAll(r, true) if err != nil { return } t.index, err = block.NewReader(buf, o.GetComparer()) if err != nil { return } // filter block filter := o.GetFilter() if filter != nil { // we will ignore any errors at meta/filter block // since it is not essential for operation // meta block buf, err = mb.readAll(r, true) if err != nil { goto out } var meta *block.Reader meta, err = block.NewReader(buf, comparer.BytesComparer{}) if err != nil { goto out } // check for filter name iter := meta.NewIterator() key := "filter." + filter.Name() if iter.Seek([]byte(key)) && string(iter.Key()) == key { fb := new(bInfo) _, err = fb.decodeFrom(iter.Value()) if err != nil { return } // now the data end before filter block start offset t.dataEnd = fb.offset // filter block buf, err = fb.readAll(r, true) if err != nil { goto out } t.filter, err = block.NewFilterReader(buf, filter) if err != nil { goto out } } } out: return t, nil }