From 1899bdc7abb9c6bdd252b42b080841c63fb1994b Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 16 Jan 2022 17:47:28 -0500 Subject: fix: create the db as needed when accessed --- coverage/sqldata.py | 49 ++++++++++++++++++++----------------------------- tests/test_data.py | 17 ++--------------- 2 files changed, 22 insertions(+), 44 deletions(-) diff --git a/coverage/sqldata.py b/coverage/sqldata.py index e3c59fcb..1742976f 100644 --- a/coverage/sqldata.py +++ b/coverage/sqldata.py @@ -256,26 +256,6 @@ class CoverageData(SimpleReprMixin): self._have_used = False self._current_context_id = None - def _create_db(self): - """Create a db file that doesn't exist yet. - - Initializes the schema and certain metadata. - """ - if self._debug.should("dataio"): - self._debug.write(f"Creating data file {self._filename!r}") - self._dbs[threading.get_ident()] = db = SqliteDb(self._filename, self._debug) - with db: - db.executescript(SCHEMA) - db.execute("insert into coverage_schema (version) values (?)", (SCHEMA_VERSION,)) - db.executemany( - "insert into meta (key, value) values (?, ?)", - [ - ("sys_argv", str(getattr(sys, "argv", None))), - ("version", __version__), - ("when", datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")), - ] - ) - def _open_db(self): """Open an existing db file, and read its metadata.""" if self._debug.should("dataio"): @@ -289,11 +269,25 @@ class CoverageData(SimpleReprMixin): try: schema_version, = db.execute_one("select version from coverage_schema") except Exception as exc: - raise DataError( - "Data file {!r} doesn't seem to be a coverage data file: {}".format( - self._filename, exc + if "no such table: coverage_schema" in str(exc): + if self._debug.should("dataio"): + self._debug.write(f"Initing data file {self._filename!r}") + db.executescript(SCHEMA) + db.execute("insert into coverage_schema (version) values (?)", (SCHEMA_VERSION,)) + db.executemany( + "insert or ignore into meta (key, value) values (?, ?)", + [ + ("sys_argv", str(getattr(sys, "argv", None))), + ("version", __version__), + ("when", datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")), + ] ) - ) from exc + else: + raise DataError( + "Data file {!r} doesn't seem to be a coverage data file: {}".format( + self._filename, exc + ) + ) from exc else: if schema_version != SCHEMA_VERSION: raise DataError( @@ -312,10 +306,7 @@ class CoverageData(SimpleReprMixin): def _connect(self): """Get the SqliteDb object to use.""" if threading.get_ident() not in self._dbs: - if os.path.exists(self._filename): - self._open_db() - else: - self._create_db() + self._open_db() return self._dbs[threading.get_ident()] def __bool__(self): @@ -521,7 +512,7 @@ class CoverageData(SimpleReprMixin): self._has_arcs = arcs with self._connect() as con: con.execute( - "insert into meta (key, value) values (?, ?)", + "insert or ignore into meta (key, value) values (?, ?)", ("has_arcs", str(int(arcs))) ) diff --git a/tests/test_data.py b/tests/test_data.py index bc06eb23..9a694c6c 100644 --- a/tests/test_data.py +++ b/tests/test_data.py @@ -592,12 +592,6 @@ class CoverageDataInTempDirTest(CoverageTest): covdata.read() assert not covdata - self.make_file("empty.dat", "") - with pytest.raises(DataError, match=msg.format("empty.dat")): - covdata = DebugCoverageData("empty.dat") - covdata.read() - assert not covdata - def test_hard_read_error(self): self.make_file("noperms.dat", "go away") os.chmod("noperms.dat", 0) @@ -626,14 +620,6 @@ class CoverageDataInTempDirTest(CoverageTest): covdata.read() assert not covdata - with sqlite3.connect("no_schema.db") as con: - con.execute("create table foobar (baz text)") - msg = r"Couldn't .* '.*[/\\]no_schema.db': \S+" - with pytest.raises(DataError, match=msg): - covdata = DebugCoverageData("no_schema.db") - covdata.read() - assert not covdata - class CoverageDataFilesTest(CoverageTest): """Tests of CoverageData file handling.""" @@ -667,7 +653,8 @@ class CoverageDataFilesTest(CoverageTest): assert re.search( r"^Erasing data file '.*\.coverage'\n" + - r"Creating data file '.*\.coverage'\n" + + r"Opening data file '.*\.coverage'\n" + + r"Initing data file '.*\.coverage'\n" + r"Opening data file '.*\.coverage'\n$", debug.get_output() ) -- cgit v1.2.1