Detekce lokalizovane promenne

Jan Kasprzak kas na fi.muni.cz
Čtvrtek Duben 19 09:24:25 CEST 2012


	Dobry den,

mam takovy obecny problem, na ktery jsem narazil konkretne u DBI.
Odpojovani z databaze probiha nejak takto (snad jsem se nikde nespletl):

1. odpojuji se pres disconnect:
	nejsem-li v AutoCommit modu, vola se implicitne COMMIT
	(aspon v DBD::Oracle).
2. odpojuji se pres DESTROY:
	nejsem-li v AutoCommit modu
		pokud byl spusteny nejaky SQL prikaz ($dbh->{Executed}),
			vypise se warning
		dale se zavola rollback
	dale se zavola disconnect

No a ted je problem, ze pokud nekdo udela

	{
		local $dbh->{AutoCommit} = 0;
		$dbh->do(q{INSERT INTO ...});
		...
	}

tak vysledkem muze byt COMMIT nebo ROLLBACK podle situace:

- je-li jeste uvnitr toho bloku die, provede se commit
- je-li jeste uvnitr toho bloku disconnect, provede se rollback
- opustime-li blok, provede se commit (pokud nekdo dalsi neda
	explicitni rollback ve svem dalsim lokalnim vypnuti AutoCommitu:
	{ local $dbh->{AutoCommit} = 0; ... $dbh->rollback; }

	Jadro problemu je v tom, ze DBI nezjisti, ze nekdy v minulosti
bylo $dbh->{AutoCommit} lokalizovane a nastavene jinak nez ted.

	Muj obecny dotaz je, jestli umim v tuhle situaci nejak detekovat
- napriklad jestli si lze treba pres nejake tie() nechat zasilat callback
v pripade, ze se hodnota neceho meni opustenim bloku, ve kterem je ta
hodnota lokalizovana (local $ta_hodnota).

	Diky,

-Y.
	
-- 
| Jan "Yenya" Kasprzak  <kas at {fi.muni.cz - work | yenya.net - private}> |
| GPG: ID 1024/D3498839      Fingerprint 0D99A7FB206605D7 8B35FCDE05B18A5E |
| http://www.fi.muni.cz/~kas/    Journal: http://www.fi.muni.cz/~kas/blog/ |
Please don't top post and in particular don't attach entire digests to your
mail or we'll all soon be using bittorrent to read the list.     --Alan Cox


Další informace o konferenci Perl