| Index: go/src/infra/gae/libs/gae/filters/count/rds.go
 | 
| diff --git a/go/src/infra/gae/libs/gae/filters/count/rds.go b/go/src/infra/gae/libs/gae/filters/count/rds.go
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..20e1caf29fb232a2a3e2b12a22eda603e63b7310
 | 
| --- /dev/null
 | 
| +++ b/go/src/infra/gae/libs/gae/filters/count/rds.go
 | 
| @@ -0,0 +1,104 @@
 | 
| +// Copyright 2015 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +package count
 | 
| +
 | 
| +import (
 | 
| +	"golang.org/x/net/context"
 | 
| +
 | 
| +	"infra/gae/libs/gae"
 | 
| +)
 | 
| +
 | 
| +// RDSCounter is the counter object for the RawDatastore service.
 | 
| +type RDSCounter struct {
 | 
| +	NewKey           Entry
 | 
| +	DecodeKey        Entry
 | 
| +	NewQuery         Entry
 | 
| +	Count            Entry
 | 
| +	RunInTransaction Entry
 | 
| +	Run              Entry
 | 
| +	GetAll           Entry
 | 
| +	Put              Entry
 | 
| +	Get              Entry
 | 
| +	Delete           Entry
 | 
| +	DeleteMulti      Entry
 | 
| +	GetMulti         Entry
 | 
| +	PutMulti         Entry
 | 
| +}
 | 
| +
 | 
| +type rdsCounter struct {
 | 
| +	c *RDSCounter
 | 
| +
 | 
| +	rds gae.RawDatastore
 | 
| +}
 | 
| +
 | 
| +var _ gae.RawDatastore = (*rdsCounter)(nil)
 | 
| +
 | 
| +func (r *rdsCounter) NewKey(kind, stringID string, intID int64, parent gae.DSKey) gae.DSKey {
 | 
| +	r.c.NewKey.up()
 | 
| +	return r.rds.NewKey(kind, stringID, intID, parent)
 | 
| +}
 | 
| +
 | 
| +func (r *rdsCounter) DecodeKey(encoded string) (gae.DSKey, error) {
 | 
| +	ret, err := r.rds.DecodeKey(encoded)
 | 
| +	return ret, r.c.DecodeKey.up(err)
 | 
| +}
 | 
| +
 | 
| +func (r *rdsCounter) NewQuery(kind string) gae.DSQuery {
 | 
| +	r.c.NewQuery.up()
 | 
| +	return r.rds.NewQuery(kind)
 | 
| +}
 | 
| +
 | 
| +func (r *rdsCounter) Run(q gae.DSQuery) gae.RDSIterator {
 | 
| +	r.c.Run.up()
 | 
| +	return r.rds.Run(q)
 | 
| +}
 | 
| +
 | 
| +func (r *rdsCounter) GetAll(q gae.DSQuery, dst *[]gae.DSPropertyMap) ([]gae.DSKey, error) {
 | 
| +	ret, err := r.rds.GetAll(q, dst)
 | 
| +	return ret, r.c.GetAll.up(err)
 | 
| +}
 | 
| +
 | 
| +func (r *rdsCounter) Count(q gae.DSQuery) (int, error) {
 | 
| +	ret, err := r.rds.Count(q)
 | 
| +	return ret, r.c.Count.up(err)
 | 
| +}
 | 
| +
 | 
| +func (r *rdsCounter) RunInTransaction(f func(context.Context) error, opts *gae.DSTransactionOptions) error {
 | 
| +	return r.c.RunInTransaction.up(r.rds.RunInTransaction(f, opts))
 | 
| +}
 | 
| +
 | 
| +func (r *rdsCounter) Put(key gae.DSKey, src gae.DSPropertyLoadSaver) (gae.DSKey, error) {
 | 
| +	ret, err := r.rds.Put(key, src)
 | 
| +	return ret, r.c.Put.up(err)
 | 
| +}
 | 
| +
 | 
| +func (r *rdsCounter) Get(key gae.DSKey, dst gae.DSPropertyLoadSaver) error {
 | 
| +	return r.c.Get.up(r.rds.Get(key, dst))
 | 
| +}
 | 
| +
 | 
| +func (r *rdsCounter) Delete(key gae.DSKey) error {
 | 
| +	return r.c.Delete.up(r.rds.Delete(key))
 | 
| +}
 | 
| +
 | 
| +func (r *rdsCounter) DeleteMulti(keys []gae.DSKey) error {
 | 
| +	return r.c.DeleteMulti.up(r.rds.DeleteMulti(keys))
 | 
| +}
 | 
| +
 | 
| +func (r *rdsCounter) GetMulti(keys []gae.DSKey, dst []gae.DSPropertyLoadSaver) error {
 | 
| +	return r.c.GetMulti.up(r.rds.GetMulti(keys, dst))
 | 
| +}
 | 
| +
 | 
| +func (r *rdsCounter) PutMulti(keys []gae.DSKey, src []gae.DSPropertyLoadSaver) ([]gae.DSKey, error) {
 | 
| +	ret, err := r.rds.PutMulti(keys, src)
 | 
| +	return ret, r.c.PutMulti.up(err)
 | 
| +}
 | 
| +
 | 
| +// FilterRDS installs a counter RawDatastore filter in the context.
 | 
| +func FilterRDS(c context.Context) (context.Context, *RDSCounter) {
 | 
| +	state := &RDSCounter{}
 | 
| +	return gae.AddRDSFilters(c, func(ic context.Context, rds gae.RawDatastore) gae.RawDatastore {
 | 
| +		return &rdsCounter{state, rds}
 | 
| +	}), state
 | 
| +}
 | 
| 
 |