summary refs log tree commit diff
diff options
context:
space:
mode:
authorPaul "LeoNerd" Evans <paul@matrix.org>2014-08-20 16:49:54 +0100
committerPaul "LeoNerd" Evans <paul@matrix.org>2014-08-27 11:45:16 +0100
commite677a3114e0395a328b4d5f775f60532bad4e7eb (patch)
treec642333a822a93f0363053592e25b274ad106d97
parentNeater database setup at application startup time; only .connect() it once, n... (diff)
downloadsynapse-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-xsynapse/app/homeserver.py34
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)