func ExampleNewKey_withParent() { ctx := context.Background() // [START key_with_parent] parentKey := datastore.NewKey(ctx, "TaskList", "default", 0, nil) taskKey := datastore.NewKey(ctx, "Task", "sampleTask", 0, parentKey) // [END key_with_parent] _ = taskKey // Use the task key for datastore operations. }
func ExampleNewKey() { ctx := context.Background() // Key with numeric ID. k1 := datastore.NewKey(ctx, "Article", "", 1, nil) // Key with string ID. k2 := datastore.NewKey(ctx, "Article", "article8", 0, nil) _, _ = k1, k2 // TODO: Use keys. }
func ExampleNewKey_withMultipleParents() { ctx := context.Background() // [START key_with_multilevel_parent] userKey := datastore.NewKey(ctx, "User", "alice", 0, nil) parentKey := datastore.NewKey(ctx, "TaskList", "default", 0, userKey) taskKey := datastore.NewKey(ctx, "Task", "sampleTask", 0, parentKey) // [END key_with_multilevel_parent] _ = taskKey // Use the task key for datastore operations. }
func ExampleWithNamespace() { ctx := context.Background() // k1 is in the default namespace. k1 := datastore.NewKey(ctx, "Article", "", 1, nil) // k2 is in the "other" namespace. ctx2 := datastore.WithNamespace(ctx, "other") k2 := datastore.NewKey(ctx2, "Article", "", 1, nil) // k1 and k2 can refer to different entities, despite the same kind and ID. fmt.Printf("k1: %q\n", k1.Namespace()) fmt.Printf("k2: %q\n", k2.Namespace()) // Output: // k1: "" // k2: "other" }
func pollCommits(dir string) { cmd := execGit(dir, "pull_origin", nil, "pull", "origin") out, err := cmd.CombinedOutput() if err != nil { log.Printf("Error running git pull origin master in %s: %v\n%s", dir, err, out) return } log.Printf("Ran git pull.") // TODO: see if .git/refs/remotes/origin/master // changed. (quicker than running recentCommits each time) hashes, err := recentCommits(dir) if err != nil { log.Print(err) return } latestHash.Lock() latestHash.s = hashes[0] latestHash.Unlock() for _, commit := range hashes { if knownCommit[commit] { continue } if dsClient != nil { ctx := context.Background() key := datastore.NewKey(ctx, "git_commit", commit, 0, nil) var gc GitCommit if err := dsClient.Get(ctx, key, &gc); err == nil && gc.Emailed { log.Printf("Already emailed about commit %v; skipping", commit) knownCommit[commit] = true continue } } if err := emailCommit(dir, commit); err == nil { log.Printf("Emailed commit %s", commit) knownCommit[commit] = true if dsClient != nil { ctx := context.Background() key := datastore.NewKey(ctx, "git_commit", commit, 0, nil) _, err := dsClient.Put(ctx, key, &GitCommit{Emailed: true}) log.Printf("datastore put of git_commit(%v): %v", commit, err) } } } if githubSSHKey != "" { if err := syncToGithub(dir, hashes[0]); err != nil { log.Printf("Failed to push commit %v to github: %v", hashes[0], err) } } }
// Set writes the key, value pair to cs. But it does not actually write if the // value already exists, is up to date, and is more recent than 30 days. func (cs cachedStore) Set(key, value string) error { // check if record already exists ctx := context.Background() dk := datastore.NewKey(ctx, "camnetdns", key, 0, nil) var oldValue dsValue if err := cs.dsClient.Get(ctx, dk, &oldValue); err != nil { if err != datastore.ErrNoSuchEntity { return fmt.Errorf("error checking if record exists for %q from datastore: %v", key, err) } // record does not exist, write it. return cs.put(ctx, key, value) } // record already exists if oldValue.Record != value { // new record is different, overwrite old one. return cs.put(ctx, key, value) } // record is the same as before if oldValue.Updated.Add(staleRecord).After(time.Now()) { // record is still fresh, nothing to do. return nil } // record is older than 30 days, so we rewrite it, for analytics. return cs.put(ctx, key, value) }
func ExampleClient_Put() { ctx := context.Background() client, err := datastore.NewClient(ctx, "project-id") if err != nil { // TODO: Handle error. } type Article struct { Title string Description string Body string `datastore:",noindex"` Author *datastore.Key PublishedAt time.Time } newKey := datastore.NewIncompleteKey(ctx, "Article", nil) _, err = client.Put(ctx, newKey, &Article{ Title: "The title of the article", Description: "The description of the article...", Body: "...", Author: datastore.NewKey(ctx, "Author", "jbd", 0, nil), PublishedAt: time.Now(), }) if err != nil { // TODO: Handle error. } }
func ExampleClient_RunInTransaction() { ctx := context.Background() client, err := datastore.NewClient(ctx, "project-id") if err != nil { // TODO: Handle error. } // Increment a counter. // See https://cloud.google.com/appengine/articles/sharding_counters for // a more scalable solution. type Counter struct { Count int } var count int key := datastore.NewKey(ctx, "Counter", "singleton", 0, nil) _, err = client.RunInTransaction(ctx, func(tx *datastore.Transaction) error { var x Counter if err := tx.Get(key, &x); err != nil && err != datastore.ErrNoSuchEntity { return err } x.Count++ if _, err := tx.Put(key, &x); err != nil { return err } count = x.Count return nil }) if err != nil { // TODO: Handle error. } // The value of count is only valid once the transaction is successful // (RunInTransaction has returned nil). fmt.Printf("Count=%d\n", count) }
func ExampleKey_Encode() { ctx := context.Background() key := datastore.NewKey(ctx, "Article", "", 1, nil) encoded := key.Encode() fmt.Println(encoded) // Output: EgsKB0FydGljbGUQAQ }
func ExampleNewKey() { ctx := context.Background() // [START named_key] taskKey := datastore.NewKey(ctx, "Task", "sampletask", 0, nil) // [END named_key] _ = taskKey // Use the task key for datastore operations. }
func ExampleGetMulti() { ctx := context.Background() client, err := datastore.NewClient(ctx, "project-id") if err != nil { log.Fatal(err) } keys := []*datastore.Key{ datastore.NewKey(ctx, "Post", "post1", 0, nil), datastore.NewKey(ctx, "Post", "post2", 0, nil), datastore.NewKey(ctx, "Post", "post3", 0, nil), } posts := make([]Post, 3) if err := client.GetMulti(ctx, keys, posts); err != nil { log.Println(err) } }
func ExampleClient_GetMulti() { ctx := context.Background() client, err := datastore.NewClient(ctx, "project-id") if err != nil { // TODO: Handle error. } keys := []*datastore.Key{ datastore.NewKey(ctx, "Post", "post1", 0, nil), datastore.NewKey(ctx, "Post", "post2", 0, nil), datastore.NewKey(ctx, "Post", "post3", 0, nil), } posts := make([]Post, 3) if err := client.GetMulti(ctx, keys, posts); err != nil { // TODO: Handle error. } }
func ExampleQuery_EventualConsistency() { ctx := context.Background() // [START eventual_consistent_query] ancestor := datastore.NewKey(ctx, "TaskList", "default", 0, nil) query := datastore.NewQuery("Task").Ancestor(ancestor).EventualConsistency() // [END eventual_consistent_query] _ = query // Use client.Run or client.GetAll to execute the query. }
func ExampleQuery_keyFilter() { ctx := context.Background() // [START key_filter] key := datastore.NewKey(ctx, "Task", "someTask", 0, nil) query := datastore.NewQuery("Task").Filter("__key__ >", key) // [END key_filter] _ = query // Use client.Run or client.GetAll to execute the query. }
func ExampleClient_Delete() { ctx := context.Background() client, _ := datastore.NewClient(ctx, "my-proj") key := datastore.NewKey(ctx, "Task", "sampletask", 0, nil) // [START delete] err := client.Delete(ctx, key) // [END delete] _ = err // Make sure you check err. }
func ExampleClient_Get() { ctx := context.Background() client, _ := datastore.NewClient(ctx, "my-proj") taskKey := datastore.NewKey(ctx, "Task", "sampleTask", 0, nil) // [START lookup] var task Task err := client.Get(ctx, taskKey, &task) // [END lookup] _ = err // Make sure you check err. }
func ExampleClient_PutMulti_interfaceSlice() { ctx := context.Background() client, err := datastore.NewClient(ctx, "project-id") if err != nil { // TODO: Handle error. } keys := []*datastore.Key{ datastore.NewKey(ctx, "Post", "post1", 0, nil), datastore.NewKey(ctx, "Post", "post2", 0, nil), } // PutMulti with an empty interface slice. posts := []interface{}{ &Post{Title: "Post 1", PublishedAt: time.Now()}, &Post{Title: "Post 2", PublishedAt: time.Now()}, } if _, err := client.PutMulti(ctx, keys, posts); err != nil { // TODO: Handle error. } }
func ExampleClient_Delete() { ctx := context.Background() client, err := datastore.NewClient(ctx, "project-id") if err != nil { // TODO: Handle error. } key := datastore.NewKey(ctx, "Article", "articled1", 0, nil) if err := client.Delete(ctx, key); err != nil { // TODO: Handle error. } }
func ExamplePutMulti_slice() { ctx := context.Background() client, err := datastore.NewClient(ctx, "project-id") if err != nil { log.Fatal(err) } keys := []*datastore.Key{ datastore.NewKey(ctx, "Post", "post1", 0, nil), datastore.NewKey(ctx, "Post", "post2", 0, nil), } // PutMulti with a Post slice. posts := []*Post{ {Title: "Post 1", PublishedAt: time.Now()}, {Title: "Post 2", PublishedAt: time.Now()}, } if _, err := client.PutMulti(ctx, keys, posts); err != nil { log.Fatal(err) } }
func ExampleDelete() { ctx := context.Background() client, err := datastore.NewClient(ctx, "project-id") if err != nil { log.Fatal(err) } key := datastore.NewKey(ctx, "Article", "articled1", 0, nil) if err := client.Delete(ctx, key); err != nil { log.Fatal(err) } }
func (cs cachedStore) put(ctx context.Context, key, value string) error { dk := datastore.NewKey(ctx, "camnetdns", key, 0, nil) val := &dsValue{ Record: value, Updated: time.Now(), } if _, err := cs.dsClient.Put(ctx, dk, val); err != nil { return fmt.Errorf("error writing (%q : %q) record to datastore: %v", key, value, err) } // and cache it. cs.cache.Add(key, value) return nil }
func ExampleClient_DeleteMulti() { ctx := context.Background() client, err := datastore.NewClient(ctx, "project-id") if err != nil { // TODO: Handle error. } var keys []*datastore.Key for i := 1; i <= 10; i++ { keys = append(keys, datastore.NewKey(ctx, "Article", "", int64(i), nil)) } if err := client.DeleteMulti(ctx, keys); err != nil { // TODO: Handle error. } }
func ExampleTransaction_runQuery() { ctx := context.Background() client, _ := datastore.NewClient(ctx, "my-proj") // [START transactional_single_entity_group_read_only] tx, err := client.NewTransaction(ctx) if err != nil { log.Fatalf("client.NewTransaction: %v", err) } defer tx.Rollback() // Transaction only used for read. ancestor := datastore.NewKey(ctx, "TaskList", "default", 0, nil) query := datastore.NewQuery("Task").Ancestor(ancestor).Transaction(tx) var tasks []Task _, err = client.GetAll(ctx, query, &tasks) // [END transactional_single_entity_group_read_only] _ = err // Check error. }
func Example_metadataPropertiesForKind() { ctx := context.Background() client, _ := datastore.NewClient(ctx, "my-proj") // [START property_by_kind_run_query] kindKey := datastore.NewKey(ctx, "__kind__", "Task", 0, nil) query := datastore.NewQuery("__property__").Ancestor(kindKey) type Prop struct { Repr []string `datastore:"property_representation"` } var props []Prop keys, err := client.GetAll(ctx, query, &props) // [END property_by_kind_run_query] _ = err // Check error. _ = keys // Use keys to find property names, and props for their representations. }
func ExampleTransaction_insert() { ctx := context.Background() client, _ := datastore.NewClient(ctx, "my-proj") task := Task{} // Populated with appropriate data. taskKey := datastore.NewKey(ctx, "Task", "sampleTask", 0, nil) // [START insert] _, err := client.RunInTransaction(ctx, func(tx *datastore.Transaction) error { // We first check that there is no entity stored with the given key. var empty Task if err := tx.Get(taskKey, &empty); err != datastore.ErrNoSuchEntity { return err } // If there was no matching entity, store it now. _, err := tx.Put(taskKey, &task) return err }) // [END insert] _ = err // Make sure you check err. }
func (cs cachedStore) Get(key string) (string, error) { val, ok := cs.cache.Get(key) if ok { return val.(string), nil } // Cache Miss. hit the datastore. ctx := context.Background() dk := datastore.NewKey(ctx, "camnetdns", key, 0, nil) var value dsValue if err := cs.dsClient.Get(ctx, dk, &value); err != nil { if err != datastore.ErrNoSuchEntity { return "", fmt.Errorf("error getting value for %q from datastore: %v", key, err) } return "", errRecordNotFound } // And cache it. cs.cache.Add(key, value.Record) return value.Record, nil }
func ExampleClient_Put() { ctx := context.Background() client, _ := datastore.NewClient(ctx, "my-proj") // [START entity_with_parent] parentKey := datastore.NewKey(ctx, "TaskList", "default", 0, nil) key := datastore.NewIncompleteKey(ctx, "Task", parentKey) task := Task{ Category: "Personal", Done: false, Priority: 4, Description: "Learn Cloud Datastore", } // A complete key is assigned to the entity when it is Put. var err error key, err = client.Put(ctx, key, &task) // [END entity_with_parent] _ = err // Make sure you check err. }
func ExampleClient_Get() { ctx := context.Background() client, err := datastore.NewClient(ctx, "project-id") if err != nil { // TODO: Handle error. } type Article struct { Title string Description string Body string `datastore:",noindex"` Author *datastore.Key PublishedAt time.Time } key := datastore.NewKey(ctx, "Article", "articled1", 0, nil) article := &Article{} if err := client.Get(ctx, key, article); err != nil { // TODO: Handle error. } }
func ExampleClient_NewTransaction() { ctx := context.Background() client, err := datastore.NewClient(ctx, "project-id") if err != nil { // TODO: Handle error. } const retries = 3 // Increment a counter. // See https://cloud.google.com/appengine/articles/sharding_counters for // a more scalable solution. type Counter struct { Count int } key := datastore.NewKey(ctx, "counter", "CounterA", 0, nil) var tx *datastore.Transaction for i := 0; i < retries; i++ { tx, err = client.NewTransaction(ctx) if err != nil { break } var c Counter if err = tx.Get(key, &c); err != nil && err != datastore.ErrNoSuchEntity { break } c.Count++ if _, err = tx.Put(key, &c); err != nil { break } // Attempt to commit the transaction. If there's a conflict, try again. if _, err = tx.Commit(); err != datastore.ErrConcurrentTransaction { break } } if err != nil { // TODO: Handle error. } }
func ExampleTransaction_getOrCreate() { ctx := context.Background() client, _ := datastore.NewClient(ctx, "my-proj") key := datastore.NewKey(ctx, "Task", "sampletask", 0, nil) // [START transactional_get_or_create] _, err := client.RunInTransaction(ctx, func(tx *datastore.Transaction) error { var task Task if err := tx.Get(key, &task); err != datastore.ErrNoSuchEntity { return err } _, err := tx.Put(key, &Task{ Category: "Personal", Done: false, Priority: 4, Description: "Learn Cloud Datastore", }) return err }) // [END transactional_get_or_create] _ = err // Check error. }