| // +build appengine |
| |
| // Package memcache provides an implementation of httpcache.Cache that uses App |
| // Engine's memcache package to store cached responses. |
| // |
| // When not built for Google App Engine, this package will provide an |
| // implementation that connects to a specified memcached server. See the |
| // memcache.go file in this package for details. |
| package memcache |
| |
| import ( |
| "appengine" |
| "appengine/memcache" |
| ) |
| |
| // Cache is an implementation of httpcache.Cache that caches responses in App |
| // Engine's memcache. |
| type Cache struct { |
| appengine.Context |
| } |
| |
| // cacheKey modifies an httpcache key for use in memcache. Specifically, it |
| // prefixes keys to avoid collision with other data stored in memcache. |
| func cacheKey(key string) string { |
| return "httpcache:" + key |
| } |
| |
| // Get returns the response corresponding to key if present. |
| func (c *Cache) Get(key string) (resp []byte, ok bool) { |
| item, err := memcache.Get(c.Context, cacheKey(key)) |
| if err != nil { |
| if err != memcache.ErrCacheMiss { |
| c.Context.Errorf("error getting cached response: %v", err) |
| } |
| return nil, false |
| } |
| return item.Value, true |
| } |
| |
| // Set saves a response to the cache as key. |
| func (c *Cache) Set(key string, resp []byte) { |
| item := &memcache.Item{ |
| Key: cacheKey(key), |
| Value: resp, |
| } |
| if err := memcache.Set(c.Context, item); err != nil { |
| c.Context.Errorf("error caching response: %v", err) |
| } |
| } |
| |
| // Delete removes the response with key from the cache. |
| func (c *Cache) Delete(key string) { |
| if err := memcache.Delete(c.Context, cacheKey(key)); err != nil { |
| c.Context.Errorf("error deleting cached response: %v", err) |
| } |
| } |
| |
| // New returns a new Cache for the given context. |
| func New(ctx appengine.Context) *Cache { |
| return &Cache{ctx} |
| } |