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

Z PostgreSQL
Přejít na: navigace, hledá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 ~]$