Skip to content

Commit d8483a1

Browse files
author
Ayush Shukla
committed
feat(database): Engine-level Write-Ahead Logging & concurrency buffers for SQLite (#477)
1 parent 8a00969 commit d8483a1

1 file changed

Lines changed: 18 additions & 1 deletion

File tree

montage/app.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,15 @@ def set_mysql_session_charset_and_collation(connection, branch):
5353
return
5454

5555

56+
def set_sqlite_pragma(dbapi_connection, connection_record):
57+
# Issue #477: Enables high-concurrency for SQLite staging databases
58+
cursor = dbapi_connection.cursor()
59+
cursor.execute("PRAGMA journal_mode=WAL")
60+
cursor.execute("PRAGMA synchronous=NORMAL")
61+
cursor.execute("PRAGMA busy_timeout=5000")
62+
cursor.close()
63+
64+
5665
def create_app(env_name='prod', config=None):
5766
# rendering is handled by MessageMiddleware
5867
ui_routes = (PUBLIC_UI_ROUTES + JUROR_UI_ROUTES
@@ -68,7 +77,13 @@ def create_app(env_name='prod', config=None):
6877
config = load_env_config(env_name=env_name)
6978
print('== loaded config file: %s' % (config['__file__'],))
7079

71-
engine = create_engine(config.get('db_url', DEFAULT_DB_URL), pool_recycle=60)
80+
db_url = config.get('db_url', DEFAULT_DB_URL)
81+
engine = create_engine(db_url, pool_recycle=60)
82+
83+
if 'sqlite' in db_url:
84+
event.listen(engine, 'connect', set_sqlite_pragma)
85+
elif 'mysql' in db_url:
86+
event.listen(engine, 'engine_connect', set_mysql_session_charset_and_collation)
7287
session_type = sessionmaker()
7388
session_type.configure(bind=engine)
7489
tmp_rdb_session = session_type()
@@ -122,6 +137,8 @@ def get_engine():
122137

123138
if 'mysql' in db_url:
124139
event.listen(engine, 'engine_connect', set_mysql_session_charset_and_collation)
140+
elif 'sqlite' in db_url:
141+
event.listen(engine, 'connect', set_sqlite_pragma)
125142

126143
return engine
127144

0 commit comments

Comments
 (0)