@@ -256,26 +256,6 @@ def _reset(self):
256
256
self ._have_used = False
257
257
self ._current_context_id = None
258
258
259
- def _create_db (self ):
260
- """Create a db file that doesn't exist yet.
261
-
262
- Initializes the schema and certain metadata.
263
- """
264
- if self ._debug .should ("dataio" ):
265
- self ._debug .write (f"Creating data file { self ._filename !r} " )
266
- self ._dbs [threading .get_ident ()] = db = SqliteDb (self ._filename , self ._debug )
267
- with db :
268
- db .executescript (SCHEMA )
269
- db .execute ("insert into coverage_schema (version) values (?)" , (SCHEMA_VERSION ,))
270
- db .executemany (
271
- "insert into meta (key, value) values (?, ?)" ,
272
- [
273
- ("sys_argv" , str (getattr (sys , "argv" , None ))),
274
- ("version" , __version__ ),
275
- ("when" , datetime .datetime .now ().strftime ("%Y-%m-%d %H:%M:%S" )),
276
- ]
277
- )
278
-
279
259
def _open_db (self ):
280
260
"""Open an existing db file, and read its metadata."""
281
261
if self ._debug .should ("dataio" ):
@@ -289,11 +269,14 @@ def _read_db(self):
289
269
try :
290
270
schema_version , = db .execute_one ("select version from coverage_schema" )
291
271
except Exception as exc :
292
- raise DataError (
293
- "Data file {!r} doesn't seem to be a coverage data file: {}" .format (
294
- self ._filename , exc
295
- )
296
- ) from exc
272
+ if "no such table: coverage_schema" in str (exc ):
273
+ self ._init_db (db )
274
+ else :
275
+ raise DataError (
276
+ "Data file {!r} doesn't seem to be a coverage data file: {}" .format (
277
+ self ._filename , exc
278
+ )
279
+ ) from exc
297
280
else :
298
281
if schema_version != SCHEMA_VERSION :
299
282
raise DataError (
@@ -309,13 +292,25 @@ def _read_db(self):
309
292
for path , file_id in db .execute ("select path, id from file" ):
310
293
self ._file_map [path ] = file_id
311
294
295
+ def _init_db (self , db ):
296
+ """Write the initial contents of the database."""
297
+ if self ._debug .should ("dataio" ):
298
+ self ._debug .write (f"Initing data file { self ._filename !r} " )
299
+ db .executescript (SCHEMA )
300
+ db .execute ("insert into coverage_schema (version) values (?)" , (SCHEMA_VERSION ,))
301
+ db .executemany (
302
+ "insert or ignore into meta (key, value) values (?, ?)" ,
303
+ [
304
+ ("sys_argv" , str (getattr (sys , "argv" , None ))),
305
+ ("version" , __version__ ),
306
+ ("when" , datetime .datetime .now ().strftime ("%Y-%m-%d %H:%M:%S" )),
307
+ ]
308
+ )
309
+
312
310
def _connect (self ):
313
311
"""Get the SqliteDb object to use."""
314
312
if threading .get_ident () not in self ._dbs :
315
- if os .path .exists (self ._filename ):
316
- self ._open_db ()
317
- else :
318
- self ._create_db ()
313
+ self ._open_db ()
319
314
return self ._dbs [threading .get_ident ()]
320
315
321
316
def __bool__ (self ):
@@ -522,7 +517,7 @@ def _choose_lines_or_arcs(self, lines=False, arcs=False):
522
517
self ._has_arcs = arcs
523
518
with self ._connect () as con :
524
519
con .execute (
525
- "insert into meta (key, value) values (?, ?)" ,
520
+ "insert or ignore into meta (key, value) values (?, ?)" ,
526
521
("has_arcs" , str (int (arcs )))
527
522
)
528
523
0 commit comments