summaryrefslogtreecommitdiff
path: root/oslo_db/sqlalchemy
diff options
context:
space:
mode:
authorZuul <zuul@review.openstack.org>2018-02-20 22:02:00 +0000
committerGerrit Code Review <review@openstack.org>2018-02-20 22:02:00 +0000
commit9c6695969f6502f52bc86f22af0758715fdc57c0 (patch)
tree0527a231b8b10eb33a74d9875c8227f960dcf8c6 /oslo_db/sqlalchemy
parentddfd6e7aae3a6e9d155813134d4a8cb5a5a01b98 (diff)
parent9993efdeef4606f78182d084e4120a158a4e64b8 (diff)
downloadoslo-db-9c6695969f6502f52bc86f22af0758715fdc57c0.tar.gz
Merge "Allow connection query string to be passed separately."
Diffstat (limited to 'oslo_db/sqlalchemy')
-rw-r--r--oslo_db/sqlalchemy/enginefacade.py6
-rw-r--r--oslo_db/sqlalchemy/engines.py20
2 files changed, 24 insertions, 2 deletions
diff --git a/oslo_db/sqlalchemy/enginefacade.py b/oslo_db/sqlalchemy/enginefacade.py
index 1617ebb..db7bdcf 100644
--- a/oslo_db/sqlalchemy/enginefacade.py
+++ b/oslo_db/sqlalchemy/enginefacade.py
@@ -149,7 +149,8 @@ class _TransactionFactory(object):
'thread_checkin': _Default(True),
'json_serializer': _Default(None),
'json_deserializer': _Default(None),
- 'logging_name': _Default(None)
+ 'logging_name': _Default(None),
+ 'connection_parameters': _Default(None)
}
self._maker_cfg = {
'expire_on_commit': _Default(False),
@@ -219,6 +220,9 @@ class _TransactionFactory(object):
:param connection_debug: engine logging level, defaults to 0. set to
50 for INFO, 100 for DEBUG.
+ :param connection_parameters: additional parameters to append onto the
+ database URL query string, pass as "param1=value1&param2=value2&..."
+
:param max_pool_size: max size of connection pool, uses CONF for
default
diff --git a/oslo_db/sqlalchemy/engines.py b/oslo_db/sqlalchemy/engines.py
index 2808ef4..05045ca 100644
--- a/oslo_db/sqlalchemy/engines.py
+++ b/oslo_db/sqlalchemy/engines.py
@@ -104,6 +104,21 @@ def _setup_logging(connection_debug=0):
logger.setLevel(logging.WARNING)
+def _extend_url_parameters(url, connection_parameters):
+ for key, value in six.moves.urllib.parse.parse_qs(
+ connection_parameters).items():
+ if key in url.query:
+ existing = url.query[key]
+ if not isinstance(existing, list):
+ url.query[key] = existing = utils.to_list(existing)
+ existing.extend(value)
+ value = existing
+ else:
+ url.query[key] = value
+ if len(value) == 1:
+ url.query[key] = value[0]
+
+
def _vet_url(url):
if "+" not in url.drivername and not url.drivername.startswith("sqlite"):
if url.drivername.startswith("mysql"):
@@ -132,11 +147,14 @@ def create_engine(sql_connection, sqlite_fk=False, mysql_sql_mode=None,
connection_trace=False, max_retries=10, retry_interval=10,
thread_checkin=True, logging_name=None,
json_serializer=None,
- json_deserializer=None):
+ json_deserializer=None, connection_parameters=None):
"""Return a new SQLAlchemy engine."""
url = sqlalchemy.engine.url.make_url(sql_connection)
+ if connection_parameters:
+ _extend_url_parameters(url, connection_parameters)
+
_vet_url(url)
engine_args = {