diff options
author | Paul "LeoNerd" Evans <paul@matrix.org> | 2014-08-20 16:49:54 +0100 |
---|---|---|
committer | Paul "LeoNerd" Evans <paul@matrix.org> | 2014-08-27 11:45:16 +0100 |
commit | e677a3114e0395a328b4d5f775f60532bad4e7eb (patch) | |
tree | c642333a822a93f0363053592e25b274ad106d97 | |
parent | Neater database setup at application startup time; only .connect() it once, n... (diff) | |
download | synapse-e677a3114e0395a328b4d5f775f60532bad4e7eb.tar.xz |
Use SQLite's PRAGMA user_version to check if the database file really matches the schema we have in mind
-rwxr-xr-x | synapse/app/homeserver.py | 34 |
1 files 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) |