Add postgres utils command completion
This allows to tab complete eg. database names. Source: https://github.com/zsh-users/zsh-completions/blob/master/src/_pgsql_utils
This commit is contained in:
parent
1b7a3ea99a
commit
d07ecf7067
404
plugins/postgres/_postgres
Normal file
404
plugins/postgres/_postgres
Normal file
@ -0,0 +1,404 @@
|
|||||||
|
#compdef psql pg_dump pg_dumpall createdb dropdb vacuumdb createuser dropuser initdb
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# Description
|
||||||
|
# -----------
|
||||||
|
#
|
||||||
|
# Completion script for PostgreSQL utils (http://postgresql.org).
|
||||||
|
#
|
||||||
|
# Source: http://www.zsh.org/mla/users/2004/msg01006.html
|
||||||
|
#
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# Authors
|
||||||
|
# -------
|
||||||
|
#
|
||||||
|
# * Dominic Mitchell <dom+zsh@happygiraffe.net>
|
||||||
|
#
|
||||||
|
# * Johann 'Myrkraverk' Oskarsson <johann@2ndquadrant.com>
|
||||||
|
#
|
||||||
|
# * Daniel Serodio <dserodio@gmail.com> pg_dumpall completion
|
||||||
|
#
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
_pgsql_get_identity () {
|
||||||
|
_pgsql_user=${(v)opt_args[(i)-U|--username]}
|
||||||
|
_pgsql_port=${(v)opt_args[(i)-p|--port]}
|
||||||
|
_pgsql_host=${(v)opt_args[(i)-h|--host]}
|
||||||
|
|
||||||
|
_pgsql_params=(
|
||||||
|
${_pgsql_user:+"--username=$_pgsql_user"}
|
||||||
|
${_pgsql_port:+"--port=$_pgsql_port"}
|
||||||
|
${_pgsql_host:+"--host=$_pgsql_host"}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Postgres Allows specifying the path to the directory containing the
|
||||||
|
# socket as well as a hostname.
|
||||||
|
_pgsql_host_or_dir() {
|
||||||
|
_alternative \
|
||||||
|
'hosts:host:_hosts' \
|
||||||
|
'directories:directory:_directories'
|
||||||
|
}
|
||||||
|
|
||||||
|
# This creates a port completion list based on socket files on the
|
||||||
|
# local computer. Be default, Postgres puts them in /tmp/ but Debian
|
||||||
|
# changed that to /var/run/postgresql/ in their packages.
|
||||||
|
_pgsql_ports() {
|
||||||
|
compadd "$@" - /tmp/.s.PGSQL.<->(N:e) /var/run/postgresql/.s.PGSQL.<->(N:e)
|
||||||
|
}
|
||||||
|
|
||||||
|
_pgsql_users () {
|
||||||
|
local _pgsql_user _pgsql_port _pgsql_host _pgsql_params
|
||||||
|
local _pgsql_user_sql
|
||||||
|
_pgsql_get_identity
|
||||||
|
|
||||||
|
# We use _pgsql_port and _pgsql_host directly here instead of
|
||||||
|
# _pgsql_params so as to not pick up a partially completed
|
||||||
|
# username.
|
||||||
|
_pgsql_params=(
|
||||||
|
${_pgsql_port:+"--port=$_pgsql_port"}
|
||||||
|
${_pgsql_host:+"--host=$_pgsql_host"}
|
||||||
|
)
|
||||||
|
|
||||||
|
_pgsql_user_sql='select r.rolname from pg_catalog.pg_roles r where r.rolcanlogin = true'
|
||||||
|
|
||||||
|
compadd "$@" - $( psql $_pgsql_params[@] -Aqt -c $_pgsql_user_sql template1 2>/dev/null )
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
_pgsql_tables () {
|
||||||
|
local _pgsql_user _pgsql_port _pgsql_host _pgsql_params
|
||||||
|
_pgsql_get_identity
|
||||||
|
|
||||||
|
# Need to pull out the database name from the existing arguments.
|
||||||
|
# This is going to vary between commands. Thankfully, it's only
|
||||||
|
# used by pg_dump, which always has the dbname in arg1. If it's
|
||||||
|
# not present it defaults to ${PGDATABASE:-$LOGNAME}, which
|
||||||
|
# matches (I think) the PostgreSQL behaviour.
|
||||||
|
|
||||||
|
local db
|
||||||
|
db=${line[1]:-${PGDATABASE:-$LOGNAME}}
|
||||||
|
|
||||||
|
## Instead of parsing the output of the psql \ commands, we look
|
||||||
|
## up the tables ourselves. The following query has been tested
|
||||||
|
## with Postgres 8.2 - 9.2.
|
||||||
|
|
||||||
|
local _pgsql_table_sql
|
||||||
|
_pgsql_table_sql="select n.nspname || '.' || c.relname \
|
||||||
|
from pg_catalog.pg_class c \
|
||||||
|
left join pg_catalog.pg_namespace n on n.oid = c.relnamespace \
|
||||||
|
where c.relkind in ('r', '') \
|
||||||
|
and n.nspname <> 'pg_catalog' \
|
||||||
|
and n.nspname <> 'information_schema' \
|
||||||
|
and n.nspname !~ '^pg_toast' \
|
||||||
|
and pg_catalog.pg_table_is_visible( c.oid ) \
|
||||||
|
order by 1"
|
||||||
|
|
||||||
|
compadd "$@" - \
|
||||||
|
$( psql $_pgsql_params[@] -Aqt -c $_pgsql_table_sql $db 2>/dev/null )
|
||||||
|
}
|
||||||
|
|
||||||
|
_pgsql_schemas () {
|
||||||
|
local _pgsql_user _pgsql_port _pgsql_host _pgsql_params
|
||||||
|
_pgsql_get_identity
|
||||||
|
|
||||||
|
local db
|
||||||
|
db=${line[1]:-${PGDATABASE:-$LOGNAME}}
|
||||||
|
|
||||||
|
local _pgsql_schema_sql="select n.nspname \
|
||||||
|
from pg_catalog.pg_namespace n \
|
||||||
|
where n.nspname !~ '^pg_' \
|
||||||
|
and n.nspname <> 'information_schema' \
|
||||||
|
order by 1;"
|
||||||
|
|
||||||
|
compadd "$@" - \
|
||||||
|
$( psql $_pgsql_params[@] -Aqt -c $_pgsql_schema_sql $db 2>/dev/null )
|
||||||
|
}
|
||||||
|
|
||||||
|
_pgsql_databases () {
|
||||||
|
local _pgsql_user _pgsql_port _pgsql_host _pgsql_params
|
||||||
|
_pgsql_get_identity
|
||||||
|
|
||||||
|
local _pgsql_db_sql
|
||||||
|
_pgsql_db_sql="select d.datname from pg_catalog.pg_database d \
|
||||||
|
where d.datname <> 'template0'"
|
||||||
|
|
||||||
|
compadd "$@" - $( psql $_pgsql_params[@] -Atq -c $_pgsql_db_sql template1 2>/dev/null )
|
||||||
|
}
|
||||||
|
|
||||||
|
_pgsql_encodings () {
|
||||||
|
local _pgsql_user
|
||||||
|
_pgsql_get_identity
|
||||||
|
|
||||||
|
local _pgsql_db_sql
|
||||||
|
_pgsql_db_sql="select pg_encoding_to_char(i) from generate_series(0,100) i;"
|
||||||
|
|
||||||
|
compadd "$@" - $( psql $_pgsql_params[@] -Atq -c $_pgsql_db_sql template1 )
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
## The actual completion code for the commands
|
||||||
|
##
|
||||||
|
|
||||||
|
_psql () {
|
||||||
|
local curcontext="$curcontext" state line expl
|
||||||
|
typeset -A opt_args
|
||||||
|
|
||||||
|
_arguments -C -s "-*" \
|
||||||
|
"$_pgsql_common_opts[@]" \
|
||||||
|
{-V,--version}'[display client version]' \
|
||||||
|
{-a,--echo-all}'[print commands read]' \
|
||||||
|
{-A,--no-align}'[unaligned output mode]' \
|
||||||
|
{-c+,--command=}':execute SQL command:' \
|
||||||
|
{-d+,--dbname=}':database to connect to:_pgsql_databases' \
|
||||||
|
{-e,--echo-queries}'[display queries submitted]' \
|
||||||
|
{-E,--echo-hidden}'[display hidden queries]' \
|
||||||
|
{-f+,--file=}':SQL file to read:_files' \
|
||||||
|
{-F+,--field-separator=}':field separator char:' \
|
||||||
|
{-H,--html}'[HTML output]' \
|
||||||
|
{-l,--list}'[list databases]' \
|
||||||
|
{-o+,--output=}':query output:_files' \
|
||||||
|
{-P+,--pset=}':set psql variable:' \
|
||||||
|
{-q,--quiet}'[non verbose mode]' \
|
||||||
|
{-R+,--record-separator=}':record separator char:' \
|
||||||
|
{-s,--single-step}'[prompt before each query]' \
|
||||||
|
{-S,--single-line}'[newline sends query]' \
|
||||||
|
{-t,--tuples-only}'[dont display header/footer]' \
|
||||||
|
{-T+,--table-attr=}':HTML table options:' \
|
||||||
|
-u'[prompt for username/password]' \
|
||||||
|
{-v+,--set=,--variable=}':set SQL variable:' \
|
||||||
|
{-x,--expanded}'[one column per line]' \
|
||||||
|
{-X,--no-psqlrc}'[dont read ~/.psqlrc]' \
|
||||||
|
':PostgreSQL database:_pgsql_databases' \
|
||||||
|
':PostgreSQL user:_pgsql_users'
|
||||||
|
}
|
||||||
|
|
||||||
|
_pg_dump () {
|
||||||
|
local curcontext="$curcontext" state line expl
|
||||||
|
typeset -A opt_args
|
||||||
|
|
||||||
|
_arguments -C -s \
|
||||||
|
"$_pgsql_common_opts[@]" \
|
||||||
|
{-a,--data-only}'[dump only data]' \
|
||||||
|
{-b,--blobs}'[dump blobs as well]' \
|
||||||
|
{-c,--clean}'[include clean cmds in dump]' \
|
||||||
|
{-C,--create}'[include createdb cmds in dump]' \
|
||||||
|
{-E+,--encoding=}':database encoding:_pgsql_encodings' \
|
||||||
|
{-d,--inserts}'[use INSERT not COPY]' \
|
||||||
|
{-D,--{attribute,column}-inserts}'[use INSERT (cols) not COPY]' \
|
||||||
|
{-f+,--file=}':output file:_files' \
|
||||||
|
{-F+,--format=}':output format:_values "format" "p[plain text]" "t[tar]" "c[custom]"' \
|
||||||
|
{-i,--ignore-version}'[ignore version mismatch]' \
|
||||||
|
{-n+,--schema=}':schema to dump:_pgsql_schemas' \
|
||||||
|
{-N+,--exclude-schema=}':schema to NOT dump:_pgsql_schemas' \
|
||||||
|
{-o,--oids}'[dump objects identifiers for every table]' \
|
||||||
|
{-O,--no-owner}'[dont recreate as same owner]' \
|
||||||
|
{-R,--no-reconnect}'[dont output connect]' \
|
||||||
|
{-s,--schema-only}'[no data, only schema]' \
|
||||||
|
{-S+,--superuser=}':superuser name:_pgsql_users' \
|
||||||
|
{-t+,--table=}':table to dump:_pgsql_tables' \
|
||||||
|
{-T+,--exclude-table=}':table to NOT dump:_pgsql_tables' \
|
||||||
|
{-v,--verbose}'[verbose mode]' \
|
||||||
|
{-V,--version}'[display client version]' \
|
||||||
|
{-x,--no-{acl,privileges}}'[dont dump ACLs]' \
|
||||||
|
-X+':option:_values "option" use-set-session-authorization disable-triggers' \
|
||||||
|
{-Z+,--compress=}':compression level:_values "level" 9 8 7 6 5 4 3 2 1 0' \
|
||||||
|
':PostgreSQL database:_pgsql_databases' \
|
||||||
|
--section=':dump named section:_values "section" pre-data data post-data' \
|
||||||
|
--disable-dollar-quoting'[disable dollar quoting, use SQL standard quoting]' \
|
||||||
|
--disable-triggers'[disable triggers during data-only restore]' \
|
||||||
|
--no-security-labels'[do not dump security label assignments]' \
|
||||||
|
--no-tablespaces'[do not dump tablespace assignments]' \
|
||||||
|
--no-unlogged-table-data'[do not dump unlogged table data]' \
|
||||||
|
--quote-all-identifiers'[quote all identifiers, even if not key words]' \
|
||||||
|
--serializable-deferrable'[wait until the dump can run without anomalies]' \
|
||||||
|
--use-set-session-authorization'[use SET SESSION AUTHORIZATION commands instead of ALTER OWNER]'
|
||||||
|
}
|
||||||
|
|
||||||
|
_pg_dumpall () {
|
||||||
|
local curcontext="$curcontext" state line expl
|
||||||
|
typeset -A opt_args
|
||||||
|
|
||||||
|
_arguments -C -s \
|
||||||
|
"$_pgsql_common_opts[@]" \
|
||||||
|
{-a,--data-only}'[dump only data]' \
|
||||||
|
{-c,--clean}'[include clean (drop) cmds brefore recreating]' \
|
||||||
|
{-g,--globals-only}'[dump only global objects, no databases]' \
|
||||||
|
{-f+,--file=}':output file:_files' \
|
||||||
|
{-o,--oids}'[dump objects identifiers for every table]' \
|
||||||
|
{-O,--no-owner}'[dont recreate as same owner]' \
|
||||||
|
{-r,--roles-only}'[no databases or tablespaces, only roles]' \
|
||||||
|
{-s,--schema-only}'[no data, only schema]' \
|
||||||
|
{-S+,--superuser=}':superuser name:_pgsql_users' \
|
||||||
|
{-t,--tablespaces-only}'[no databases or roles, only tablespaces]' \
|
||||||
|
{-x,--no-privileges}'[dont dump ACLs]' \
|
||||||
|
--binary-upgrade'[for use by upgrade utilities only]' \
|
||||||
|
--column-inserts'[use INSERT with column names not COPY]' \
|
||||||
|
--disable-dollar-quoting'[disable dollar quoting, use SQL standard quoting]' \
|
||||||
|
--disable-triggers'[disable triggers during data-only restore]' \
|
||||||
|
--inserts'[use INSERT not COPY]' \
|
||||||
|
--no-security-labels'[do not dump security label assignments]' \
|
||||||
|
--no-tablespaces'[do not dump tablespace assignments]' \
|
||||||
|
--no-unlogged-table-data'[do not dump unlogged table data]' \
|
||||||
|
--quote-all-identifiers'[quote all identifiers, even if not key words]' \
|
||||||
|
--use-set-session-authorization'[use SET SESSION AUTHORIZATION cmds instead of ALTER OWNER]'
|
||||||
|
}
|
||||||
|
|
||||||
|
_createdb () {
|
||||||
|
local curcontext="$curcontext" state line expl
|
||||||
|
typeset -A opt_args
|
||||||
|
|
||||||
|
_arguments -C -s \
|
||||||
|
"$_pgsql_common_opts[@]" \
|
||||||
|
{-e,--echo}'[display SQL queries]' \
|
||||||
|
{-q,--quiet}'[non verbose mode]' \
|
||||||
|
{-D+,--location=}':database location:_directories' \
|
||||||
|
{-T+,--template=}':database template:_pgsql_databases' \
|
||||||
|
{-E+,--encoding=}':database encoding:_pgsql_encodings' \
|
||||||
|
':PostgreSQL database:' \
|
||||||
|
':comment:'
|
||||||
|
}
|
||||||
|
|
||||||
|
_dropdb () {
|
||||||
|
local curcontext="$curcontext" state line expl
|
||||||
|
typeset -A opt_args
|
||||||
|
|
||||||
|
_arguments -C -s \
|
||||||
|
"$_pgsql_common_opts[@]" \
|
||||||
|
{-e,--echo}'[display SQL queries]' \
|
||||||
|
{-q,--quiet}'[non verbose mode]' \
|
||||||
|
{-i,--interactive}'[confirm before drop]' \
|
||||||
|
':PostgreSQL database:_pgsql_databases'
|
||||||
|
}
|
||||||
|
|
||||||
|
_vacuumdb () {
|
||||||
|
local curcontext="$curcontext" state line expl
|
||||||
|
typeset -A opt_args
|
||||||
|
|
||||||
|
_arguments -C -s \
|
||||||
|
"$_pgsql_common_opts[@]" \
|
||||||
|
{-a,--all}'[vacuum all databases]' \
|
||||||
|
{-d+,--dbname=}':database to connect to:_pgsql_databases' \
|
||||||
|
{-t+,--table=}':table to dump:_pgsql_tables' \
|
||||||
|
{-f,--full}'[do full vacuuming]' \
|
||||||
|
{-z,--analyze}'[update optimizer hints]' \
|
||||||
|
{-e,--echo}'[show the commands being sent to the server]' \
|
||||||
|
{-q,--quiet}'[do not write any messages]' \
|
||||||
|
{-v,--verbose}'[write a lot of output]' \
|
||||||
|
'--help[show this help, then exit]' \
|
||||||
|
'--version[output version information, then exit]' \
|
||||||
|
'1:PostgreSQL database:_pgsql_databases'
|
||||||
|
}
|
||||||
|
|
||||||
|
_createuser () {
|
||||||
|
local curcontext="$curcontext" state line expl
|
||||||
|
typeset -A opt_args
|
||||||
|
|
||||||
|
_arguments -C -s \
|
||||||
|
"$_pgsql_common_opts[@]" \
|
||||||
|
{-e,--echo}'[display SQL queries]' \
|
||||||
|
{-c,--connection-limit=}'[connection limit for role (default: no limit)]' \
|
||||||
|
{-d,--createdb}'[role can create new databases]' \
|
||||||
|
{-D,--no-createdb}'[role cannot create databases]' \
|
||||||
|
{-E,--encrypted}'[encrypt stored password]' \
|
||||||
|
{-i,--inherit}'[role inherits privileges of roles it is a member of (default)]' \
|
||||||
|
{-I,--no-inherit}'[role does not inherit privileges]' \
|
||||||
|
{-l,--login}'[role can login (default)]' \
|
||||||
|
{-L,--no-login}'[role cannot login]' \
|
||||||
|
{-N,--unencrypted}'[do not encrypt stored password]' \
|
||||||
|
{-P,--pwprompt}'[assign a password to new role]' \
|
||||||
|
{-r,--createrole}'[role can create new roles]' \
|
||||||
|
{-R,--no-createrole}'[role cannot create roles]' \
|
||||||
|
{-s,--superuser}'[role will be superuser]' \
|
||||||
|
{-S,--no-superuser}'[role will not be superuser]'
|
||||||
|
}
|
||||||
|
|
||||||
|
_dropuser () {
|
||||||
|
local curcontext="$curcontext" state line expl
|
||||||
|
typeset -A opt_args
|
||||||
|
|
||||||
|
_arguments -C -s \
|
||||||
|
"$_pgsql_common_opts[@]" \
|
||||||
|
{-e,--echo}'[display SQL queries]' \
|
||||||
|
{-q,--quiet}'[non verbose mode]' \
|
||||||
|
{-i,--interactive}'[confirm before drop]' \
|
||||||
|
':PostgreSQL user:_pgsql_users'
|
||||||
|
}
|
||||||
|
|
||||||
|
_initdb () {
|
||||||
|
local curcontext="$curcontext" state line expl
|
||||||
|
typeset -A opt_args
|
||||||
|
|
||||||
|
_arguments -C -s \
|
||||||
|
{--auth=,-A+}':default authentication method for local connections:_values "auth methods" $_pgsql_auth_methods[@]' \
|
||||||
|
{-D+,--pgdata=}':location for this database cluster:_files' \
|
||||||
|
{-E+,--encoding=}':set default encoding for new databases:' \
|
||||||
|
--locale=':set default locale for new databases:' \
|
||||||
|
--lc-collate=':set the default locale for collate:' \
|
||||||
|
--lc-ctype=':set the default locale for ctype:' \
|
||||||
|
--lc-messages=':set the default locale for messages:' \
|
||||||
|
--lc-monetary=':set the default locale for monetary:' \
|
||||||
|
--lc-numeric=':set the default locale for numeric:' \
|
||||||
|
--lc-time=':set the default local for time:' \
|
||||||
|
--no-locale'[equivalent to --locale=C]' \
|
||||||
|
--pwfile=':read password for the new superuser from file:_files' \
|
||||||
|
{-T+,--text-search-config=}'[default text search configuration]' \
|
||||||
|
{-U+,--username=NAME}':database superuser name:' \
|
||||||
|
{-W,--pwprompt}'[prompt for a password for the new superuser]' \
|
||||||
|
{-X+,--xlogdir=}':location for the transaction log directory:_files' \
|
||||||
|
{-d,--debug}'[generate lots of debugging output]' \
|
||||||
|
-L+':where to find the input files:_files' \
|
||||||
|
{-n,--noclean}'[do not clean up after errors]' \
|
||||||
|
{-s,--show}'[show internal settings]' \
|
||||||
|
':location for this database cluster:_files'
|
||||||
|
}
|
||||||
|
|
||||||
|
_pgsql_utils () {
|
||||||
|
local _pgsql_common_opts _pgsql_auth_methods
|
||||||
|
|
||||||
|
_pgsql_common_opts=(
|
||||||
|
{-\?,--help}'[display help]'
|
||||||
|
{-h+,--host=}':database host:_pgsql_host_or_dir'
|
||||||
|
{-p+,--port=}':database port number:_pgsql_ports'
|
||||||
|
{-U+,--username=}':connect as user:_pgsql_users'
|
||||||
|
{-W,--password}'[prompt for password]'
|
||||||
|
)
|
||||||
|
|
||||||
|
_pgsql_auth_methods=(
|
||||||
|
trust
|
||||||
|
reject
|
||||||
|
md5
|
||||||
|
password
|
||||||
|
gss
|
||||||
|
sspi
|
||||||
|
krb5
|
||||||
|
ident
|
||||||
|
peer
|
||||||
|
ldap
|
||||||
|
radius
|
||||||
|
cert
|
||||||
|
pam
|
||||||
|
)
|
||||||
|
|
||||||
|
case "$service" in
|
||||||
|
psql) _psql "$@" ;;
|
||||||
|
pg_dump) _pg_dump "$@" ;;
|
||||||
|
createdb) _createdb "$@" ;;
|
||||||
|
dropdb) _dropdb "$@" ;;
|
||||||
|
vacuumdb) _vacuumdb "$@" ;;
|
||||||
|
createuser) _createuser "$@" ;;
|
||||||
|
dropuser) _dropuser "$@" ;;
|
||||||
|
initdb) _initdb "$@" ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
_pgsql_utils "$@"
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# mode: Shell-Script
|
||||||
|
# sh-indentation: 2
|
||||||
|
# indent-tabs-mode: nil
|
||||||
|
# sh-basic-offset: 2
|
||||||
|
# End:
|
||||||
|
# vim: ft=zsh sw=2 ts=2 et
|
Loading…
Reference in New Issue
Block a user