#-*- mode: shell-script;-*-

# mysqldump bash completion by Herbert Straub <herbert@linuxhacker.at>

_mysqldump()
{
	local cur databases prev curdb param multidb

	COMPREPLY=()
	cur=${COMP_WORDS[COMP_CWORD]}
	prev=${COMP_WORDS[COMP_CWORD-1]}
	databases=$(echo "show databases;" | mysql 2> /dev/null | grep -v Database)

	opts="--add-drop-database --add-drop-table --add-locks --all --all-databases --allow-keywords --character-sets-dir --comments --compact --compatible --complete-insert --compress --create-options --databases --debug --debug-info --default-character-set --defaults-extra-file --defaults-file --delayed-insert --delete-master-logs --disable-keys --disable-keys. --extended-insert --fields-enclosed-by --fields-escaped-by --fields-optionally-enclosed-by --fields-terminated-by --first-slave --flush-logs --flush-logs --flush-privileges --force --help --hex-blob --host --ignore-table --insert-ignore --lines-terminated-by --lock-all-tables --lock-tables --log-error --master-data --max_allowed_packet --net_buffer_length --no-autocommit --no-create-db --no-create-info --no-data --no-defaults --no-set-names --opt --order-by-primary --password --port --print-defaults --protocol --quick --quote-names --result-file --routines --set-charset --set-variable --single-transaction --single-transaction --single-transaction --skip-add-drop-table --skip-disable-keys --skip-opt --skip-set-charset --skip-ssl --socket --ssl --ssl-ca --ssl-capath --ssl-cert --ssl-cipher --ssl-key --ssl-verify-server-cert --tab --tables --triggers --tz-utc --user --variable-name --verbose --version --where --xml"


	# Run through all of the parameters to determine if a database has already been specified
	i=0
	while [ "$i" -lt "${#COMP_WORDS[@]}" ]
	do
		i=$(($i+1))
		param=${COMP_WORDS[$i]}

		# If --all-databases or --databases is specified, mysqldump considers all name parameters to be database names
		if [[ "$param" == "--all-databases" ]] || [[ "$param" == "--databases" ]]; then
			multidb=1
			break
		# If a parameter is not a --option, and it is a valid db name, it must be the db we are dumping
		elif [[ "$param" !=  -* ]] && [[ $(echo "${databases}" | grep -- "${param}") ]]; then
			curdb="${param}"
			break
		fi

	done
	

	case "$prev" in
		# These options require additional input which should not be tab completed
		--character-sets-dir|--default-character-set|--fields-*|--first-slave|--host|--ignore-table|--liens-terminated-by|--max_allowed_packet|--net_buffer_length|--password|--port|--protocol|--set-charset|--set-variable|--user|--variable-name|--version)
			return 0
			;;
		--databases)
			COMPREPLY=( $(compgen -o filenames -W "$databases" $cur) )
			return 0
			;;
	esac

	# Tab complete all the possible options
	if [[ "$cur" == -* ]]; then
		COMPREPLY=( $(compgen -W "${opts}" -- $cur) )
	# If the database has already been specified, and multiple databases aren't being dumped, tab complete the tables
	elif [[ -n $curdb ]] && [[ -z $multidb ]]; then
		COMPREPLY=( $( echo "show tables;" | mysql $curdb 2> /dev/null | grep -v "Tables_in_$curdb" ) )
	# If the database hasn't been specified, tab complete the databases
	else
		COMPREPLY=( $(compgen -o filenames -W "$databases" $cur) )
	fi

	return 0
}
complete -F _mysqldump mysqldump
 
# vim:ft=sh tabstop=4 shiftwidth=4:

