summaryrefslogtreecommitdiff
path: root/coverage/sqldata.py
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2018-10-15 05:51:50 -0400
committerNed Batchelder <ned@nedbatchelder.com>2018-10-15 06:42:49 -0400
commit83a3b3fe96e0e7d5c25ab4cb423a7a5b2927b232 (patch)
treebc79b5ff277357d134d7579b9a80f0a2dfa57de9 /coverage/sqldata.py
parentd621e6ba2367ffb5c94b27198de71a0c3d956e9b (diff)
downloadpython-coveragepy-git-83a3b3fe96e0e7d5c25ab4cb423a7a5b2927b232.tar.gz
Use one transaction to speed combining
Diffstat (limited to 'coverage/sqldata.py')
-rw-r--r--coverage/sqldata.py84
1 files changed, 45 insertions, 39 deletions
diff --git a/coverage/sqldata.py b/coverage/sqldata.py
index 561878fa..91ad3cd5 100644
--- a/coverage/sqldata.py
+++ b/coverage/sqldata.py
@@ -338,46 +338,52 @@ class CoverageSqliteData(SimpleReprMixin):
other_files = set()
- # lines
- if other_data._has_lines:
- for context in other_data.measured_contexts():
- self.set_context(context)
- for filename in other_data.measured_files():
- lines = set(other_data.lines(filename, context=context))
- if lines:
- other_files.add(filename)
- filename = aliases.map(filename)
- lines.update(self.lines(filename, context=context) or ())
- self.add_lines({filename: lines})
-
- # arcs
- if other_data._has_arcs:
- for context in other_data.measured_contexts():
- self.set_context(context)
- for filename in other_data.measured_files():
- arcs = set(other_data.arcs(filename, context=context))
- if arcs:
- other_files.add(filename)
- filename = aliases.map(filename)
- arcs.update(self.arcs(filename, context=context) or ())
- self.add_arcs({filename: arcs})
-
- # file_tracers
- for filename in other_files:
- other_plugin = other_data.file_tracer(filename)
- filename = aliases.map(filename)
- if filename in this_measured:
- this_plugin = self.file_tracer(filename)
- else:
- this_plugin = None
- if this_plugin is None:
- self.add_file_tracers({filename: other_plugin})
- elif this_plugin != other_plugin:
- raise CoverageException(
- "Conflicting file tracer name for '%s': %r vs %r" % (
- filename, this_plugin, other_plugin,
+ # Force the database we're writing to to exist before we start nesting
+ # contexts.
+ self._start_using()
+
+ # Start a single transaction in each file.
+ with self._connect(), other_data._connect():
+ # lines
+ if other_data._has_lines:
+ for context in other_data.measured_contexts():
+ self.set_context(context)
+ for filename in other_data.measured_files():
+ lines = set(other_data.lines(filename, context=context))
+ if lines:
+ other_files.add(filename)
+ filename = aliases.map(filename)
+ lines.update(self.lines(filename, context=context) or ())
+ self.add_lines({filename: lines})
+
+ # arcs
+ if other_data._has_arcs:
+ for context in other_data.measured_contexts():
+ self.set_context(context)
+ for filename in other_data.measured_files():
+ arcs = set(other_data.arcs(filename, context=context))
+ if arcs:
+ other_files.add(filename)
+ filename = aliases.map(filename)
+ arcs.update(self.arcs(filename, context=context) or ())
+ self.add_arcs({filename: arcs})
+
+ # file_tracers
+ for filename in other_files:
+ other_plugin = other_data.file_tracer(filename)
+ filename = aliases.map(filename)
+ if filename in this_measured:
+ this_plugin = self.file_tracer(filename)
+ else:
+ this_plugin = None
+ if this_plugin is None:
+ self.add_file_tracers({filename: other_plugin})
+ elif this_plugin != other_plugin:
+ raise CoverageException(
+ "Conflicting file tracer name for '%s': %r vs %r" % (
+ filename, this_plugin, other_plugin,
+ )
)
- )
def erase(self, parallel=False):
"""Erase the data in this object.