diff -r 261778de26ff -r 620f9b141567 thirdparty/google_appengine/google/appengine/api/datastore_admin.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/thirdparty/google_appengine/google/appengine/api/datastore_admin.py Tue Aug 26 21:49:54 2008 +0000 @@ -0,0 +1,205 @@ +#!/usr/bin/env python +# +# Copyright 2007 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +"""The Python datastore admin API for managing indices and schemas. +""" + + + +from google.appengine.api import api_base_pb +from google.appengine.api import apiproxy_stub_map +from google.appengine.api import datastore +from google.appengine.api import datastore_errors +from google.appengine.api import datastore_types +from google.appengine.datastore import datastore_index +from google.appengine.datastore import datastore_pb +from google.appengine.runtime import apiproxy_errors +from google.appengine.datastore import entity_pb + +_LOCAL_APP_ID = datastore_types._LOCAL_APP_ID + + +_DIRECTION_MAP = { + 'asc': entity_pb.Index_Property.ASCENDING, + 'ascending': entity_pb.Index_Property.ASCENDING, + 'desc': entity_pb.Index_Property.DESCENDING, + 'descending': entity_pb.Index_Property.DESCENDING, + } + + +def GetSchema(_app=_LOCAL_APP_ID): + """Infers an app's schema from the entities in the datastore. + + Note that the PropertyValue PBs in the returned EntityProtos are empty + placeholders, so they may cause problems if you try to convert them to + python values with e.g. datastore_types. In particular, user values will + throw UserNotFoundError because their email and auth domain fields will be + empty. + + Returns: + list of entity_pb.EntityProto, with kind and property names and types + """ + req = api_base_pb.StringProto() + req.set_value(_app) + resp = datastore_pb.Schema() + + _Call('GetSchema', req, resp) + return resp.kind_list() + + +def GetIndices(_app=_LOCAL_APP_ID): + """Fetches all composite indices in the datastore for this app. + + Returns: + list of entity_pb.CompositeIndex + """ + req = api_base_pb.StringProto() + req.set_value(_app) + resp = datastore_pb.CompositeIndices() + try: + apiproxy_stub_map.MakeSyncCall('datastore_v3', 'GetIndices', req, resp) + except apiproxy_errors.ApplicationError, err: + raise datastore._ToDatastoreError(err) + + return resp.index_list() + + +def CreateIndex(index): + """Creates a new composite index in the datastore for this app. + + Args: + index: entity_pb.CompositeIndex + + Returns: + int, the id allocated to the index + """ + resp = api_base_pb.Integer64Proto() + _Call('CreateIndex', index, resp) + return resp.value() + + +def UpdateIndex(index): + """Updates an index's status. The entire index definition must be present. + + Args: + index: entity_pb.CompositeIndex + """ + _Call('UpdateIndex', index, api_base_pb.VoidProto()) + + +def DeleteIndex(index): + """Deletes an index. The entire index definition must be present. + + Args: + index: entity_pb.CompositeIndex + """ + _Call('DeleteIndex', index, api_base_pb.VoidProto()) + + +def _Call(call, req, resp): + """Generic method for making a datastore API call. + + Args: + call: string, the name of the RPC call + req: the request PB. if the app_id field is not set, it defaults to the + local app. + resp: the response PB + """ + if hasattr(req, 'app_id') and not req.app_id(): + req.set_app_id(_LOCAL_APP_ID) + + try: + apiproxy_stub_map.MakeSyncCall('datastore_v3', call, req, resp) + except apiproxy_errors.ApplicationError, err: + raise datastore._ToDatastoreError(err) + + +def IndexDefinitionToProto(app_id, index_definition): + """Transform individual Index definition to protocol buffer. + + Args: + app_id: Application id for new protocol buffer CompositeIndex. + index_definition: datastore_index.Index object to transform. + + Returns: + New entity_pb.CompositeIndex with default values set and index + information filled in. + """ + proto = entity_pb.CompositeIndex() + + proto.set_app_id(app_id) + proto.set_id(0) + proto.set_state(entity_pb.CompositeIndex.WRITE_ONLY) + + definition_proto = proto.mutable_definition() + definition_proto.set_entity_type(index_definition.kind) + definition_proto.set_ancestor(index_definition.ancestor) + + if index_definition.properties is not None: + for prop in index_definition.properties: + prop_proto = definition_proto.add_property() + prop_proto.set_name(prop.name) + prop_proto.set_direction(_DIRECTION_MAP[prop.direction]) + + return proto + + +def IndexDefinitionsToProtos(app_id, index_definitions): + """Transform multiple index definitions to composite index records + + Args: + app_id: Application id for new protocol buffer CompositeIndex. + index_definition: A list of datastore_index.Index objects to transform. + + Returns: + A list of tranformed entity_pb.Compositeindex entities with default values + set and index information filled in. + """ + return [IndexDefinitionToProto(app_id, index) + for index in index_definitions] + + +def ProtoToIndexDefinition(proto): + """Transform individual index protocol buffer to index definition. + + Args: + proto: An instance of entity_pb.CompositeIndex to transform. + + Returns: + A new instance of datastore_index.Index. + """ + properties = [] + proto_index = proto.definition() + for prop_proto in proto_index.property_list(): + prop_definition = datastore_index.Property(name=prop_proto.name()) + if prop_proto.direction() == entity_pb.Index_Property.DESCENDING: + prop_definition.direction = 'descending' + properties.append(prop_definition) + + index = datastore_index.Index(kind=proto_index.entity_type(), + properties=properties) + if proto_index.ancestor(): + index.ancestor = True + return index + +def ProtosToIndexDefinitions(protos): + """Transform multiple index protocol buffers to index definitions. + + Args: + A list of entity_pb.Index records. + """ + return [ProtoToIndexDefinition(definition) for definition in protos]