summary refs log tree commit diff
path: root/Completion/User/_mysql_utils
blob: 6d777112dcd04638566cf3c01b4a19fd7622ab02 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
#compdef mysql mysqlshow mysqldump mysqladmin
#
# zsh completion functions for mysql client programs
# Adam Spiers <adam@spiers.net>
#

##
## Auxiliary functions
##

_mysql_get_identity () {
  _mysql_user=${opt_args[-u]-$opt_args[--user]}
  _mysql_port=${opt_args[-P]-$opt_args[--port]}
  _mysql_host=${opt_args[-h]-$opt_args[--host]}

  _mysql_params=(
                 ${_mysql_user+"--user=$_mysql_user"}
                 ${_mysql_host+"--host=$_mysql_host"}
                 ${_mysql_port+"--port=$_mysql_port"}
                )
}

_mysql_hosts () {
  local _mysql_user _mysql_port _mysql_host _mysql_params
  _mysql_get_identity

  _wanted hosts expl 'server host' &&
    _combination -s '[:@]' '' hosts-ports-users \
      ${_mysql_user:+users=${_mysql_user:q}} \
      ${_mysql_port:+ports=${_mysql_port:q}} \
      hosts "$expl[@]"
}

_mysql_ports () {
  local _mysql_user _mysql_port _mysql_host _mysql_params
  _mysql_get_identity

  _wanted ports expl 'server port' &&
    _combination -s '[:@]' '' hosts-ports-users \
      ${_mysql_user:+users=${_mysql_user:q}} \
      ${_mysql_host:+hosts=${_mysql_host:q}} \
      ports "$expl[@]"
}

_mysql_users () {
  local _mysql_user _mysql_port _mysql_host _mysql_params
  _mysql_get_identity

  _wanted users expl 'server username' &&
    _combination -s '[:@]' '' hosts-ports-users \
      ${_mysql_host:+hosts=${_mysql_host:q}} \
      ${_mysql_port:+ports=${_mysql_port:q}} \
      users "$expl[@]"
}

_mysql_databases () {
  local _mysql_user _mysql_port _mysql_host _mysql_params
  _mysql_get_identity

  local _mysql_databases
  _mysql_databases=(
                    ${(f)~~"$( echo "show databases" |
                               mysql "$_mysql_params[@]" )"}
                   )
  shift _mysql_databases

  compadd "$expl[@]" - $_mysql_databases
}

_mysql_tables () {
  local _mysql_user _mysql_port _mysql_host _mysql_params
  _mysql_get_identity

  local _mysql_tables
  _mysql_tables=(
                 ${(f)~~"$( echo "show tables" |
                              mysql "$_mysql_params[@]" $1 )"}
                )
  # remove header
  shift _mysql_tables

  compadd "$expl[@]" - $_mysql_tables
}

_mysql_variables () {
  _values -s , 'MySQL client variables' \
    'max_allowed_packet[maximum allowed packet size]:Packet size in bytes:' \
    'net_buffer_length[network buffer length]:Buffer length in bytes:'
}


##
## The actual completion code for the commands
##

_mysql_common_opts=(
    {-\?,--help}'[display help]'
    {-S+,--socket=}':server socket file:_files'
    {-h+,--host=}':server hostname:_mysql_hosts'
    {-P+,--port=}':server port:_mysql_ports'
    {-u+,--user=}':server username:_mysql_users'
    {-p+,--password=}':server password: '
    {-C,--compress}'[use compression in server/client protocol]'
)

_mysql () {
  local curcontext="$curcontext" state line expl
  typeset -A opt_args

  _arguments -C -s \
    "$_mysql_common_opts[@]" \
    {-V,--version}'[display client version]' \
    {-A,--no-auto-rehash}'[no automatic rehashing]' \
    '(-t --table)'{-B,--batch}'[batch mode (no pretty ASCII)]' \
    {-T,--debug-info}'[print debug info on exit]' \
    {-e,--exec-command}':batch-execute specified command and exit: ' \
    {-f,--force}'[continue through errors]' \
    {-i,--ignore-space}'[ignore space after function names]' \
    {-H,--html}'[produce HTML output]' \
    {-n,--unbuffered}'[flush the buffer after each query]' \
    {-O,--set-variable=}':set variable:_mysql_variables' \
    {-o,--one-database}'[only update the default database]' \
    {-q,--quick}'[disable caching of the result]' \
    {-r,--raw}'[write fields without conversion]' \
    {-s,--silent}'[silent mode]' \
    {-L,--skip-line-numbers}"[don't write line number for errors]" \
    {-N,--skip-column-names}"[don't write column names in results]" \
    '(-B --batch)'{-t,--table}'[output in table format]' \
    {-v,--verbose}'[verbose mode]' \
    {-E,--vertical}'[print query output vertically]' \
    {-w,--wait}'[wait and retry server connection if necessary]' \
    ':MySQL database to use:_mysql_databases'
}

_mysqlshow () {
  local curcontext="$curcontext" state line expl
  typeset -A opt_args

  _arguments -C -s \
    "$_mysql_common_opts[@]" \
    {-V,--version}'[display version]' \
    {-\#+,--debug=}':debug file: ' \
    ':MySQL database to show:_mysql_databases' \
    ':table to show:{ _mysql_tables "$line[1]" }' \
    ':field wildcard: '
}

_mysqldump () {
  local curcontext="$curcontext" state line expl
  typeset -A opt_args

  _arguments -C -s \
    "$_mysql_common_opts[@]" \
    {-V,--version}'[display version]' \
    {-a,--all}'[include all create options]' \
    {-\#+,--debug=}':debug file: ' \
    {-c,--complete-insert}'[use complete insert statements]' \
    {-e,--extended-insert}'[allow new INSERT syntax]' \
    "--add-drop-table[add a 'drop table' before each create]" \
    "--add-locks[add locks around insert statements]" \
    "--allow-keywords[allow creation of column names that are keywords]" \
    "--delayed[insert rows with INSERT DELAYED]" \
    {-F,--flush-logs}'[flush logs file in server before dump]' \
    {-l,--lock-tables}'[lock all tables for read]' \
    {-t,--no-create-info}"[don't write table creation info]" \
    {-d,--no-data}"[don't write row information]" \
    {-O,--set-variable}':set variable:_mysql_variables' \
    '--opt[create fastest possible dump for reading]' \
    {-q,--quick}"[don't buffer, dump directly to stdout]" \
    {-T,--tab=}"[dump tab-separated text files for each table]:directory to store text files:_files -/" \
    {-w+,--where=}'[dump only selected records]:WHERE clause to limit records to dump: ' \
    '--fields-terminated-by=:(with --tab) fields in textfile terminated by ...: ' \
    '--fields-enclosed-by=:(with --tab) fields in import file enclosed by ...: ' \
    '--fields-optionally-enclosed-by=:(with --tab) fields in import file optionally enclosed by ...: ' \
    '--fields-escaped-by=:(with --tab) fields in import file escaped by ...: ' \
    '--lines-terminated-by=:(with --tab) lines in import file terminated by ...: ' \
    ':MySQL database to dump:_mysql_databases' \
    '*:tables to dump:{ _mysql_tables "$line[1]" }'
}

_mysqladmin () {
  local curcontext="$curcontext" state line expl
  typeset -A opt_args

  _arguments -C -s \
    "$_mysql_common_opts[@]" \
    {-v,--version}'[display version]' \
    {-\#+,--debug=}':debug file: ' \
    {-f,--force}'[continue through errors]' \
    {-i+,--sleep=}'[repeat commands periodically]:number of seconds between executions: ' \
    {-s,--silent}"[silently exit if can't connect to server]" \
    {-t+,--timeout=}'[timeout for connection]' \
    {-w+,--wait=}'[wait and retry server connection if necessary]:number of retries: ' \
    '*::admin command:_mysqladmin_commands'
}

_mysqladmin_commands () {
  local cmds expl
  cmds=(
        create drop extended-status
        flush-{hosts,logs,status,tables,privileges}
        kill password ping processlist
        reload refresh shutdown
        status variables version
       )

  if (( CURRENT == 1 )); then
    _tags commands && compadd "$@" $cmds
  else
    local curcontext="$curcontext"

    case "$words[1]" in
      (create)
      ;&
      (drop)
        _wanted mysqldbs expl "MySQL databases" && _mysql_databases
      ;;
      (kill)
        _message 'thread ids'
      ;;
      (password)
        _message 'new password'
      ;;
    esac
  fi
}

_mysql_utils () {
  case "$words[1]" in
    mysql)
      _mysql "$@"
    ;;
    mysqlshow)
      _mysqlshow "$@"
    ;;
    mysqldump)
      _mysqldump "$@"
    ;;
    mysqladmin)
      _mysqladmin "$@"
    ;;
  esac
}

_mysql_utils "$@"