thirdparty/google_appengine/google/appengine/api/datastore_admin.py
changeset 109 620f9b141567
child 149 f2e327a7c5de
--- /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]