From 86508459edcf8f85a394413aec4cf909e709981f Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 26 Aug 2018 08:50:54 -0400 Subject: Check the schema version, no more app_id --- coverage/sqldata.py | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) (limited to 'coverage/sqldata.py') diff --git a/coverage/sqldata.py b/coverage/sqldata.py index f92e245b..e102f294 100644 --- a/coverage/sqldata.py +++ b/coverage/sqldata.py @@ -6,8 +6,6 @@ # TODO: get sys_info for data class, so we can see sqlite version etc # TODO: get rid of skip_unless_data_storage_is_json # TODO: get rid of "JSON message" and "SQL message" in the tests -# TODO: check the schema -# TODO: get rid of the application_id? # TODO: factor out dataop debugging to a wrapper class? # TODO: make sure all dataop debugging is in place somehow # TODO: should writes be batched? @@ -17,7 +15,6 @@ import glob import os import sqlite3 -import struct from coverage.backward import iitems from coverage.data import filename_suffix @@ -26,13 +23,13 @@ from coverage.files import PathAliases from coverage.misc import CoverageException, file_be_gone +SCHEMA_VERSION = 1 + SCHEMA = """ -create table schema ( +create table coverage_schema ( version integer ); -insert into schema (version) values (1); - create table meta ( has_lines boolean, has_arcs boolean @@ -63,13 +60,6 @@ create table tracer ( ); """ -APP_ID = 0xc07e8a6e # "coverage", kind of. - -def unsigned_to_signed(val): - return struct.unpack('>i', struct.pack('>I', val))[0] - -def signed_to_unsigned(val): - return struct.unpack('>I', struct.pack('>i', val))[0] class CoverageSqliteData(SimpleRepr): def __init__(self, basename=None, suffix=None, warn=None, debug=None): @@ -100,11 +90,11 @@ class CoverageSqliteData(SimpleRepr): self._debug.write("Creating data file {!r}".format(self.filename)) self._db = Sqlite(self.filename, self._debug) with self._db: - self._db.execute("pragma application_id = {}".format(unsigned_to_signed(APP_ID))) for stmt in SCHEMA.split(';'): stmt = stmt.strip() if stmt: self._db.execute(stmt) + self._db.execute("insert into coverage_schema (version) values (?)", (SCHEMA_VERSION,)) self._db.execute( "insert into meta (has_lines, has_arcs) values (?, ?)", (self._has_lines, self._has_arcs) @@ -115,12 +105,20 @@ class CoverageSqliteData(SimpleRepr): self._debug.write("Opening data file {!r}".format(self.filename)) self._db = Sqlite(self.filename, self._debug) with self._db: - for app_id, in self._db.execute("pragma application_id"): - app_id = signed_to_unsigned(int(app_id)) - if app_id != APP_ID: + try: + schema_version, = self._db.execute("select version from coverage_schema").fetchone() + except (TypeError, sqlite3.Error) as exc: + raise CoverageException( + "Data file {!r} doesn't seem to be a coverage data file: {}".format( + self.filename, exc + ) + ) + else: + if schema_version != SCHEMA_VERSION: raise CoverageException( - "Couldn't use {!r}: wrong application_id: " - "0x{:08x} != 0x{:08x}".format(self.filename, app_id, APP_ID) + "Data file {!r} is wrong schema: {} instead of {}".format( + self.filename, schema_version, SCHEMA_VERSION + ) ) for row in self._db.execute("select has_lines, has_arcs from meta"): self._has_lines, self._has_arcs = row -- cgit v1.2.1 From 3ab1c50f23c47721bd2ccb025c0f0a8b3d2b16c9 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 26 Aug 2018 09:44:22 -0400 Subject: Tests of the schema checking --- coverage/sqldata.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'coverage/sqldata.py') diff --git a/coverage/sqldata.py b/coverage/sqldata.py index e102f294..0037d76d 100644 --- a/coverage/sqldata.py +++ b/coverage/sqldata.py @@ -4,7 +4,7 @@ """Sqlite coverage data.""" # TODO: get sys_info for data class, so we can see sqlite version etc -# TODO: get rid of skip_unless_data_storage_is_json +# TODO: get rid of skip_unless_data_storage_is # TODO: get rid of "JSON message" and "SQL message" in the tests # TODO: factor out dataop debugging to a wrapper class? # TODO: make sure all dataop debugging is in place somehow @@ -107,7 +107,7 @@ class CoverageSqliteData(SimpleRepr): with self._db: try: schema_version, = self._db.execute("select version from coverage_schema").fetchone() - except (TypeError, sqlite3.Error) as exc: + except Exception as exc: raise CoverageException( "Data file {!r} doesn't seem to be a coverage data file: {}".format( self.filename, exc @@ -116,7 +116,7 @@ class CoverageSqliteData(SimpleRepr): else: if schema_version != SCHEMA_VERSION: raise CoverageException( - "Data file {!r} is wrong schema: {} instead of {}".format( + "Couldn't use data file {!r}: wrong schema: {} instead of {}".format( self.filename, schema_version, SCHEMA_VERSION ) ) -- cgit v1.2.1