#!/bin/bash 

info_slony()
{
	dialog --textbox README 0 0 
}

remove_arquivos_temp(){
	rm *.txt
}

botao_cancelar_esc(){
	if [ $? -ne 0 ]  
	then
		rm *.txt *.conf *.sk *slon 2> /dev/null
		exit
	fi
}

monta_preamble() {
	echo "define $1 $2;" >> preamble.sk
	echo "node @$1 admin conninfo='service=$1';" >> preamble.sk
}




monta_pg_service(){
	printf "\n">> pg_service.conf
	echo "[$1]" >> pg_service.conf
	echo "dbname=$2" >> pg_service.conf
	echo "host=$3" >>  pg_service.conf
	echo "user=$4" >>  pg_service.conf
}


echo "#!/usr/local/pgsql/bin/slonik" >> initCluster.sk
echo "include <preamble.sk>;" >> initCluster.sk

monta_initCluster(){
	ORIGEM=$(grep -i define preamble.sk  | cut -f2 -d " " | grep -vi CLUSTER | head -1)  
	echo "init cluster (id = @$ORIGEM , comment='NO DE ORIGEM');" >> initCluster.sk
	
	grep -i define preamble.sk  | cut -f2 -d " " | egrep -vi "CLUSTER|$ORIGEM" | while read linha 
	do
		 echo "store node (id = @$linha , comment='NO SUBSCRIBE');" >> initCluster.sk
	done
}

echo "#!/usr/local/pgsql/bin/slonik" >> addPath.sk
echo "include <preamble.sk>;" >> addPath.sk

monta_addPath(){
  grep -i define preamble.sk  | cut -f2 -d " " | grep -vi CLUSTER | while read linha; do  grep -i define preamble.sk  | cut -f2 -d " " | egrep -vi "CLUSTER|$linha" | while read linha2   ; do \
  echo "store path(server = @$linha , client = @$linha2 ,conninfo='service=$linha');" >> addPath.sk ; done; done
}	

echo "#!/usr/local/pgsql/bin/slonik" >> createSet.sk
echo "include <preamble.sk>;" >> createSet.sk

monta_set(){
	 ID=1
	 echo "create set(id =1 , origin=@$1 , comment= 'SET DE ORIGEM');" >>createSet.sk
	 cat TABELAS_ESCOLHIDAS.txt  | tr " " "\n" | sed 's/"//g' | while read linha 
	do 
		echo "set add table(set id = 1, origin = @$1, id= $ID , fully qualified name='$2.$linha', comment = 'TABELA $linha');" >> createSet.sk	
		ID=$(($ID+1))
	done 
			
}

monta_set_sequence(){
	ID=$(cat createSet.sk | tail -1 | cut -f3 -d , | cut -f2 -d = )
	ID=$(($ID+1))
	cat SEQUENCES_ESCOLHIDAS.txt  | tr " " "\n" | sed 's/"//g' | while read linha
        do
                echo "set add sequence(set id = 1, origin = @$1, id= $ID , fully qualified name='$2.$linha', comment = 'SEQUENCE $linha');" >> createSet.sk
                ID=$(($ID+1))
        done

}

info_slony

echo "#!/usr/local/pgsql/bin/slonik" >> subscribe.sk
echo "include <preamble.sk>;" >> subscribe.sk
monta_subscribe(){
	grep store initCluster.sk | cut -f2 -d '@' | cut -f1 -d ',' | while read linha	
	do
        	ORIGEM=$(dialog --stdout --radiolist "NO PROVIDER DO NO $(echo $linha)" 0 0 0\
        	$(grep  @  initCluster.sk | cut -f2 -d '@' | cut -f1 -d ',' | grep -v $linha | while read linha2
        	do
        	echo $linha2 '.' OFF
        	done))
		botao_cancelar_esc
		
        	echo "subscribe set (id =1 , provider = @$ORIGEM , receiver = @$linha , forward = yes);" >> subscribe.sk
	done
}


monta_slon(){
	grep  "@"  initCluster.sk | cut -f2 -d '@' | cut -f1 -d ',' | while read linha 
	do 
	 	echo "cluster_name = $(grep "define CLUSTER"  preamble.sk | cut -f3 -d " ")" | tr ';' ' ' >>$(echo $linha).slon
		echo "conn_info='service=$linha'" >>$(echo $linha).slon
	done
}




CLUSTER=$(dialog --title 'Configurando o slony' --stdout --inputbox 'INFORME UM NOME PARA O CLUSTER' 0 0 )
botao_cancelar_esc
echo "define CLUSTER $CLUSTER;" >> preamble.sk
echo "cluster name= @CLUSTER; ">> preamble.sk

OP="S"


ID=1
while [ "$OP" = "S" ]
do
	
	if [ "$ID" -eq  1 ] 
	then
		dialog --title "CONFIGURANDO OS NOS DO CLUSTER" --msgbox "ESSE E O SEU NO ORIGEM DE TODA A REPLICACAO, A PARTIR DELE OCORRERA A REPLICACAO" 0 0 
	
		
	else  
		dialog --title "CONFIGURANDO OS NOS DO CLUSTER" --msgbox "CONFIGURANDO OS NOS QUE RECEBERAO A REPLICAÇÃO! (SUBSCRIBERS E PROVIDERS)" 0 0
	fi
	

	NODE=$(dialog --title 'CONFIGURANDO A CONEXAO' --stdout --inputbox 'DIGITE UM NOME PARA O NO' 0 0 )
	botao_cancelar_esc
	
	IP=$(dialog --title 'CONFIGURANDO A CONEXAO' --stdout --inputbox 'DIGITE O IP DO SERVIDOR DE BANCO DE DADOS' 0 0 )
	botao_cancelar_esc


	USERNAME=$(dialog --title 'CONFIGURANDO A CONEXAO' --stdout --inputbox 'DIGITE O USERNAME' 0 0  )
	botao_cancelar_esc



	DATABASES="select datname,datname from pg_database;"
	psql -U postgres -h $IP  -t -c "$DATABASES" -U $USERNAME | grep -v "^$"  | tr '|' ' '> databases.txt
	  
	
	if [  $(wc -l databases.txt | cut -f1 -d ' ')  =  "0" ]
	then
		dialog --msgbox "SERVIDOR POSTGRESQL NAO ESTA NO AR, ABORTANDO!!! " 0 0	
		rm *.txt *.conf *.sk *slon 2> /dev/null
		exit
	fi



	BD=$(dialog --stdout --menu 'ESCOLHA O BANCO DE DADOS' 0 0 0 $(cat databases.txt))
	
	createlang -l -U $USERNAME  -h $IP $BD | grep plpgsql
	if [ $? -ne 0 ]
	then
		dialog --msgbox "BANCO $BD NAO POSSUI SUPORTE A PLPGSQL, ABORTANDO!!!" 0 0 
		rm *.txt *.conf *.sk *slon 2> /dev/null
                exit

	fi


	
	dialog --yesno "DESEJA CADASTRAR OUTRO NO?" 0 0;
	if [ "$?" -eq  0 ]
	then
		OP="S"
	else 
		OP="N"
	fi
	monta_preamble $NODE $ID
	monta_pg_service $NODE $BD $IP $USERNAME
	ID=$(($ID+1))
done

monta_initCluster
monta_addPath

ESQUEMAS_QUERY="select nspname,nspname  from pg_namespace where nspname !~ 'pg_|informa|$CLUSTER';" 
IP=$(grep host  pg_service.conf | head -1 | cut -f2 -d '=')

psql -U postgres -h $IP  -t -c "$ESQUEMAS_QUERY" -U $USERNAME | grep -v "^$"  | tr '|' ' '> ESQUEMAS.txt

ESQUEMA=$(dialog --stdout --menu 'ESCOLHA O ESQUEMA' 0 0 0 $(cat ESQUEMAS.txt))
botao_cancelar_esc




TABELAS_QUERY="select relname,'TABELA','OFF'  from pg_class a inner join pg_namespace b on(b.oid=a.relnamespace) where relkind ~ 'r' and relname ~'^[^sql,^pg_]' and b.nspname='$ESQUEMA' order by relname ASC ";


BD_ORIGEM=$(grep dbname  pg_service.conf | head -1 | cut -f2 -d '=')


psql -U postgres  -h $IP  -t -c "$TABELAS_QUERY" -U $USERNAME $BD_ORIGEM | grep -v "^$"  | tr '|' ' '> TABELAS.txt

dialog   --checklist 'ESCOLHA AS TABELAS DO ESQUEMA:' 0 0 0 $(cat TABELAS.txt) 2> TABELAS_ESCOLHIDAS.txt
botao_cancelar_esc


ORIGEM=$(grep -i define preamble.sk  | cut -f2 -d " " | grep -vi CLUSTER | head -1)


monta_set $ORIGEM $ESQUEMA




COUNT=$(psql -U postgres -h $IP -t -c "select count(*)  from pg_class a inner join pg_namespace b on(b.oid=a.relnamespace) where relkind ~ 'S' and relname ~'^[^sql,^pg_]' and b.nspname='$ESQUEMA'  " $BD_ORIGEM);
if [ "$COUNT" -gt 0 ]
then
	SEQUENCE_QUERY="select relname,'SEQUENCE','OFF'  from pg_class a inner join pg_namespace b on(b.oid=a.relnamespace) where relkind ~ 'S' and relname ~'^[^sql,^pg_]' and b.nspname='$ESQUEMA' order by relname ASC ";
	psql -U postgres  -h $IP -t -c "$SEQUENCE_QUERY" -U $USERNAME $BD_ORIGEM | grep -v "^$" | tr '|' ' '> SEQUENCES.txt
	dialog   --checklist 'ESCOLHA AS SEQUENCES DO ESQUEMA:' 0 0 0 $(cat SEQUENCES.txt) 2> SEQUENCES_ESCOLHIDAS.txt
	botao_cancelar_esc

	monta_set_sequence $ORIGEM $ESQUEMA
	
fi




monta_subscribe 
monta_slon
remove_arquivos_temp 




#monta_initCluster
#monta_addPath
#monta_set $ORIGEM $ESQUEMA
#monta_set_sequence $ORIGEM $ESQUEMA


	 


