Skip to content

Instantly share code, notes, and snippets.

@ericlevine
Last active July 29, 2019 15:52
Show Gist options
  • Save ericlevine/27f491ef3cf65406a29b785be89d5a69 to your computer and use it in GitHub Desktop.
Save ericlevine/27f491ef3cf65406a29b785be89d5a69 to your computer and use it in GitHub Desktop.
package main
import (
"cloud.google.com/go/datastore"
"fmt"
"golang.org/x/net/context"
"log"
"net/http"
"os"
"time"
)
type Entity struct {
Value string
}
func main() {
http.HandleFunc("/", handle)
port := os.Getenv("PORT")
if port == "" {
port = "8080"
log.Printf("Defaulting to port %s", port)
}
log.Printf("Listening on port %s", port)
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
}
func timer(start time.Time, name string) {
elapsed := time.Since(start)
log.Printf("%s took %s", name, elapsed)
}
var dsClient *datastore.Client
func makeClient(ctx context.Context) (*datastore.Client, error) {
defer timer(time.Now(), "makeClient")
if dsClient == nil {
var err error
dsClient, err = datastore.NewClient(ctx, "my-project")
if err != nil {
return nil, err
}
}
return dsClient, nil
}
func put(ctx context.Context, dsClient *datastore.Client) (*datastore.Key, error) {
defer timer(time.Now(), "put")
key := datastore.IDKey("RandomEntity", 0, nil)
key.Namespace = "test-datatest"
entity := &Entity{
Value: "hello world",
}
return dsClient.Put(ctx, key, entity)
}
func get(ctx context.Context, dsClient *datastore.Client, key *datastore.Key) (*Entity, error) {
defer timer(time.Now(), "get")
e := &Entity{}
return e, dsClient.Get(ctx, key, e)
}
func handle(w http.ResponseWriter, r *http.Request) {
defer timer(time.Now(), "request")
ctx := r.Context()
client, err := makeClient(ctx)
if err != nil {
fmt.Fprintf(w, "client error %v\n", err)
return
}
for i := 0; i < 3; i++ {
key, err := put(ctx, client)
if err != nil {
fmt.Fprintf(w, "put error %v\n", err)
return
}
_, err = get(ctx, client, key)
if err != nil {
fmt.Fprintf(w, "get error %v\n", err)
return
}
}
fmt.Fprintln(w, "Hello, world!")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment