// Copyright 2016 Google Inc. All rights reserved. // Use of this source code is governed by the Apache 2.0 // license that can be found in the LICENSE file. package datastore import "golang.org/x/net/context" // Datastore kinds for the metadata entities. const ( namespaceKind = "__namespace__" kindKind = "__kind__" propertyKind = "__property__" ) // Namespaces returns all the datastore namespaces. func Namespaces(ctx context.Context) ([]string, error) { // TODO(djd): Support range queries. q := NewQuery(namespaceKind).KeysOnly() keys, err := q.GetAll(ctx, nil) if err != nil { return nil, err } // The empty namespace key uses a numeric ID (==1), but luckily // the string ID defaults to "" for numeric IDs anyway. return keyNames(keys), nil } // Kinds returns the names of all the kinds in the current namespace. func Kinds(ctx context.Context) ([]string, error) { // TODO(djd): Support range queries. q := NewQuery(kindKind).KeysOnly() keys, err := q.GetAll(ctx, nil) if err != nil { return nil, err } return keyNames(keys), nil } // keyNames returns a slice of the provided keys' names (string IDs). func keyNames(keys []*Key) []string { n := make([]string, 0, len(keys)) for _, k := range keys { n = append(n, k.StringID()) } return n } // KindProperties returns all the indexed properties for the given kind. // The properties are returned as a map of property names to a slice of the // representation types. The representation types for the supported Go property // types are: // "INT64": signed integers and time.Time // "DOUBLE": float32 and float64 // "BOOLEAN": bool // "STRING": string, []byte and ByteString // "POINT": appengine.GeoPoint // "REFERENCE": *Key // "USER": (not used in the Go runtime) func KindProperties(ctx context.Context, kind string) (map[string][]string, error) { // TODO(djd): Support range queries. kindKey := NewKey(ctx, kindKind, kind, 0, nil) q := NewQuery(propertyKind).Ancestor(kindKey) propMap := map[string][]string{} props := []struct { Repr []string `datastore:"property_representation"` }{} keys, err := q.GetAll(ctx, &props) if err != nil { return nil, err } for i, p := range props { propMap[keys[i].StringID()] = p.Repr } return propMap, nil }