#!/usr/bin/perl -w

use DBI;
use strict;

# Prácticas de DBI y bases de datos biológicas
# Script de generación de un fichero con todas las secuencias en formato FASTA

my($dbhost)='localhost';
my($dbname)='masterdb';	# Teneis que introducir el nombre de la base de datos
				# que os corresponda
my($dbuser)='masteruser';	# Teneis que poner el nombre que os dé
my($dbpass)='masterpass';	# Teneis que poner la password que os dé


# Comprobación del número de parámetros
if(scalar(@ARGV)==1) {
	local(*OUTFILE);
	my($dbh,$sth);
	my($accnumber,$description,$sequence);
	
	# Se intenta crear el fichero de salida de los datos
	if(open(OUTFILE,'>'.$ARGV[0])) {
		
		# Apertura de la conexión con la base de datos
		# Establecemos que nosotros manejamos los errores,
		# y que vamos a trabajar con transacciones directamente
		# Queremos que sea coherente todo el fichero producido
		$dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost",$dbuser,$dbpass,{RaiseError => 0, AutoCommit => 0});
		
		# ¿Se ha podido establecer la conexión?
		if(defined($dbh)) {
			# Vamos a ejecutar la sentencia
			$sth=$dbh->prepare('SELECT accnumber,description,seq FROM SWISSENTRY');
			
			if(defined($sth) && $sth->execute()) {
				
				# Para agilizar la lectura especificamos
				# en qué variables queremos que DBI ponga
				# los valores recuperados
				$sth->bind_columns(\$accnumber,\$description,\$sequence);
				
				# Lectura de datos de la base de datos
				while($sth->fetch()) {
					
					# Y escritura de los mismos en formato FASTA
					print OUTFILE ">$accnumber;$description\n";
					while(length($sequence)>60) {
						print OUTFILE substr($sequence,0,60),"\n";
						$sequence=substr($sequence,60);
					}
					# El último trozo de la secuencia
					print OUTFILE "$sequence\n";
				}
				
				# No se van a recuperar más entradas
				$sth->finish()  unless($DBI::err);
			}
			
			# Se ha producido un error
			warn "Error de consulta: " . $DBI::errstr  if($DBI::err);
		} else {
			warn "Ha habido un problema al conectar con la base de datos: " . $DBI::errstr;
		}
		
		# Por último, cerramos el fichero
		close(OUTFILE);
	} else {
		die "No se ha podido crear el fichero $ARGV[0]";
	}
	$dbh->disconnect();
} else {
	die "Este script sólo admite un parámetro.";
}
