// Increment increments the named counter. func Increment(ctx context.Context, name string) error { // Get counter config. var cfg counterConfig ckey := datastore.NewKey(ctx, configKind, name, 0, nil) err := datastore.RunInTransaction(ctx, func(ctx context.Context) error { err := datastore.Get(ctx, ckey, &cfg) if err == datastore.ErrNoSuchEntity { cfg.Shards = defaultShards _, err = datastore.Put(ctx, ckey, &cfg) } return err }, nil) if err != nil { return err } var s shard err = datastore.RunInTransaction(ctx, func(ctx context.Context) error { shardName := fmt.Sprintf("%s-shard%d", name, rand.Intn(cfg.Shards)) key := datastore.NewKey(ctx, shardKind, shardName, 0, nil) err := datastore.Get(ctx, key, &s) // A missing entity and a present entity will both work. if err != nil && err != datastore.ErrNoSuchEntity { return err } s.Name = name s.Count++ _, err = datastore.Put(ctx, key, &s) return err }, nil) if err != nil { return err } memcache.IncrementExisting(ctx, memcacheKey(name), 1) return nil }
func incrementSoldCounter(c context.Context) error { _, err := memcache.IncrementExisting(c, "sold", 1) if err != nil { if err == datastore.ErrNoSuchEntity { log.Infof(c, "[counter] Cache miss when incrementing") } else { return err } } sold := new(Counter) err = datastore.RunInTransaction(c, func(c context.Context) error { key := datastore.NewKey(c, "Counter", "sold", 0, nil) err := datastore.Get(c, key, sold) if err != nil && err != datastore.ErrNoSuchEntity { return err } sold.Value++ _, err = datastore.Put(c, key, sold) if err != nil { sold.Value-- return err } return nil }, nil) return err }
func (m mcImpl) Increment(key string, delta int64, initialValue *uint64) (uint64, error) { if initialValue == nil { return memcache.IncrementExisting(m.aeCtx, key, delta) } return memcache.Increment(m.aeCtx, key, delta, *initialValue) }