summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2022-01-16 17:47:28 -0500
committerNed Batchelder <ned@nedbatchelder.com>2022-01-17 05:49:43 -0500
commit1899bdc7abb9c6bdd252b42b080841c63fb1994b (patch)
tree8bfa2a6effa59287eb899c8b89f5faa6e78c239b
parent34dcc5950634989610f59bff8f8cd8816963e113 (diff)
downloadpython-coveragepy-git-nedbat/fix-1303.tar.gz
fix: create the db as needed when accessednedbat/fix-1303
-rw-r--r--coverage/sqldata.py49
-rw-r--r--tests/test_data.py17
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()
)