in aws_advanced_python_wrapper/read_write_splitting_plugin.py [0:0]
def _switch_connection_if_required(self, read_only: bool):
current_conn = self._plugin_service.current_connection
driver_dialect = self._plugin_service.driver_dialect
if (current_conn is not None and
driver_dialect is not None and driver_dialect.is_closed(current_conn)):
self._log_and_raise_exception("ReadWriteSplittingPlugin.SetReadOnlyOnClosedConnection")
if current_conn is not None and driver_dialect.can_execute_query(current_conn):
try:
self._plugin_service.refresh_host_list()
except Exception:
pass # Swallow exception
hosts = self._plugin_service.hosts
if hosts is None or len(hosts) == 0:
self._log_and_raise_exception("ReadWriteSplittingPlugin.EmptyHostList")
current_host = self._plugin_service.current_host_info
if current_host is None:
self._log_and_raise_exception("ReadWriteSplittingPlugin.UnavailableHostInfo")
return
if read_only:
if not self._plugin_service.is_in_transaction and current_host.role != HostRole.READER:
try:
self._switch_to_reader_connection(hosts)
except Exception:
if not self._is_connection_usable(current_conn, driver_dialect):
self._log_and_raise_exception("ReadWriteSplittingPlugin.ErrorSwitchingToReader")
return
logger.warning("ReadWriteSplittingPlugin.FallbackToWriter", current_host.url)
elif current_host.role != HostRole.WRITER:
if self._plugin_service.is_in_transaction:
self._log_and_raise_exception("ReadWriteSplittingPlugin.SetReadOnlyFalseInTransaction")
try:
self._switch_to_writer_connection(hosts)
except Exception:
self._log_and_raise_exception("ReadWriteSplittingPlugin.ErrorSwitchingToWriter")