mirror of
https://git.anonymousland.org/anonymousland/synapse-product.git
synced 2024-10-01 08:25:44 -04:00
Use SQLite's PRAGMA user_version to check if the database file really matches the schema we have in mind
This commit is contained in:
parent
648796ef1d
commit
e677a3114e
@ -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):
|
class SynapseHomeServer(HomeServer):
|
||||||
|
|
||||||
def build_http_client(self):
|
def build_http_client(self):
|
||||||
@ -78,14 +83,31 @@ class SynapseHomeServer(HomeServer):
|
|||||||
logging.info("Preparing database: %s...", self.db_name)
|
logging.info("Preparing database: %s...", self.db_name)
|
||||||
|
|
||||||
with sqlite3.connect(self.db_name) as db_conn:
|
with sqlite3.connect(self.db_name) as db_conn:
|
||||||
|
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:
|
for sql_loc in SCHEMAS:
|
||||||
sql_script = read_schema(sql_loc)
|
sql_script = read_schema(sql_loc)
|
||||||
|
|
||||||
c = db_conn.cursor()
|
|
||||||
c.executescript(sql_script)
|
c.executescript(sql_script)
|
||||||
c.close()
|
|
||||||
db_conn.commit()
|
db_conn.commit()
|
||||||
|
|
||||||
|
c.execute("PRAGMA user_version = %d" % SCHEMA_VERSION)
|
||||||
|
|
||||||
|
c.close()
|
||||||
|
|
||||||
logging.info("Database prepared in %s.", self.db_name)
|
logging.info("Database prepared in %s.", self.db_name)
|
||||||
|
|
||||||
pool = adbapi.ConnectionPool(
|
pool = adbapi.ConnectionPool(
|
||||||
|
Loading…
Reference in New Issue
Block a user