func (udc *UpsideDownCouch) dumpPrefix(kvreader store.KVReader, rv chan interface{}, prefix []byte) { start := prefix if start == nil { start = []byte{0} } it := kvreader.Iterator(start) defer func() { cerr := it.Close() if cerr != nil { rv <- cerr } }() key, val, valid := it.Current() for valid { if prefix != nil && !bytes.HasPrefix(key, prefix) { break } row, err := ParseFromKeyValue(key, val) if err != nil { rv <- err return } rv <- row it.Next() key, val, valid = it.Current() } }
func (udc *UpsideDownCouch) loadSchema(kvreader store.KVReader) (err error) { keyPrefix := []byte{'f'} it := kvreader.Iterator(keyPrefix) defer func() { if cerr := it.Close(); err == nil && cerr != nil { err = cerr } }() it.Seek(keyPrefix) key, val, valid := it.Current() for valid { // stop when if !bytes.HasPrefix(key, keyPrefix) { break } var fieldRow *FieldRow fieldRow, err = NewFieldRowKV(key, val) if err != nil { return } udc.fieldIndexCache.AddExisting(fieldRow.name, fieldRow.index) it.Next() key, val, valid = it.Current() } keyPrefix = []byte{'v'} val, err = kvreader.Get(keyPrefix) if err != nil { return } var vr *VersionRow vr, err = NewVersionRowKV(keyPrefix, val) if err != nil { return } if vr.version != Version { err = IncompatibleVersion return } return }
func (udc *UpsideDownCouch) backIndexRowForDoc(kvreader store.KVReader, docID string) (*BackIndexRow, error) { // use a temporary row structure to build key tempRow := &BackIndexRow{ doc: []byte(docID), } key := tempRow.Key() value, err := kvreader.Get(key) if err != nil { return nil, err } if value == nil { return nil, nil } backIndexRow, err := NewBackIndexRowKV(key, value) if err != nil { return nil, err } return backIndexRow, nil }
func (udc *UpsideDownCouch) countDocs(kvreader store.KVReader) (count uint64, err error) { it := kvreader.Iterator([]byte{'b'}) defer func() { if cerr := it.Close(); err == nil && cerr != nil { err = cerr } }() key, _, valid := it.Current() for valid { if !bytes.HasPrefix(key, []byte{'b'}) { break } count++ it.Next() key, _, valid = it.Current() } return }