in src/google/appengine/datastore/datastore_stub_util.py [0:0]
def _SetupIndexes(self, _open=open):
"""Ensure that the set of existing composite indexes matches index.yaml.
Note: this is similar to the algorithm used by the admin console for
the same purpose.
"""
if not self._root_path:
return
file_names = [os.path.join(self._root_path, 'index.yaml')]
file_mtimes = [os.path.getmtime(f) for f in file_names if os.path.exists(f)]
if (self._cached_index_definitions.file_names == file_names and
all(os.path.exists(f) for f in file_names) and
self._cached_index_definitions.last_modifieds == file_mtimes):
requested_indexes = self._cached_index_definitions.index_protos
else:
file_mtimes = []
index_texts = []
for file_name in file_names:
try:
file_mtimes.append(os.path.getmtime(file_name))
with _open(file_name, 'r') as fh:
index_texts.append(fh.read())
except (OSError, IOError):
pass
requested_indexes = []
if len(index_texts) == len(file_names):
all_ok = True
for index_text in index_texts:
index_defs = datastore_index.ParseIndexDefinitions(index_text)
if index_defs is None or index_defs.indexes is None:
all_ok = False
else:
requested_indexes.extend(
datastore_index.IndexDefinitionsToProtos(
self._app_id, index_defs.indexes))
if all_ok:
self._cached_index_definitions = _CachedIndexDefinitions(
file_names, file_mtimes, requested_indexes)
existing_indexes = self._datastore.GetIndexes(
self._app_id, self._trusted, self._app_id)
requested = dict(
(x.definition.SerializeToString(), x) for x in requested_indexes)
existing = dict(
(x.definition.SerializeToString(), x) for x in existing_indexes)
created = 0
for key, index in six.iteritems(requested):
if key not in existing:
new_index = entity_pb2.CompositeIndex()
new_index.CopyFrom(index)
new_index.id = datastore_admin.CreateIndex(new_index)
new_index.state = entity_pb2.CompositeIndex.READ_WRITE
datastore_admin.UpdateIndex(new_index)
created += 1
deleted = 0
for key, index in six.iteritems(existing):
if key not in requested:
datastore_admin.DeleteIndex(index)
deleted += 1
if created or deleted:
logger.debug('Created %d and deleted %d index(es); total %d',
created, deleted, len(requested))