#35: Add PostgreSQL client completion
This commit is contained in:
parent
2dccac33a8
commit
1e39299b6e
|
@ -0,0 +1,243 @@
|
|||
#compdef psql pg_dump createdb dropdb vacuumdb
|
||||
# ------------------------------------------------------------------------------
|
||||
# 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>
|
||||
#
|
||||
# ------------------------------------------------------------------------------
|
||||
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
|
||||
# vim: ft=zsh sw=2 ts=2 et
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
|
||||
_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'
|
||||
}
|
||||
|
||||
_pgsql_users () {
|
||||
local _pgsql_user _pgsql_port _pgsql_host _pgsql_params
|
||||
_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"}
|
||||
)
|
||||
|
||||
compadd "$@" - ${${(f)~~"$( psql $_pgsql_params[@] -At -c '\du' 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}}
|
||||
|
||||
# XXX In postgres 7.3 and above, the schema name is in the first
|
||||
# column. I'm not sure how best to work around that... It really
|
||||
# needs to be prepended with a "." to the table name.
|
||||
|
||||
# Many thanks to Oliver Kiddle for pointing out how to get the 2nd
|
||||
# column out of this...
|
||||
compadd "$@" - \
|
||||
${${${(f)~~"$( psql $_pgsql_params[@] -At -c '\dt' $db 2>/dev/null )"}#*|}%%|*}
|
||||
}
|
||||
|
||||
_pgsql_databases () {
|
||||
local _pgsql_user _pgsql_port _pgsql_host _pgsql_params
|
||||
_pgsql_get_identity
|
||||
|
||||
# Should I grep out template0?
|
||||
compadd "$@" - ${${(f)~~"$( psql $_pgsql_params[@] -At -l 2>/dev/null )"}[@]%%|*}
|
||||
}
|
||||
|
||||
|
||||
##
|
||||
## 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]' \
|
||||
{-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:' \
|
||||
{-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' \
|
||||
{-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'
|
||||
}
|
||||
|
||||
_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:_values "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'
|
||||
}
|
||||
|
||||
_pgsql_utils () {
|
||||
local _pgsql_common_opts _pgsql_encodings
|
||||
|
||||
_pgsql_common_opts=(
|
||||
{-\?,--help}'[display help]'
|
||||
{-h+,--host=}':database host:_pgsql_host_or_dir'
|
||||
# Postgres doesn't like service names here, which is why we
|
||||
# don't use _ports.
|
||||
{-p+,--port=}':database port number:'
|
||||
{-U+,--username=}':connect as user:_pgsql_users'
|
||||
{-W,--password}'[prompt for password]'
|
||||
)
|
||||
|
||||
# Taken from
|
||||
# <http://www.postgresql.org/docs/7.4/static/multibyte.html#CHARSET-TABLE>.
|
||||
# It'd be real nice if postgres could tell us these...
|
||||
_pgsql_encodings=(
|
||||
SQL_ASCII
|
||||
EUC_{JP,CN,KR,TW}
|
||||
JOHAB
|
||||
UNICODE
|
||||
MULE_INTERNAL
|
||||
LATIN{1,2,3,4,5,6,7,8,9,10}
|
||||
ISO_8859_{5,6,7,8}
|
||||
KOI8
|
||||
WIN
|
||||
ALT
|
||||
WIN1256
|
||||
TCVN
|
||||
WIN874
|
||||
)
|
||||
|
||||
case "$service" in
|
||||
psql) _psql "$@" ;;
|
||||
pg_dump) _pg_dump "$@" ;;
|
||||
createdb) _createdb "$@" ;;
|
||||
dropdb) _dropdb "$@" ;;
|
||||
vacuumdb) _vacuumdb "$@" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
_pgsql_utils "$@"
|
Loading…
Reference in New Issue