blob: 22b19568c0e2ad15653845536a5b89c14c7e3e22 [file] [log] [blame]
// Copyright 2016 The Go 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 devapp
import (
"bytes"
"compress/gzip"
"encoding/gob"
"golang.org/x/net/context"
)
// Cache is a datastore entity type that contains serialized data for dashboards.
type Cache struct {
// Value contains a gzipped gob'd serialization of the object
// to be cached. It must be []byte to avail ourselves of the
// datastore's 1 MB size limit.
Value []byte `datastore:"value,noindex"`
}
func unpackCache(cache *Cache, data interface{}) error {
if len(cache.Value) > 0 {
gzr, err := gzip.NewReader(bytes.NewReader(cache.Value))
if err != nil {
return err
}
defer gzr.Close()
if err := gob.NewDecoder(gzr).Decode(data); err != nil {
return err
}
}
return nil
}
func loadCache(ctx context.Context, name string, data interface{}) error {
cache, err := getCache(ctx, name)
if err != nil {
return err
}
return unpackCache(cache, data)
}
func writeCache(ctx context.Context, name string, data interface{}) error {
var cache Cache
var cacheout bytes.Buffer
cachegz := gzip.NewWriter(&cacheout)
e := gob.NewEncoder(cachegz)
if err := e.Encode(data); err != nil {
return err
}
if err := cachegz.Close(); err != nil {
return err
}
cache.Value = cacheout.Bytes()
logger.Infof(ctx, "Cache %q update finished; writing %d bytes", name, cacheout.Len())
return putCache(ctx, name, &cache)
}