// AddTask adds a task with the given description to the datastore, // returning the key of the newly created entity. func AddTask(ctx context.Context, client *datastore.Client, desc string) (*datastore.Key, error) { task := &Task{ Desc: desc, Created: time.Now(), } key := datastore.IncompleteKey("Task", nil) return client.Put(ctx, key, task) }
// newDatastoreDB creates a new BookDatabase backed by Cloud Datastore. // See the datastore and google packages for details on creating a suitable Client: // https://godoc.org/cloud.google.com/go/datastore func newDatastoreDB(client *datastore.Client) (BookDatabase, error) { ctx := context.Background() // Verify that we can communicate and authenticate with the datastore service. t, err := client.NewTransaction(ctx) if err != nil { return nil, fmt.Errorf("datastoredb: could not connect: %v", err) } if err := t.Rollback(); err != nil { return nil, fmt.Errorf("datastoredb: could not connect: %v", err) } return &datastoreDB{ client: client, }, nil }
// [START update_entity] // MarkDone marks the task done with the given ID. func MarkDone(ctx context.Context, client *datastore.Client, taskID int64) error { // Create a key using the given integer ID. key := datastore.IDKey("Task", taskID, nil) // In a transaction load each task, set done to true and store. _, err := client.RunInTransaction(ctx, func(tx *datastore.Transaction) error { var task Task if err := tx.Get(key, &task); err != nil { return err } task.Done = true _, err := tx.Put(key, &task) return err }) return err }
// [START retrieve_entities] // ListTasks returns all the tasks in ascending order of creation time. func ListTasks(ctx context.Context, client *datastore.Client) ([]*Task, error) { var tasks []*Task // Create a query to fetch all Task entities, ordered by "created". query := datastore.NewQuery("Task").Order("created") keys, err := client.GetAll(ctx, query, &tasks) if err != nil { return nil, err } // Set the id field on each Task from the corresponding key. for i, key := range keys { tasks[i].id = key.ID } return tasks, nil }
// [START delete_entity] // DeleteTask deletes the task with the given ID. func DeleteTask(ctx context.Context, client *datastore.Client, taskID int64) error { return client.Delete(ctx, datastore.IDKey("Task", taskID, nil)) }