in src/google/appengine/datastore/datastore_stub_index.py [0:0]
def UpdateDatastoreIndexesAutoXml(self, openfile=open):
"""Update datastore-indexes-auto.xml if appropriate."""
datastore_indexes_xml_file = os.path.join(
self.root_path, 'WEB-INF', 'datastore-indexes.xml')
try:
datastore_indexes_xml_mtime = os.path.getmtime(datastore_indexes_xml_file)
except os.error:
datastore_indexes_xml_mtime = None
if datastore_indexes_xml_mtime != self.datastore_indexes_xml_mtime:
self.datastore_indexes_xml_mtime = datastore_indexes_xml_mtime
if self.datastore_indexes_xml_mtime:
with openfile(datastore_indexes_xml_file) as f:
self.datastore_indexes_xml = f.read()
self.auto_generated = datastore_index_xml.IsAutoGenerated(
self.datastore_indexes_xml)
else:
self.auto_generated = True
self.datastore_indexes_xml = None
if not self.auto_generated:
logger.debug('Detected <datastore-indexes autoGenerated="false">,'
' will not update datastore-indexes-auto.xml')
return
datastore_stub = apiproxy_stub_map.apiproxy.GetStub('datastore_v3')
query_ci_history_len = datastore_stub._QueryCompositeIndexHistoryLength()
history_changed = (query_ci_history_len != self.last_history_size)
self.last_history_size = query_ci_history_len
if not history_changed:
logger.debug('No need to update datastore-indexes-auto.xml')
return
datastore_indexes_auto_xml_file = os.path.join(
self.root_path, 'WEB-INF', 'appengine-generated',
'datastore-indexes-auto.xml')
try:
with open(datastore_indexes_auto_xml_file) as f:
datastore_indexes_auto_xml = f.read()
except IOError as err:
datastore_indexes_auto_xml = None
if self.datastore_indexes_xml:
try:
manual_index_definitions = (
datastore_index_xml.IndexesXmlToIndexDefinitions(
self.datastore_indexes_xml))
except validation.ValidationError as e:
logger.error('Error parsing %s: %s',
datastore_indexes_xml_file, e)
return
else:
manual_index_definitions = datastore_index.IndexDefinitions(indexes=[])
if datastore_indexes_auto_xml:
try:
prev_auto_index_definitions = (
datastore_index_xml.IndexesXmlToIndexDefinitions(
datastore_indexes_auto_xml))
except validation.ValidationError as e:
logger.error('Error parsing %s: %s',
datastore_indexes_auto_xml_file, e)
return
else:
prev_auto_index_definitions = datastore_index.IndexDefinitions(indexes=[])
all_index_definitions = datastore_index.IndexDefinitions(
indexes=(manual_index_definitions.indexes +
prev_auto_index_definitions.indexes))
query_history = datastore_stub.QueryHistory()
auto_index_dict = GenerateIndexDictFromHistory(
query_history, all_index_definitions, manual_index_definitions)
auto_indexes, counts = self._IndexesFromIndexDict(auto_index_dict)
auto_index_definitions = datastore_index.IndexDefinitions(
indexes=auto_indexes)
if auto_index_definitions == prev_auto_index_definitions:
return
try:
appengine_generated = os.path.dirname(datastore_indexes_auto_xml_file)
if not os.path.exists(appengine_generated):
os.mkdir(appengine_generated)
with open(datastore_indexes_auto_xml_file, 'w') as f:
f.write(self._IndexXmlFromIndexes(auto_indexes, counts))
except os.error as err:
logger.error(
'Could not update %s: %s', datastore_indexes_auto_xml_file, err)