55 lines
1.7 KiB
Go
55 lines
1.7 KiB
Go
// Package mdatastore implements connecting to Google's Datastore service and
|
|
// simplifying a number of interactions with it.
|
|
package mdatastore
|
|
|
|
import (
|
|
"context"
|
|
|
|
"cloud.google.com/go/datastore"
|
|
"github.com/mediocregopher/mediocre-go-lib/mctx"
|
|
"github.com/mediocregopher/mediocre-go-lib/mdb"
|
|
"github.com/mediocregopher/mediocre-go-lib/merr"
|
|
"github.com/mediocregopher/mediocre-go-lib/mlog"
|
|
"github.com/mediocregopher/mediocre-go-lib/mrun"
|
|
)
|
|
|
|
// Datastore is a wrapper around a datastore client providing more
|
|
// functionality.
|
|
type Datastore struct {
|
|
*datastore.Client
|
|
|
|
gce *mdb.GCE
|
|
ctx context.Context
|
|
}
|
|
|
|
// WithDatastore returns a Datastore instance which will be initialized and
|
|
// configured when the start event is triggered on the returned Context (see
|
|
// mrun.Start). The Datastore instance will have Close called on it when the
|
|
// stop event is triggered on the returned Context (see mrun.Stop).
|
|
//
|
|
// gce is optional and can be passed in if there's an existing gce object which
|
|
// should be used, otherwise a new one will be created with mdb.MGCE.
|
|
func WithDatastore(parent context.Context, gce *mdb.GCE) (context.Context, *Datastore) {
|
|
ctx := mctx.NewChild(parent, "datastore")
|
|
if gce == nil {
|
|
ctx, gce = mdb.WithGCE(ctx, "")
|
|
}
|
|
|
|
ds := &Datastore{
|
|
gce: gce,
|
|
}
|
|
|
|
ctx = mrun.WithStartHook(ctx, func(innerCtx context.Context) error {
|
|
ds.ctx = mctx.MergeAnnotations(ds.ctx, ds.gce.Context())
|
|
mlog.Info("connecting to datastore", ds.ctx)
|
|
var err error
|
|
ds.Client, err = datastore.NewClient(innerCtx, ds.gce.Project, ds.gce.ClientOptions()...)
|
|
return merr.Wrap(err, ds.ctx)
|
|
})
|
|
ctx = mrun.WithStopHook(ctx, func(context.Context) error {
|
|
return ds.Client.Close()
|
|
})
|
|
ds.ctx = ctx
|
|
return mctx.WithChild(parent, ctx), ds
|
|
}
|