diff options
author | Irina Truong <i.chernyavska@gmail.com> | 2017-08-13 17:21:42 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-08-13 17:21:42 -0700 |
commit | 1e77eab21b8e3b6592007123bf1daec759bdb5e5 (patch) | |
tree | 8ee30c5d7069d6f0049e5af2b454681436751cae | |
parent | c69d4c200ace6304767289bc72654a381779e7c7 (diff) | |
parent | 902fe94f3cd47b1750e422509767971cedf66a54 (diff) |
Merge pull request #773 from dbcli/fpietka/conninfo
Add \conninfo command
-rw-r--r-- | changelog.rst | 1 | ||||
-rwxr-xr-x | pgcli/main.py | 31 | ||||
-rw-r--r-- | pgcli/pgexecute.py | 19 |
3 files changed, 47 insertions, 4 deletions
diff --git a/changelog.rst b/changelog.rst index 98050104..ed0a4990 100644 --- a/changelog.rst +++ b/changelog.rst @@ -8,6 +8,7 @@ Features: * Improved formatting of arrays in output (Thanks: `Joakim Koljonen`_) * Don't quote identifiers that are non-reserved keywords. (Thanks: `Joakim Koljonen`_) * Remove the ``...`` in the continuation prompt and use empty space instead. (Thanks: `Amjith Ramanujam`_) +* Add \conninfo and handle more parameters with \c (issue #716) (Thanks: `François Pietka`_) Bug Fixes: ---------- diff --git a/pgcli/main.py b/pgcli/main.py index 5bd883b5..57e0beff 100755 --- a/pgcli/main.py +++ b/pgcli/main.py @@ -205,16 +205,41 @@ class PGCli(object): 'Execute commands from file.') self.pgspecial.register(self.write_to_file, '\\o', '\\o [filename]', 'Send all query results to file.') + self.pgspecial.register(self.info_connection, '\\conninfo', + '\\conninfo', 'Get connection details') + + def info_connection(self, **_): + if self.pgexecute.host.startswith('/'): + host = 'socket "%s"' % self.pgexecute.host + else: + host = 'host "%s"' % self.pgexecute.host + + yield (None, None, None, 'You are connected to database "%s" as user ' + '"%s" on %s at port "%s".' % (self.pgexecute.dbname, + self.pgexecute.user, + host, + self.pgexecute.port)) def change_db(self, pattern, **_): if pattern: - db = pattern[1:-1] if pattern[0] == pattern[-1] == '"' else pattern - self.pgexecute.connect(database=db) + # Get all the parameters in pattern, handling double quotes if any. + infos = re.findall(r'"[^"]*"|[^"\'\s]+', pattern) + # Now removing quotes. + list(map(lambda s: s.strip('"'), infos)) + + infos.extend([None] * (4 - len(infos))) + db, user, host, port = infos + try: + self.pgexecute.connect(database=db, user=user, host=host, + port=port) + except OperationalError as e: + click.secho(str(e), err=True, fg='red') + click.echo("Previous connection kept") else: self.pgexecute.connect() yield (None, None, None, 'You are now connected to database "%s" as ' - 'user "%s"' % (self.pgexecute.dbname, self.pgexecute.user)) + 'user "%s"' % (self.pgexecute.dbname, self.pgexecute.user)) def execute_from_file(self, pattern, **_): if not pattern: diff --git a/pgcli/pgexecute.py b/pgcli/pgexecute.py index 8f267d38..1b20e52c 100644 --- a/pgcli/pgexecute.py +++ b/pgcli/pgexecute.py @@ -156,6 +156,12 @@ class PGExecute(object): FROM pg_catalog.pg_database d ORDER BY 1''' + socket_directory_query = ''' + SELECT setting + FROM pg_settings + WHERE name = 'unix_socket_directories' + ''' + def __init__(self, database, user, password, host, port, dsn, **kwargs): self.dbname = database self.user = user @@ -215,6 +221,9 @@ class PGExecute(object): self.host = host self.port = port + if not self.host: + self.host = self.get_socket_directory() + cursor.execute("SHOW ALL") db_parameters = dict(name_val_desc[:2] for name_val_desc in cursor.fetchall()) @@ -336,7 +345,8 @@ class PGExecute(object): """ return (isinstance(e, psycopg2.OperationalError) and - psycopg2.errorcodes.lookup(e.pgcode) != 'LOCK_NOT_AVAILABLE') + (not e.pgcode or + psycopg2.errorcodes.lookup(e.pgcode) != 'LOCK_NOT_AVAILABLE')) def execute_normal_sql(self, split_sql): """Returns tuple (title, rows, headers, status)""" @@ -491,6 +501,13 @@ class PGExecute(object): headers = [x[0] for x in cur.description] return cur.fetchall(), headers, cur.statusmessage + def get_socket_directory(self): + with self.conn.cursor() as cur: + _logger.debug('Socket directory Query. sql: %r', + self.socket_directory_query) + cur.execute(self.socket_directory_query) + return cur.fetchone()[0] + def foreignkeys(self): """Yields ForeignKey named tuples""" |