Como mencionamos, la estructura PGresult contiene toda la información referente al resultado regresado por el servidor luego de una consulta. El método para obtener esta información es:
96#96
Pg proveé de algunos métodos para examinar la estructura resultante:
97#97
Si se le pasan valores adicionales, serán tomados como nombres de las columnas.
El siguiente es un ejemplo que toma la salida de una consulta al servidor de CDDB y lo inserta en una base de datos.
#!/usr/bin/perl
use Pg;
use Getopt::Std;
getopts('ig:');
@args = @ARGV;
$ini = (defined $opt_i) ? 1 : 0;
$genero = (defined $opt_g) ? $opt_g : 'Sin Clasificar';
$DBUG = 10000;
$| = 1;
&inicializa();
&inidb();
foreach $a (@ARGV) {
&jalacddb($a);
}
# # xmcd CD database file
# # Copyright (C) 1993-1998 CDDB, Inc.
# #
# # Track frame offsets:
# # 200
# # 36531
# # 55138
# # 98442
# # 112786
# # 165902
# # 185123
# # 235011
# #
# # Disc length: 3225 seconds
# #
# # Revision: 6
# # Processed by: cddbd v1.4.1b10PL0 Copyright (c) 1996-1998 CDDB Inc.
# # Submitted via: NotifyCDPlayer(CDDB) 1.51.3
# #
# DISCID=530c9708,540c9c08,560c9508,570c9508,590c9708,590c9c08
# DTITLE=Genesis / Selling England by the Pound
# TTITLE0=Dancing with the Moonlight Knight
# TTITLE1=I know what I like (in your Wardrobe)
# TTITLE2=Firth of Fifth
# TTITLE3=More fool Me
# TTITLE4=The Battle of Epping Forest
# TTITLE5=After the Ordeal
# TTITLE6=The Cinema Show
# TTITLE7=Aisle of Plenty
# EXTD=Phil Collins : Drums, Percussion, Vocal\nMichael Rutherford : 12-String
# EXTD=, Bass, Electric Sitar\nStephen Hackett : Elec Guitar, Nylon Guitar\nTo
# EXTD=ny Banks : Keyboards, 12-String\nPeter Gabriel : Vocals, Flute, Percuss
# EXTD=ion, Oboe\n\nProduced by John Burns & Genesis\nCASCD 1074 (P) 1973 Virg
# EXTD=in Records LTD (C) 1985 Charisma Records LTD\n\nSubmitted by Stephane G
# EXTD=rienenberger, 17/12/1998
# EXTT0=
# EXTT1=
# EXTT2=
# EXTT3=Vocals : Phil
# EXTT4=
# EXTT5=
# EXTT6=
# EXTT7=
# PLAYORDER=
# .
sub jalacddb {
# Esta funcion es mas grande de lo que puedo tolerar. Y todavia falta
# aniadirle una tonelada de chequeos.
local ($arc) = @_;
print "Insertando $arc\n" if ($DBUG <= 2);
open (DATA, $arc) or die "No puedo leer de $arc\n";
while (<DATA>) {
chomp;
if (m/Track frame offsets:/) {
foreach my $i (0..100) {
$disc[$TROLA][$i] = "";
}
$ind = 0;
$max_ind = 0;
$extd = "";
$disc[$EXTD] = "";
$auxtit = "";
print "Machea Track frame:[$_]\n" if ($DBUG <= 1);
$nt = 0;
while (<DATA>) {
next if (m/^\#\s+$/);
chomp;
if (m/Disc length:/) {
print "Machea Disc length:[$_]\n" if ($DBUG <= 2);
$aux = $_;
$aux =~ s/(Disc)(\s)(length:)(\s)([0-9]+)/$5/;
$disc[$DURS][$nt] = $5 + 0;
$disc[$NROL] = $nt - 1;
print "Tenemos $disc[$NROL] rolas: " if ($DBUG <= 2);
foreach my $i (0..$disc[$NROL]) {
print "$disc[$DURS][$i]:" if ($DBUG <= 2);
$disc[$TREX][$i] = "";
}
print "$disc[$DURS][$disc[$NROL]+1]\n" if ($DBUG <= 2);
last;
} else {
@a = split (' ', $_);
$disc[$DURS][$nt++] = $a[1] + 0;
}
}
}
if (m/^DISCID/) {
print "Machea DISCID:[$_]\n" if ($DBUG <= 1);
@a = split (/=/, $_);
$disc[$DISCID][0] = $a[1];
}
if (m/^DTITLE/) {
# Recuerda que a veces vienen en dos lineas:
# DTITLE=Fischer-Dieskau/Moore / Schubert, Franz: Die schone Mull
# DTITLE=erin, D795
print "Machea DTITLE:[$_]\n" if ($DBUG <= 1);
@a = split (/=/, $_);
$auxtit .= $a[1];
}
if (m/^EXTD/) {
print "Machea EXTD:[$_]\n" if ($DBUG <= 1);
@a = split (/=/, $_);
$disc[$EXTD] .= $a[1];
}
if (m/^TTITLE/) { # Hay que guardar tambien el numero de rola...
print "Machea TTITLE:[$_]\n" if ($DBUG <= 1);
$aux = $_;
@a = split (/=/, $_);
$a[0] =~ s/(TITLE)([0-9]+)/$2/;
$ind = $2 + 0;
print "$aux->$ind\n" if ($DBUG <= 1);
$disc[$TROLA][$ind] .= $a[1];
$max_ind = $ind;
}
if (m/^EXTT/) {
print "Machea EXTT:[$_]\n" if ($DBUG <= 1);
$aux = $_;
@a = split (/=/, $_);
$a[0] =~ s/(EXTT)([0-9]+)/$2/;
$ind = $2 + 0;
print "indice extension: $aux->$ind:[$a[1]]\n" if ($DBUG <= 10);
$disc[$TREX][$ind] .= $a[1];
}
if (m/^PLAYORDER/) { # Usualmente el archivo termina con un `.',
# pero en la practica, muchos terminan con el PLAYORDER
print "max_ind ==> $max_ind\n" if ($DBUG <= 3);
if ($max_ind <= 0) {
print ILOG "$arc: con ", $max_ind+1, " rolas\n";
}
foreach my $i (0..$max_ind) {
if ($i == $max_ind) {
$frames = $disc[$DURS][$i+1] * 75 - $disc[$DURS][$i];
} else {
$frames = $disc[$DURS][$i+1] - $disc[$DURS][$i];
}
if ($frames >= 270000) {
print STDERR "\n\n\t\t!!!PELIGRO!!!\n\nframes:$frames\n";
print ILOG "$arc:frames absurdos $frames\n";
}
$framesres = $frames % 75;
$j = ($frames - $framesres) / 75;
$segundos = $j % 60;
$j = $j - $segundos;
$minutos = ($j / 60) % 60;
$horas = int (int ($j / 60) / 60);
print ">$i:$disc[$DURS][$i+1]:$disc[$DURS][$i]:$frames=>"
."f$framesres:s$segundos:m$minutos:h$horas<\n" if ($DBUG <= 3);
$disc[$TTIM][$i][$TFRM] = $framesres;
$disc[$TTIM][$i][$TSEG] = $segundos;
$disc[$TTIM][$i][$TMIN] = $minutos;
$disc[$TTIM][$i][$THOR] = $horas;
$disc[$MSDURS][$i] = sprintf ("%02d:%02d:%02d.%02d",
$horas, $minutos,
$segundos, $framesres);
}
print "auxtit:$auxtit\n" if ($DBUG <= 3);
$disc[$TTOT][$TFRM] = 0;
$disc[$TTOT][$TSEG] = 0;
$disc[$TTOT][$TMIN] = 0;
$disc[$TTOT][$THOR] = 0;
$tfrm = 0;
$tseg = 0;
$tmin = 0;
$thor = 0;
if ($auxtit =~ m/\//) {
@a = split (/\//, $auxtit, 2);
} elsif ($auxtit =~ m/\-/) {
@a = split (/\-/, $auxtit, 2);
} elsif ($auxtit =~ m/:/) {
@a = split (/:/, $auxtit, 2);
} else {
$a[0] = $auxtit;
$a[1] = $auxtit;
}
$a[0] =~ s/^\s+//;
$a[0] =~ s/\s+$//;
$a[1] =~ s/^\s+//;
$a[1] =~ s/\s+$//;
$disc[$AUTOR] = $a[0];
$disc[$TITULO] = $a[1];
print "ID: $disc[$DISCID][0]\n" if ($DBUG <= 4);
print "Autor: $disc[$AUTOR]\n" if ($DBUG <= 4);
print "Titulo:$disc[$TITULO]\n" if ($DBUG <= 4);
print "Ext.: $disc[$EXTD]\n" if ($DBUG <= 4);
print "Tracks:\n" if ($DBUG <= 4);
foreach my $i (0..$max_ind) {
print "\t$disc[$TROLA][$i]:$disc[$TREX][$i]:$disc[$DURS][$i]"
. "($disc[$MSDURS][$i])\n" if ($DBUG <= 4);
$tfrm += $disc[$TTIM][$i][$TFRM];
$tseg += $disc[$TTIM][$i][$TSEG];
$tmin += $disc[$TTIM][$i][$TMIN];
$thor += $disc[$TTIM][$i][$THOR];
$disc[$TTOT][$TFRM] = $tfrm % 75;
$carry = ($tfrm - $disc[$TTOT][$TFRM]) / 75;
$disc[$TTOT][$TSEG] = ($tseg + $carry) % 60;
$carry = ($tseg + $carry - $disc[$TTOT][$TSEG]) / 60;
$disc[$TTOT][$TMIN] = ($tmin + $carry) % 60;
print "........................................."
. "tmin:$tmin:carry:$carry\n" if ($DBUG <= 4);
$carry = ($tmin + $carry - $disc[$TTOT][$TMIN]) / 60;
$disc[$TTOT][$THOR] = $thor + $carry;
}
$disc[$TTOT][$TTTO] = sprintf ("%02d:%02d:%02d.%02d",
$disc[$TTOT][$THOR], $disc[$TTOT][$TMIN],
$disc[$TTOT][$TSEG], $disc[$TTOT][$TFRM]);
&mete_disco();
print "=" x 78, "\n";
}
}
close (DATA);
}
sub dame_seq {
$manda = "select nextval(\'seqdis\')";
$result = $conn->exec($manda);
$stat = $result->resultStatus;
cmp_eq("jalando sequencia", PGRES_TUPLES_OK, $result->resultStatus);
cmp_ne("OID status",0, $result->oidStatus);
$leseq = $result->fetchrow;
if ($GranError == 1) {
$GranError = 0;
print ELOG "$manda ($.)\n" if ($LOGGING);
print ILOG "dame_seq:$manda --> [$leseq]\n";
}
return $leseq;
}
sub inserta_id {
local ($id, $seq) = @_;
print STDERR "Insertando: $id\n";
$manda = "insert into ids values (\'$id\', $seq)";
$result = $conn->exec($manda);
$stat = $result->resultStatus;
# print LOG "$stat\n" if ($LOGGING);
cmp_eq("insertando $id:$seq",PGRES_COMMAND_OK, $result->resultStatus);
cmp_ne("OID status",0, $result->oidStatus);
if ($GranError == 1) {
$GranError = 0;
print ELOG "$manda ($.)\n" if ($LOGGING);
print ILOG "inserta_id:$manda\n";
}
}
sub busca_id {
local ($id) = @_;
$manda = "select discid from ids where discid = '$id'";
$result = $conn->exec($manda);
$stat = $result->resultStatus;
cmp_eq("Buscando $id", PGRES_COMMAND_OK, $result->resultStatus);
cmp_ne("OID status", 0, $result->oidStatus);
if ($GranError == 1) {
$GranError = 0;
print ELOG "$manda ($.)\n" if ($LOGGING);
}
return $result->ntuples;
}
sub mete_disco {
$seq = &dame_seq ();
@dd = split /,/, $disc[$DISCID][0];
foreach my $id (@dd) {
&inserta_id ($id, $seq);
}
$numrolas = $max_ind + 1;
$disc[$AUTOR] =~ s/\'/\\\'/g;
$disc[$AUTOR] =~ s/\"/\\\"/g;
$disc[$TITULO] =~ s/\'/\\\'/g;
$disc[$TITULO] =~ s/\"/\\\"/g;
$disc[$EXTD] =~ s/\\/\\\\/g;
$disc[$EXTD] =~ s/\'/\\\'/g;
$disc[$EXTD] =~ s/\"/\\\"/g;
foreach my $i (0..$max_ind) {
$disc[$TROLA][$i] =~ s/\'/\\\'/g;
$disc[$TROLA][$i] =~ s/\"/\\\"/g;
$disc[$TREX][$i] =~ s/\\/\\\\/g;
$disc[$TREX][$i] =~ s/\'/\\\'/g;
$disc[$TREX][$i] =~ s/\"/\\\"/g;
}
$values = "$seq, \'$disc[$TITULO]\', \'$disc[$AUTOR]\', \'$disc[$EXTD]\'"
. ", $numrolas, \'$disc[$TTOT][$TTTO]\', $legenero";
$manda = "insert into ndis values ($values)";
$result = $conn->exec($manda);
$stat = $result->resultStatus;
cmp_eq("insertando $disc[$AUTOR]:$disc[$TITULO]", PGRES_COMMAND_OK,
$result->resultStatus);
cmp_ne("OID status",0, $result->oidStatus);
if ($GranError == 1) {
$GranError = 0;
print ELOG "$manda ($.)\n" if ($LOGGING);
print ILOG "mete_disco:$manda\n";
}
foreach my $i (0..$max_ind) {
&inserta_rola ($seq, ($i+1), $disc[$TROLA][$i], $disc[$MSDURS][$i],
$disc[$TREX][$i]);
}
}
sub inserta_rola {
local ($seq, $nrola, $tit, $dur, $ext) = @_;
$values = "$seq, $nrola, \'$tit\', \'$dur\', \'$ext\'";
$manda = "insert into rolas values ($values)";
$result = $conn->exec($manda);
$stat = $result->resultStatus;
cmp_eq("insertando $seq:$tit",PGRES_COMMAND_OK, $result->resultStatus);
cmp_ne("OID status",0, $result->oidStatus);
if ($GranError == 1) {
$GranError = 0;
print ELOG "$manda ($.)\n" if ($LOGGING);
print ILOG "inserta_rola:$manda\n";
}
}
sub inicializa {
$dbmain = 'mancha';
$dbname = 'pruebas';
$tabname = 'discos';
$dbhost = 'caserola';
$trace = '/tmp/pgtrace.out';
$cnt = 2;
$DEBUG = 1; # set this to 1 for traces
$errorlog = 'log.inscddb.log';
$ellog = '/tmp/inscddb.log';
$logirrec = 'irrecuperables.inscddb.log';
$LOGGING = 1;
$GranError = 0;
$DURS = 0;
$DISCID = 1;
$AUTOR = 2;
$TITULO = 3;
$NROL = 4;
$TROLA = 5;
$TREX = 6;
$EXTD = 7;
$MSDURS = 8;
$TTIM = 9;
$TTOT = 10;
$THOR = 0;
$TMIN = 1;
$TSEG = 2;
$TFRM = 3;
$TTTO = 4;
$SIG{PIPE} = sub { print "Se rompio la canieria\n!Llamen al plomero!\n\n" };
open (LOG, ">>$ellog") || die "No puedo crear $ellog\n";
open (ELOG, ">>$errorlog") || die "No puedo crear $errorlog\n";
open (ILOG, ">>$logirrec") || die "No puedo crear $logirrec\n";
}
sub inidb {
$conn = Pg::connectdb("dbname=$dbname host=$dbhost");
cmp_eq("probando conexion", PGRES_CONNECTION_OK, ($estatus=$conn->status));
if ($estatus != PGRES_CONNECTION_OK) {
print STDERR "Error fatal en la conexion ($estatus), terminamos\n";
exit (1);
}
if ($DEBUG) {
open(TRACE, ">$trace") || die "can not open $trace: $!";
$conn->trace(TRACE);
}
$db = $conn->db;
cmp_eq("comparando bases", $dbname, $db);
$user = $conn->user;
cmp_ne("comparando usuarios", "", $user);
$host = $conn->host;
cmp_ne("comparando hosts", "", $host);
$port = $conn->port;
cmp_ne("comparando puertos", "", $port);
$result = $conn->exec("SET DateStyle to 'ISO'");
cmp_eq("fijando la fecha", $result->resultStatus, $result->resultStatus);
if ($ini == 1) {
&limpia_base ();
&crea_base ();
}
$legenero = &busca_genero ($genero);
print "El id para genero $genero es $legenero\n";
}
sub busca_genero {
local $legenero;
$manda = "select genid from genero where genero='$genero'";
$result = $conn->exec($manda);
$stat = $result->resultStatus;
cmp_eq("obteniendo $genero", PGRES_COMMAND_OK, $result->resultStatus);
cmp_ne("OID status", 0, $result->oidStatus);
if ($result->ntuples) { # ya existe, obtenlo
$legenero = $result->fetchrow;
} elsif ($GranError == 1) { # no existe, insertalo
$GranError = 0;
print ELOG "$manda ($.)\n" if ($LOGGING);
print STDERR "Error al sacar el genero\n";
$manda = "insert into genero (genero) values ('$genero')";
$result = $conn->exec($manda);
$stat = $result->resultStatus;
cmp_eq("insertando $genero",PGRES_COMMAND_OK, $result->resultStatus);
cmp_ne("OID status",0, $result->oidStatus);
$manda = "select genid from genero where genero='$genero'";
$result = $conn->exec($manda);
$stat = $result->resultStatus;
cmp_eq("obteniendo $genero",PGRES_COMMAND_OK, $result->resultStatus);
cmp_ne("OID status",0, $result->oidStatus);
$legenero = $result->fetchrow;
}
return $legenero;
}
sub cmp_eq {
my $mns = shift;
my $cmp = shift;
my $ret = shift;
my $msg;
print ELOG "$mns: ";
if ("$cmp" eq "$ret") {
print ELOG "ok $cnt\n";
} else {
$msg = $conn->errorMessage;
print ELOG "error $cnt: $cmp, $ret\n$msg\n";
$GranError = 1;
}
$cnt++;
}
sub cmp_ne {
my $mns = shift;
my $cmp = shift;
my $ret = shift;
my $msg;
print ELOG "$mns: ";
if ("$cmp" ne "$ret") {
print ELOG "ok $cnt\n";
} else {
$msg = $conn->errorMessage;
print ELOG "error $cnt: $cmp, $ret\n$msg\n";
$GranError = 1;
}
$cnt++;
}
sub limpia_base {
$des[0] = "DROP TABLE ids";
$des[1] = "DROP TABLE ndis";
$des[2] = "DROP TABLE rolas";
$des[3] = "DROP INDEX xautor";
$des[4] = "DROP INDEX xtitulo";
$des[5] = "DROP SEQUENCE seqdis";
$des[6] = "DROP SEQUENCE genero_genid_seq";
$des[7] = "DROP INDEX genero_genid_key";
$des[8] = "DROP TABLE genero";
$Max_Tab = 8;
foreach my $i (0..$Max_Tab) {
print "Actuando $i:";
print "\tDestruir: $des[$i]\n";
if (defined $des[$i]) {
$result = $conn->exec($des[$i]);
cmp_eq("destruyendo la tabla",PGRES_COMMAND_OK, $result->resultStatus);
cmp_eq("redestruyendo la tabla","DROP", $result->cmdStatus);
}
}
}
sub crea_base {
$tab[0] = "CREATE TABLE ids (discid CHAR(8) NOT NULL, discseq INT4 NOT NULL)";
$tab[1] = "CREATE TABLE ndis (discseq INT4 NOT NULL, titulo TEXT, "
. "autor TEXT, extdisc TEXT, numrolas INT2, durdisc TIME, genid INT4 NOT NULL)";
$tab[2] = "CREATE TABLE rolas (discseq INT4 NOT NULL, nrola int4, "
. "rolatit TEXT, roladur TIME, rolaext TEXT)";
$tab[3] = "CREATE INDEX xautor on ndis using btree (autor text_ops)";
$tab[4] = "CREATE INDEX xtitulo on ndis using btree (titulo text_ops)";
$tab[5] = "CREATE SEQUENCE seqdis";
$tab[6] = "CREATE TABLE genero (genid serial, genero varchar(32))";
$Max_Tab = 6;
foreach my $i (0..$Max_Tab) {
print "Actuando $i:";
print "\tConstruir: $tab[$i]\n";
if (defined $tab[$i]) {
$result = $conn->exec("$tab[$i]");
cmp_eq("creando la tabla",PGRES_COMMAND_OK, $result->resultStatus);
cmp_eq("recreando la tabla","CREATE", $result->cmdStatus);
}
}
}
En este otro ejemplo, hacemos un CGI que realiza consultas sobre una base de datos en PostgreSQL.
#!/usr/bin/perl
use Pg;
use CGI;
$DBUG=1001;
$cgi = new CGI;
&inicializa ();
&forma ();
&consulta ();
sub forma {
print $cgi->header, "\n";
print $cgi->start_html(-title => 'Consulta a la base de discos',
-author => 'mancha@caserola.mancha.baras.net',
-base => 'true',
-expires => 'now'),"\n";
print $cgi->h1('Consulta a la base de datos de discos');
print $cgi->startform;
print "Seleccione algún campo de la forma";
print "<P>Artista: ";
print $cgi->scrolling_list(-name => 'autor',
-values => ['Indiferente', @lesartistes],
-size => 5,
-default => 'Indiferente');
print "<P>Título: ";
print $cgi->scrolling_list(-name => 'titulo',
-values => ['Indiferente', @lestitres],
-size => 5,
-default => 'Indiferente');
print "<P>";
print $cgi->submit('Action','Consultar');
print $cgi->end_form;
print $cgi->hr, "\n";
print $cgi->end_html;
}
sub by_number {
$a <=> $b;
}
sub consulta {
foreach my $key ($cgi->param) {
print "[[$key]=>" if ($DBUG == 23);
@valores = $cgi->param($key);
print "[", join(' ', @valores), "]]<BR>" if ($DBUG == 23);
$cosa = join (' ', @valores);
$consulta{$key} = $cosa
if (length $cosa && $cosa ne 'Indiferente' && $key ne 'Action');
}
print "Buscaremos por:<BR>" if ($DBUG == 23);
foreach my $k (keys %consulta) {
print "$k ==> [$consulta{$k}]<BR>" if ($DBUG == 23);
push (@cbus, "$k ~~ \'%$consulta{$k}%\'");
}
$manda = 'SELECT *,oid FROM discos WHERE ' . join (' AND ', @cbus);
$manda .= ' order by autor,titulo';
print STDERR "query: [$manda]\n";
print "query: $manda<BR>" if ($DBUG == 23);
print LOG "$manda\n";
&presenta ($manda);
}
sub presenta {
local ($query) = @_;
print "en presenta enviaremos: $query<BR>" if ($DBUG == 23);
$result = $conn->exec($query);
cmp_eq("consultando $tabname", PGRES_COMMAND_OK, $result->resultStatus);
cmp_eq("Status $tabname", PGRES_TUPLES_OK, $result->cmdStatus);
my $i = 0;
while (@renglon = $result->fetchrow) {
@{$renglones[$i]} = @renglon;
$i++;
}
$tot = --$i;
$total = $tot + 1;
print $cgi->hr;
print "<H1>Recibimos un total de $total registro",
($total == 1) ? "" : "s","</H1>";
print $cgi->hr;
print "Recibimos un total de $tot registros<BR>" if ($DBUG == 23);
if ($forma1) {
foreach my $i (0..$tot) {
print "<TABLE BORDER=2>";
print "<TR><TD><B>Autor</B></TD>";
print "<TD>@{$renglones[$i]}[0]</TD></TR>\n";
print "<TR><TD><B>Titulo</B></TD>";
print "<TD>@{$renglones[$i]}[1]</TD></TR>\n";
print "<TR><TD><B>NDis</B></TD>";
print "<TD>@{$renglones[$i]}[2]</TD></TR>\n";
print "<TR><TD><B>Medio</B></TD>";
print "<TD>@{$renglones[$i]}[3]</TD></TR>\n";
print "</TABLE>";
print $cgi->hr;
}
} else {
print "<TABLE BORDER=2><TR>";
print "<TD><B>Autor</B></TD>";
print "<TD><B>Título</B></TD>";
print "<TD><B>NDis</B></TD>";
print "<TD><B>Medio</B></TD></TR>";
foreach my $i (0..$tot) {
print "<TR><TD>@{$renglones[$i]}[0]</TD>";
print "<TD>@{$renglones[$i]}[1]</TD>";
print "<TD>@{$renglones[$i]}[2]</TD>";
print "<TD>@{$renglones[$i]}[3]</TD></TR>";
}
print "</TABLE>";
}
close (LOG);
}
sub inicializa {
$dbname = 'discos';
$dbhost = 'caserola';
$tabname = 'discos';
$ellog = '/tmp/consultas.discos';
chomp ($soy = `whoami`);
chomp ($estoy = `hostname`);
$cnt = 1;
print "Yo soy: [$soy]\ny estoy en la maquina: [$estoy]<P>"
if ($DBUG == 23);
$conn = Pg::connectdb("dbname=$dbname host=$dbhost");
cmp_eq("<P>probando conexion", PGRES_CONNECTION_OK, $conn->status);
$db = $conn->db;
cmp_eq("<P>comparando bases", $dbname, $db);
$user = $conn->user;
cmp_ne("<P>comparando usuarios", "", $user);
$host = $conn->host;
cmp_ne("<P>comparando hosts", "", $host);
$port = $conn->port;
cmp_ne("<P>comparando puertos", "", $port);
$result = $conn->exec("SET DateStyle to \'Postgres\'");
cmp_eq("<P>fijando la fecha", $result->resultStatus,
$result->resultStatus);
$manda = "select distinct on autor autor from discos";
print "<P>enviaremos: $manda\n" if ($DBUG > 0);
$result = $conn->exec($manda);
cmp_eq("<P>consultando $tabname", PGRES_COMMAND_OK,
$result->resultStatus);
cmp_eq("<P>Status $tabname", PGRES_TUPLES_OK, $result->cmdStatus);
$cuantos = $result->ntuples;
print "<P>obtuvimos $cuantos autores\n" if ($DBUG > 0);
while ($aux = $result->fetchrow) {
print "<P>($aux)" if ($DBUG > 101);
push (@autores, $aux);
}
@lesartistes = sort @autores;
$manda = "select distinct on titulo titulo from discos";
print "<P>enviaremos: $manda\n" if ($DBUG > 0);
$result = $conn->exec($manda);
cmp_eq("<P>consultando $tabname", PGRES_COMMAND_OK,
$result->resultStatus);
cmp_eq("<P>Status $tabname", PGRES_TUPLES_OK, $result->cmdStatus);
$cuantos = $result->ntuples;
print "<P>obtuvimos $cuantos titulos\n" if ($DBUG > 0);
while ($aux = $result->fetchrow) {
push (@titulos,$aux);
}
@lestitres = sort @titulos;
open(LOG, ">>$ellog") || die "No puedo escribir en $ellog";
}
sub cmp_eq {
my $mns = shift;
my $cmp = shift;
my $ret = shift;
my $msg;
print "<P>$mns: " if ($DBUG > 23);
if ("$cmp" eq "$ret") {
print "<P>ok $cnt\n" if ($DBUG > 23);
} else {
$msg = $conn->errorMessage;
print "<P>error $cnt: $cmp, $ret\n$msg\n" if ($DBUG > 23);
$GranError = 1;
}
$cnt++;
}
sub cmp_ne {
my $mns = shift;
my $cmp = shift;
my $ret = shift;
my $msg;
print "<P>$mns: " if ($DBUG > 23);
if ("$cmp" ne "$ret") {
print "<P>ok $cnt\n" if ($DBUG > 23);
} else {
$msg = $conn->errorMessage;
print "<P>error $cnt: $cmp, $ret\n$msg\n" if ($DBUG > 23);
$GranError = 1;
}
$cnt++;
}