Source code for google.appengine.api.datastore_admin
#!/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.
"""
import os
from types import MethodType
if os.environ.get('APPENGINE_RUNTIME') == 'python27':
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_types
from google.appengine.datastore import datastore_pb
from google.appengine.runtime import apiproxy_errors
else:
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_types
from google.appengine.datastore import datastore_pb
from google.appengine.runtime import apiproxy_errors
def _StringProtoAppIdGet(self):
return self.value()
def _StringProtoAppIdSet(self, app_id):
return self.set_value(app_id)
[docs]def GetIndices(_app=None):
"""Fetches all composite indices in the datastore for this app.
Returns:
list of entity_pb.CompositeIndex
"""
resolved_app_id = datastore_types.ResolveAppId(_app)
if hasattr(datastore_pb, 'GetIndicesRequest'):
req = datastore_pb.GetIndicesRequest()
req.set_app_id(resolved_app_id)
else:
req = api_base_pb.StringProto()
req.app_id = MethodType(_StringProtoAppIdGet, req)
req.set_app_id = MethodType(_StringProtoAppIdSet, req)
req.set_app_id(resolved_app_id)
resp = datastore_pb.CompositeIndices()
resp = _Call('GetIndices', req, resp)
return resp.index_list()
[docs]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()
resp = _Call('CreateIndex', index, resp)
return resp.value()
[docs]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())
[docs]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'):
req.set_app_id(datastore_types.ResolveAppId(req.app_id()))
try:
result = apiproxy_stub_map.MakeSyncCall('datastore_v3', call, req, resp)
if result:
return result
return resp
except apiproxy_errors.ApplicationError, err:
raise datastore._ToDatastoreError(err)