Newsgroup: it.comp.lang.perl
Titolo: cgiwrap e messaggi DBI

Ciao a tutti.
Situazione:
creo una tabella su mysql tramite DBI con uno script
eseguito attraverso un cgiwrapper (cgiwrap)
Problema:
facendo
	$stringa_creaz_db .= "Create TABLE $stringa_nome_tab [bla bla]";
	unless ($sth = $dbh->do( "$stringa_creaz_db")) {
		$err="$DBI::errstr";
		&gestione_errore_generico($err);
		exit;
	}
	&tutto_ok;
va tutto bene se la tabella $stringa_nome_tab NON e' presente nel mio
database e creo dunque correttamente la tabella, oltre a stampare
correttamente sul browser l'avvenuta creazione
Se invece e' presente, la prima riga del mio output NON e'
Content-Type eccetera (anche se la stampo prima di tutto) ma
un warning a runtime del perl (credo sia del perl visto che mi 
indica il numero di linea in cui avviene) : "Table blabla already exist
in /usr/home/.../
crea_tab.pl
 at line xyz"
poi mi visualizza correttamente il Content-Type e tutto il resto.
Ora:
	1) il cgiwrapper NON vuole nulla prima di Content-Type, altrimenti
	   da' un error 500
	2) NON uso "perl -w" (ovvio, altrimenti anche un banale script mi
	   genera l'error 500)
In sostanza l'errore che mi ritorna DBI non resta solo in $DBI::errstr ma
va ANCHE sull'output dello script.
Soluzione:
piu' che altro un workaround (!): faccio preventivamente una "show tables"
su mysql e verifico la presenza o meno del db, ovvero
	$stringa_st="show tables";
 
	unless ($sth = $dbh->prepare( "$stringa_st")) {
		$err="$DBI::errstr";
		&gestione_errore_generico($DATI{nome},$header,$footer,$err);
		exit;
	}
	$sth->execute;
	$stringa_nome_tab="blabla";
 
	while (@array=$sth->fetchrow_array)  {
		if ($stringa_nome_tab eq $array[0]) {
			$err="Tabella $stringa_nome_tab gia' presente";
			&gestione_errore_generico($err);
			exit;
		}
	}
	#per i puristi forse era preferibile usare _ListTables invece di
	#show tables :)
Daccordo ora ho ottenuto quello che volevo... ma mi sembra strano che io
non possa gestire gli errori DBI all'interno di cgiwrap!
Come posso togliere quella stringa di warning a run-time che precede
tutto il resto dell'output?
Grazie e ciao,
Andrea Maestrutti.

 ICQ# 1980563

 tutto il resto dell'output?
Ad esempio con:
    local $SIG{__WARN__} = sub {};
Questo dovrebbe sopprimere l'emissione di qualsivoglia messaggio
di warning (compresi quelli esplicitamente spediti con warn, ecc).
Mi raccomando, metti un blocco { ... } attorno a questo settaggio
e alle istruzioni da cui ti aspetti possano venire i warning, se no
rischi di perderti messaggi importanti (apposta dico "local"...:-).
Alex

Intanto grazie ad Alex ed a Max per le risposte:
non si impara mai abbastanza (e non ci si informa mai
abbastanza... :))
Premesso che funzionano entrambe (e vorrei vedere :),
cosi' giusto per il gusto della discussione, quale delle
2 e' filosficamente la migliore?
Intercettare i warning con la $SIG{__WARN__} oppure
disabilitare i messaggi di DBI?
No flames please! ;)))
Ciao!
*******************************************************
Andrea Maestrutti                          Dree Mistrut

 disabilitare i messaggi di DBI?
Se entrambe funzionano altrettanto bene per te, usa 
la seconda, perche` e` meno generale.
Fai sempre il "minimo possibile" per raggiungere un dato
scopo.
Ricorda che fra le tre virtu` cardinali del programmatore,
la prima e` la pigrizia:-).
Alex

 
	close STDERR; 
;-)
Max