code: func (b *BoltBackend) GetItems(path []string, opts ...legacy.OpOption) ([]legacy.Item, error) {
  	cfg, err := legacy.CollectOptions(opts)
  	if err != nil {
  		return nil, trace.Wrap(err)
  	}
  	if cfg.Recursive {
  		return b.getItemsRecursive(path)
  	}
  
  	keys, err := b.GetKeys(path)
  	if err != nil {
  		return nil, trace.Wrap(err)
  	}
  
  	// This is a very inefficient approach. It's here to satisfy the
  	// backend.Backend interface since the Bolt backend is slated for removal
  	// in 2.7.0 anyway.
  	items := make([]legacy.Item, 0, len(keys))
  	for _, e := range keys {
  		val, err := b.GetVal(path, e)
  		if err != nil {
  			continue
  		}
  
  		items = append(items, legacy.Item{
  			Key:   e,
  			Value: val,
  		})
  	}
  
  	return items, nil
  }
docs: // GetItems fetches keys and values and returns them to the caller.