diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2018-10-15 05:51:50 -0400 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2018-10-15 06:42:49 -0400 |
commit | 83a3b3fe96e0e7d5c25ab4cb423a7a5b2927b232 (patch) | |
tree | bc79b5ff277357d134d7579b9a80f0a2dfa57de9 /coverage/sqldata.py | |
parent | d621e6ba2367ffb5c94b27198de71a0c3d956e9b (diff) | |
download | python-coveragepy-git-83a3b3fe96e0e7d5c25ab4cb423a7a5b2927b232.tar.gz |
Use one transaction to speed combining
Diffstat (limited to 'coverage/sqldata.py')
-rw-r--r-- | coverage/sqldata.py | 84 |
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. |