diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py
index 2d0340f0f1..6d292ccf9a 100755
--- a/synapse/app/homeserver.py
+++ b/synapse/app/homeserver.py
@@ -43,6 +43,22 @@ import re
logger = logging.getLogger(__name__)
+SCHEMAS = [
+ "transactions",
+ "pdu",
+ "users",
+ "profiles",
+ "presence",
+ "im",
+ "room_aliases",
+]
+
+
+# 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):
@@ -65,31 +81,39 @@ class SynapseHomeServer(HomeServer):
don't have to worry about overwriting existing content.
"""
logging.info("Preparing database: %s...", self.db_name)
- pool = adbapi.ConnectionPool(
- 'sqlite3', self.db_name, check_same_thread=False,
- cp_min=1, cp_max=1)
- schemas = [
- "transactions",
- "pdu",
- "users",
- "profiles",
- "presence",
- "im",
- "room_aliases",
- ]
+ with sqlite3.connect(self.db_name) as db_conn:
+ c = db_conn.cursor()
+ c.execute("PRAGMA user_version")
+ row = c.fetchone()
- for sql_loc in schemas:
- sql_script = read_schema(sql_loc)
+ if row and row[0]:
+ user_version = row[0]
- with sqlite3.connect(self.db_name) as db_conn:
- c = db_conn.cursor()
- c.executescript(sql_script)
- c.close()
- db_conn.commit()
+ 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.close()
logging.info("Database prepared in %s.", self.db_name)
+ pool = adbapi.ConnectionPool(
+ 'sqlite3', self.db_name, check_same_thread=False,
+ cp_min=1, cp_max=1)
+
return pool
def create_resource_tree(self, web_client, redirect_root_to_web_client):
@@ -184,6 +208,7 @@ class SynapseHomeServer(HomeServer):
def start_listening(self, port):
reactor.listenTCP(port, Site(self.root_resource))
+ logger.info("Synapse now listening on port %d", port)
def setup_logging(verbosity=0, filename=None, config_path=None):
@@ -278,7 +303,7 @@ def setup():
redirect_root_to_web_client=True)
hs.start_listening(args.port)
- hs.build_db_pool()
+ hs.get_db_pool()
if args.manhole:
f = twisted.manhole.telnet.ShellFactory()
|