Sofistikovanější výpis seznamu databází pro použití v bashi

Z PostgreSQL
Skočit na navigaci Skočit na vyhledávání

Pro zjednodušení života jsem si napsal jednoduchý skriptík, který vrací seznam databází na serveru. Parametry jako např. pouze nesystémové databáze, maska, pouze db daného vlastníka určují obsah.

#!/bin/sh                                                                                                                                                                        

quoted=0
dbname="AND true"
user="AND true "

while getopts ":qsSp:D:h:u:" options; do
  case $options in
    p ) port="-p $OPTARG";;
    q ) quoted=1;;
    s ) user=" $user AND datdba = (select usesysid from pg_user where usename = 'postgres') ";;
    S ) user=" $user AND datdba <> (select usesysid from pg_user where usename = 'postgres') ";;
    D ) dbname=" $dbname AND datname <> '$OPTARG' ";;
    h ) host="-h $OPTARG";;
    u ) user=" $user AND datdba = (SELECT usesysid from pg_user where usename = '$OPTARG') ";;
   \? )
      echo "listdb list available databases.                                                                                                                                     
                                                                                                                                                                                 
Usage:                                                                                                                                                                           
  listdb [OPTIONS]... [masks]...                                                                                                                                                 
                                                                                                                                                                                 
Options controlling the output content:                                                                                                                                          
  -s               show system databases                                                                                                                                         
  -S               show user's databases                                                                                                                                         
  -D DATABASE      exclude database                                                                                                                                              
  -q               quote output                                                                                                                                                  
  -u USERNAME      show only databases that owns user                                                                                                                            
                                                                                                                                                                                 
Connection options:                                                                                                                                                              
  -h HOSTNAME      database server host or socket directory (default: \"local socket\")                                                                                          
  -p PORT          database server port (default: \"5432\")                                                                                                                      
                                                                                                                                                                                 
Mask should contain wild chars like \"%\"."

      exit 1
      ;;
    : )
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
    * ) echo $OPTARG;;

  esac
done

ldbname=" false "
for p in ${@:$OPTIND}
do
  ldbname="$ldbname OR datname LIKE '$p' "
done

if [[ "$ldbname" == " false " ]]
then
  ldbname=true
fi

wherec="where true $user $dbname AND ( $ldbname )"

for db in `psql $port $host -A -t -l -c "select datname, quote_literal(datname) from pg_database $wherec" postgres`
do
BIFS=$IFS
IFS="|"
dbn=($db)
  echo ${dbn[$quoted]}
IFS=$BIFS
done;

Příklady užití:

[pavel@localhost ~]$ ./listdb -p 5483 -q
'template1'
'template0'
'postgres'
'omega'

[pavel@localhost ~]$ ./listdb -p 5483 -q -S
'omega'

[pavel@localhost ~]$ ./listdb -p 5483 -q o% p%
'postgres'
'omega'

[pavel@localhost ~]$ ./listdb -p 5483  o% p%
postgres
omega

[pavel@localhost ~]$