summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIrina Truong <i.chernyavska@gmail.com>2017-08-13 17:21:42 -0700
committerGitHub <noreply@github.com>2017-08-13 17:21:42 -0700
commit1e77eab21b8e3b6592007123bf1daec759bdb5e5 (patch)
tree8ee30c5d7069d6f0049e5af2b454681436751cae
parentc69d4c200ace6304767289bc72654a381779e7c7 (diff)
parent902fe94f3cd47b1750e422509767971cedf66a54 (diff)
Merge pull request #773 from dbcli/fpietka/conninfo
Add \conninfo command
-rw-r--r--changelog.rst1
-rwxr-xr-xpgcli/main.py31
-rw-r--r--pgcli/pgexecute.py19
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"""