diff options
Diffstat (limited to 'synapse/app')
-rwxr-xr-x | synapse/app/homeserver.py | 65 |
1 files changed, 45 insertions, 20 deletions
diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index f210d26629..a89770ed7b 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): @@ -282,7 +307,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() |