func (s *ApiServer) ForwardFetchFeed(ctx context.Context, req *pb.FeedRequest) (*pb.Feed, error) { if req.PageSize <= 0 || req.PageSize >= 100 { req.PageSize = 50 } profile, err := store.GetProfile(s.mdb, req.Id) if err != nil { return nil, err } uuid1, _ := uuid.FromString(profile.Uuid) preKey := store.NewUUIDKey(store.TableReverseEntryIndex, uuid1) log.Println("forward seeking:", preKey.String()) start := req.Start var entries []*pb.Entry _, err = store.ForwardTableScan(s.rdb, preKey, func(i int, k, v []byte) error { if start > 0 { start-- return nil // continue } entry := new(pb.Entry) rawdata, err := s.rdb.Get(v) // index value point to entry key if err != nil || len(rawdata) == 0 { return fmt.Errorf("entry data missing") } if err := proto.Unmarshal(rawdata, entry); err != nil { return err } if err = FormatFeedEntry(s.mdb, req, entry); err != nil { return err } entries = append(entries, entry) if i > int(req.PageSize+req.Start) { return &store.Error{"ok", store.StopIteration} } return nil }) if err != nil { return nil, err } feed := &pb.Feed{ Uuid: profile.Uuid, Id: profile.Id, Name: profile.Name, Picture: profile.Picture, Type: profile.Type, Private: profile.Private, SupId: profile.SupId, Description: profile.Description, Entries: entries[:], } return feed, nil }
// key to dump index cache to db func (f *FeedIndex) Key() store.Key { return store.NewUUIDKey(store.TableIndexCache, *f.Uuid) }