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()
def GetIndices(_app=None): """Fetches all composite indices in the datastore for this app. Returns: list of entity_pb.CompositeIndex """ req = api_base_pb.StringProto() req.set_value(datastore_types.ResolveAppId(_app)) resp = datastore_pb.CompositeIndices() resp = _Call('GetIndices', req, resp) return resp.index_list()
def GetIndices(_app=None): """Fetches all composite indices in the datastore for this app. Returns: list of entity_pb.CompositeIndex """ req = api_base_pb.StringProto() req.set_value(datastore_types.ResolveAppId(_app)) resp = datastore_pb.CompositeIndices() try: apiproxy_stub_map.MakeSyncCall('datastore_v3', 'GetIndices', req, resp) except apiproxy_errors.ApplicationError, err: raise datastore._ToDatastoreError(err)
def GetSchema(_app=None): """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(datastore_types.ResolveAppId(_app)) resp = datastore_pb.Schema() _Call('GetSchema', req, resp) return resp.kind_list()
def _get_indexes(cls, ds_access): """ Retrieves a list of composite indexes for a project. Args: ds_access: A DatastoreDistributed client. Returns: A list of datastore.Index objects. """ request = api_base_pb.StringProto() request.set_value(ds_access.project_id) response = datastore_pb.CompositeIndices() ds_access._Dynamic_GetIndices(request, response) indexes = [] for index in response.index_list(): props = [(prop.name(), prop.direction()) for prop in index.definition().property_list()] new_index = datastore.Index(index.id(), index.definition().entity_type(), index.definition().ancestor(), props) indexes.append(new_index) return indexes
def _SetupIndexes(self, _open=open): """Ensure that the set of existing composite indexes matches index.yaml. Create any new indexes, and delete indexes which are no longer required. Args: _open: Function used to open a file. """ if not self.__root_path: logging.warning("No index.yaml was loaded.") return index_yaml_file = os.path.join(self.__root_path, 'index.yaml') if (self.__cached_yaml[0] == index_yaml_file and os.path.exists(index_yaml_file) and os.path.getmtime(index_yaml_file) == self.__cached_yaml[1]): requested_indexes = self.__cached_yaml[2] else: try: index_yaml_mtime = os.path.getmtime(index_yaml_file) fh = _open(index_yaml_file, 'r') except (OSError, IOError): logging.info("Error reading file") index_yaml_data = None else: try: index_yaml_data = fh.read() finally: fh.close() requested_indexes = [] if index_yaml_data is not None: index_defs = datastore_index.ParseIndexDefinitions( index_yaml_data) if index_defs is not None and index_defs.indexes is not None: requested_indexes = datastore_index.IndexDefinitionsToProtos( self.__app_id, index_defs.indexes) self.__cached_yaml = (index_yaml_file, index_yaml_mtime, requested_indexes) existing_indexes = datastore_pb.CompositeIndices() app_str = api_base_pb.StringProto() app_str.set_value(self.__app_id) self._Dynamic_GetIndices(app_str, existing_indexes) requested = dict( (x.definition().Encode(), x) for x in requested_indexes) existing = dict((x.definition().Encode(), x) for x in existing_indexes.index_list()) # Delete any indexes that are no longer requested. deleted = 0 for key, index in existing.iteritems(): if key not in requested: self._Dynamic_DeleteIndex(index, api_base_pb.VoidProto()) deleted += 1 # Add existing indexes in the index cache. for key, index in existing.iteritems(): new_index = entity_pb.CompositeIndex() new_index.CopyFrom(index) ent_kind = new_index.definition().entity_type() if ent_kind in self.__index_cache: new_indexes = self.__index_cache[ent_kind] new_indexes.append(new_index) self.__index_cache[ent_kind] = new_indexes else: self.__index_cache[ent_kind] = [new_index] # Compared the existing indexes to the requested ones and create any # new indexes requested. created = 0 for key, index in requested.iteritems(): if key not in existing: new_index = entity_pb.CompositeIndex() new_index.CopyFrom(index) new_index.set_id( self._Dynamic_CreateIndex( new_index, api_base_pb.Integer64Proto()).value()) new_index.set_state(entity_pb.CompositeIndex.READ_WRITE) self._Dynamic_UpdateIndex(new_index, api_base_pb.VoidProto()) created += 1 ent_kind = new_index.definition().entity_type() if ent_kind in self.__index_cache: new_indexes = self.__index_cache[ent_kind] new_indexes.append(new_index) self.__index_cache[ent_kind] = new_indexes else: self.__index_cache[ent_kind] = [new_index] if created or deleted: logging.info('Created %d and deleted %d index(es); total %d', created, deleted, len(requested))