aboutsummaryrefslogtreecommitdiffstats
path: root/src/_pgsql_utils
diff options
context:
space:
mode:
authorJulien Nicoulaud <julien.nicoulaud@gmail.com>2012-08-01 13:23:11 +0200
committerJulien Nicoulaud <julien.nicoulaud@gmail.com>2012-08-01 13:23:11 +0200
commit10ffeb0c153258896531b2b8939e94486d58b378 (patch)
treef735059d34c7f2ade7eb410643f39ecf402833d9 /src/_pgsql_utils
parentAdd call for deb and rpm packagers (diff)
downloadzsh-completions-10ffeb0c153258896531b2b8939e94486d58b378.tar
zsh-completions-10ffeb0c153258896531b2b8939e94486d58b378.tar.gz
zsh-completions-10ffeb0c153258896531b2b8939e94486d58b378.tar.bz2
zsh-completions-10ffeb0c153258896531b2b8939e94486d58b378.tar.lz
zsh-completions-10ffeb0c153258896531b2b8939e94486d58b378.tar.xz
zsh-completions-10ffeb0c153258896531b2b8939e94486d58b378.tar.zst
zsh-completions-10ffeb0c153258896531b2b8939e94486d58b378.zip
[BREAKING CHANGE] Move compdefs to own directory (to ease packaging and
avoid bloating users fpath with unneeded files such as README.md)
Diffstat (limited to 'src/_pgsql_utils')
-rw-r--r--src/_pgsql_utils266
1 files changed, 266 insertions, 0 deletions
diff --git a/src/_pgsql_utils b/src/_pgsql_utils
new file mode 100644
index 0000000..899e6f7
--- /dev/null
+++ b/src/_pgsql_utils
@@ -0,0 +1,266 @@
+#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>
+#
+# * Johann 'Myrkraverk' Oskarsson <johann@2ndquadrant.com>
+#
+# ------------------------------------------------------------------------------
+# -*- 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'
+}
+
+# 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.oin = 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_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 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'
+ {-p+,--port=}':database port number:_pgsql_ports'
+ {-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 "$@"