From e677a3114e0395a328b4d5f775f60532bad4e7eb Mon Sep 17 00:00:00 2001 From: "Paul \"LeoNerd\" Evans" Date: Wed, 20 Aug 2014 16:49:54 +0100 Subject: Use SQLite's PRAGMA user_version to check if the database file really matches the schema we have in mind --- synapse/app/homeserver.py | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index d63afd1b4a..d0a4880da3 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -54,6 +54,11 @@ SCHEMAS = [ ] +# Remember to update this number every time an incompatible change is made to +# database schema files, so the users will be informed on server restarts. +SCHEMA_VERSION = 1 + + class SynapseHomeServer(HomeServer): def build_http_client(self): @@ -78,13 +83,30 @@ class SynapseHomeServer(HomeServer): logging.info("Preparing database: %s...", self.db_name) with sqlite3.connect(self.db_name) as db_conn: - for sql_loc in SCHEMAS: - sql_script = read_schema(sql_loc) + c = db_conn.cursor() + c.execute("PRAGMA user_version") + row = c.fetchone() + + if row and row[0]: + user_version = row[0] + + if user_version < SCHEMA_VERSION: + # TODO(paul): add some kind of intelligent fixup here + raise ValueError("Cannot use this database as the " + + "schema version (%d) does not match (%d)" % + (user_version, SCHEMA_VERSION) + ) + + else: + for sql_loc in SCHEMAS: + sql_script = read_schema(sql_loc) + + c.executescript(sql_script) + db_conn.commit() + + c.execute("PRAGMA user_version = %d" % SCHEMA_VERSION) - c = db_conn.cursor() - c.executescript(sql_script) - c.close() - db_conn.commit() + c.close() logging.info("Database prepared in %s.", self.db_name) -- cgit 1.4.1