def __handle_lost_db_connection(t, v, tb): if t not in [gmPG2.dbapi.OperationalError, gmPG2.dbapi.InterfaceError]: return False try: msg = gmPG2.extract_msg_from_pg_exception(exc = v) except: msg = u'cannot extract message from PostgreSQL exception' print msg print v return False conn_lost = False if t == gmPG2.dbapi.OperationalError: conn_lost = ( ('erver' in msg) and ( ('term' in msg) or ('abnorm' in msg) or ('end' in msg) or ('oute' in msg) ) ) if t == gmPG2.dbapi.InterfaceError: conn_lost = ( ('onnect' in msg) and (('close' in msg) or ('end' in msg)) ) if not conn_lost: return False gmLog2.log_stack_trace('lost connection', t, v, tb) wx.EndBusyCursor() gmLog2.flush() gmGuiHelpers.gm_show_error ( aTitle = _('Lost connection'), aMessage = _( 'Since you were last working in GNUmed,\n' 'your database connection timed out.\n' '\n' 'This GNUmed session is now expired.\n' '\n' 'You will have to close this client and\n' 'restart a new GNUmed session.' ) ) return True
def __handle_lost_db_connection(t, v, tb): if t not in [gmPG2.dbapi.OperationalError, gmPG2.dbapi.InterfaceError]: return False try: msg = gmPG2.extract_msg_from_pg_exception(exc=v) except: msg = u"cannot extract message from PostgreSQL exception" print msg print v return False conn_lost = False if t == gmPG2.dbapi.OperationalError: conn_lost = ("erver" in msg) and (("term" in msg) or ("abnorm" in msg) or ("end" in msg) or ("oute" in msg)) if t == gmPG2.dbapi.InterfaceError: conn_lost = ("onnect" in msg) and (("close" in msg) or ("end" in msg)) if not conn_lost: return False gmLog2.log_stack_trace("lost connection", t, v, tb) wx.EndBusyCursor() gmLog2.flush() gmGuiHelpers.gm_show_error( aTitle=_("Lost connection"), aMessage=_( "Since you were last working in GNUmed,\n" "your database connection timed out.\n" "\n" "This GNUmed session is now expired.\n" "\n" "You will have to close this client and\n" "restart a new GNUmed session." ), ) return True
def connect_to_database(login_info=None, max_attempts=3, expected_version=None, require_version=True): """Display the login dialog and try to log into the backend. - up to max_attempts times - returns True/False """ # force programmer to set a valid expected_version expected_hash = gmPG2.known_schema_hashes[expected_version] client_version = _cfg.get(option=u'client_version') global current_db_name current_db_name = u'gnumed_v%s' % expected_version attempt = 0 while attempt < max_attempts: _log.debug('login attempt %s of %s', (attempt + 1), max_attempts) connected = False login = login_info if login is None: _log.info("did not provide a login information") # try getting a connection to verify the DSN works dsn = gmPG2.make_psycopg2_dsn(database=login.database, host=login.host, port=login.port, user=login.user, password=login.password) try: conn = gmPG2.get_raw_connection(dsn=dsn, verbose=True, readonly=True) connected = True except gmPG2.cAuthenticationError, e: attempt += 1 _log.error(u"login attempt failed: %s", e) if attempt < max_attempts: if (u'host=127.0.0.1' in (u'%s' % e)) or (u'host=' not in (u'%s' % e)): msg = _( 'Unable to connect to database:\n\n' '%s\n\n' "Are you sure you have got a local database installed ?\n" '\n' "Please retry with proper credentials or cancel.\n" '\n' 'You may also need to check the PostgreSQL client\n' 'authentication configuration in pg_hba.conf. For\n' 'details see:\n' '\n' 'wiki.gnumed.de/bin/view/Gnumed/ConfigurePostgreSQL') else: msg = _( "Unable to connect to database:\n\n" "%s\n\n" "Please retry with proper credentials or cancel.\n" "\n" 'You may also need to check the PostgreSQL client\n' 'authentication configuration in pg_hba.conf. For\n' 'details see:\n' '\n' 'wiki.gnumed.de/bin/view/Gnumed/ConfigurePostgreSQL') msg = msg % e msg = regex.sub( r'password=[^\s]+', u'password=%s' % gmTools.u_replacement_character, msg) gmGuiHelpersWeb.gm_show_error(msg, _('Connecting to backend')) del e continue except gmPG2.dbapi.OperationalError, e: _log.error(u"login attempt failed: %s", e) msg = _( "Unable to connect to database:\n\n" "%s\n\n" "Please retry another backend / user / password combination !\n" ) % gmPG2.extract_msg_from_pg_exception(e) msg = regex.sub(r'password=[^\s]+', u'password=%s' % gmTools.u_replacement_character, msg) gmGuiHelpersWeb.gm_show_error(msg, _('Connecting to backend')) del e continue
def connect_to_database(login_info=None, max_attempts=3, expected_version=None, require_version=True): """Display the login dialog and try to log into the backend. - up to max_attempts times - returns True/False """ from Gnumed.pycommon import gmPG2 # force programmer to set a valid expected_version expected_hash = gmPG2.known_schema_hashes[expected_version] client_version = _cfg.get(option = u'client_version') global current_db_name current_db_name = u'gnumed_v%s' % expected_version attempt = 0 while attempt < max_attempts: _log.debug('login attempt %s of %s', (attempt+1), max_attempts) connected = False login = login_info if login is None: _log.info("did not provide a login information") # try getting a connection to verify the DSN works dsn = gmPG2.make_psycopg2_dsn ( database = login.database, host = login.host, port = login.port, user = login.user, password = login.password ) try: #conn = gmPG2.get_raw_connection(dsn = dsn, verbose = True, readonly = True) conn = gmPG2.get_raw_connection(dsn = dsn, verbose = True, readonly = True) connected = True except gmPG2.cAuthenticationError, e: attempt += 1 _log.error(u"login attempt failed: %s", e) if attempt < max_attempts: if (u'host=127.0.0.1' in (u'%s' % e)) or (u'host=' not in (u'%s' % e)): msg = _( 'Unable to connect to database:\n\n' '%s\n\n' "Are you sure you have got a local database installed ?\n" '\n' "Please retry with proper credentials or cancel.\n" '\n' 'You may also need to check the PostgreSQL client\n' 'authentication configuration in pg_hba.conf. For\n' 'details see:\n' '\n' 'wiki.gnumed.de/bin/view/Gnumed/ConfigurePostgreSQL' ) else: msg = _( "Unable to connect to database:\n\n" "%s\n\n" "Please retry with proper credentials or cancel.\n" "\n" 'You may also need to check the PostgreSQL client\n' 'authentication configuration in pg_hba.conf. For\n' 'details see:\n' '\n' 'wiki.gnumed.de/bin/view/Gnumed/ConfigurePostgreSQL' ) msg = msg % e msg = re.sub(r'password=[^\s]+', u'password=%s' % gmTools.u_replacement_character, msg) gmGuiHelpers.gm_show_error ( msg, _('Connecting to backend') ) del e continue except gmPG2.dbapi.OperationalError, e: _log.error(u"login attempt failed: %s", e) msg = _( "Unable to connect to database:\n\n" "%s\n\n" "Please retry another backend / user / password combination !\n" ) % gmPG2.extract_msg_from_pg_exception(e) msg = re.sub(r'password=[^\s]+', u'password=%s' % gmTools.u_replacement_character, msg) gmGuiHelpers.gm_show_error ( msg, _('Connecting to backend') ) del e continue