#!/bin/bash
set -eu
### --help Info: Выполнит указанный запрос к БД.
### --help Info:
### --help Usage: sqlexec [OPTIONS] SQL_REQUEST|--file=<file_path>
### --help Usage:
### --help Usage:   SQL_REQUEST - SQL-запрос
### --help Usage:
### --help Usage:   OPTIONS:
### --help Usage:
### --help Usage:   --file (-f) - можно указать путь к файлу с запросом, вместо самого запроса:
### --help Usage:                 --file=example.sql, --file example.sql, -f example.sql
### --help Usage:
### --help Usage:   --expanded (-x) - расширенный формат вывода ("в столбик", вместо таблицы)
### --help Usage:
### --help Usage:   --no-align (-A) - отключает табличное выравнивание,
### --help Usage:                     колонки разделяются прямой чертой
### --help Usage:
### --help Usage:   --tuples-only (-t) - отключает вывод имён столбцов
### --help Usage:                        и результирующей строки с количеством выбранных записей
### --help Usage:
### --help Usage:   --db - имя БД, на Eva по-умолчанию evadb, на Account - accountdb
### --help Usage:
### --help Usage:   --pager - включить пагинацию вывода (может быть удобно в связке с "-x")
### --help Usage:
### --help Example: sqlexec "select count(*) from cmf_task"
### --help Example: sqlexec -A "select code,name from cmf_task"
### --help Example: sqlexec -x "select * from cmf_task"
### --help Example: sqlexec -f request.sql
### --help Example:
__SILENT=TRUE
. /opt/fox_utils/crab_sys.sh
[[ ${@:---help} =~ --help ]] && sys::usage "$@"
sys::arg_parse "$@"

. /opt/CONFIG

declare DB


define_db(){
	DB="evadb"
	if [[ -n ${ARG_DB:-} ]]; then
		DB="$ARG_DB"
	elif [[ -d /opt/account ]] && [[ ! -e /opt/eva-app && ! -d /opt/crm ]]; then
		DB="accountdb"
	fi
	return 0
}


main(){
	local args psq_args sql arg file
	set -o noglob
	args="$@"
	psq_args=()
	if [[ -n ${ARG_DEDBUG:-} ]]; then
		args="$(sed -E "s/--debug//" <<< "$args")"
	fi
	if [[ -n ${ARG_PAGER:-} ]]; then
		args="$(sed -E "s/--pager//" <<< "$args")"
	else
		psq_args+=(-P pager=off)
	fi
	if [[ -n "${ARG_DB:-}" ]]; then
		args="$(sed -E "s/--db=\w+//" <<< "$args")"
	fi
	if [[ " $args " =~ " "(-A|--no-align)" " ]]; then
		args="$(sed -E "s/(-A|--no-align)//" <<< "$args")"
		psq_args+=(-A)
	fi
	if [[ " $args " =~ " "(-t|--tuples-only)" " ]]; then
		args="$(sed -E "s/(-t|--tuples-only)//" <<< "$args")"
		psq_args+=(-t)
	fi
	if [[ " $args " =~ " "(-x|--expanded)" " ]]; then
		args="$(sed -E "s/(-x|--expanded)//" <<< "$args")"
		psq_args+=(-x)
	fi
	define_db
	if [[ ${ARG_FILE:-} || " $args " =~ " "(-f|--file)" " ]]; then
		file="${ARG_FILE:-}"
		if [[ ${file:-} == TRUE || " $args " == *" -f "* ]]; then
			for arg in $(seq 0 ${#@}); do
				if [[ ${!arg} =~ ^(-f|--file)$ ]]; then
					file=$((arg + 1))
					file=${!file}
					break
				fi
			done
		fi
		psql -U postgres ${psq_args[@]} $DB -f "$file"
	else
		# В начале строки могли остаться пробелы из-за опций,
		# это сломает метакоманды вроде "\l", "\d".
		sql="$(sed -E -e 's/^[[:space:]]+//; s/[[:space:]]+$//' <<<"$args")"
		psql -U postgres ${psq_args[@]} $DB -c "$sql"
	fi
	set +o noglob
	return 0
}


main "$@"

exit 0
