=head1 Name

transact

=head1 Ziel

Teste das Transaktions-Handling.

=head1 Tests

Der Code testet das Verändern von Daten mit Transaktionen und
verifiziert, dass nach Fehlern die Daten nicht verändert sind.

=cut


package Test::queues;
use utf8;
use warnings;
use strict; use warnings;
BEGIN { unshift(@INC,($ENV{'POPHOME'}||'@POPHOME@').'/lib')
			unless $ENV{'KUNDE_NO_PERLPATH'};
      }

use Fehler qw(fehler ffehler);

use Test::More tests => 28; $|=1;
use Dbase::Test;


use Dbase::Help qw(DoTransSuspend DoTrans DoTransExit DoTransFail Do DoN DoFn DoSeq);
#use Dbase::Globals qw(gen_descr);
#use Fehler qw();
#use Loader qw();

okF "delete from nextid where name = 'trans_test'";
okF "insert into nextid set name='trans_test', id=1";

is DoSeq('trans_test'),2,"Seq2";

DoTrans {
	is DoSeq('trans_test'),3,"Seq3";
};

is DoSeq('trans_test'),4,"Seq4";

my $err = 0;
ffehler {
	DoTrans {
		is DoSeq('trans_test'),5,"Seq5 (im Fehlerfall, ignoriert)";
		fehler "Bla";
	};
} sub {
	$err++;
};
is $err,1,"Fehler getroffen";

my $id2;
# alter Wert wiederhergestellt?
# local $TODO = "Transaktionen";
is DoSeq('trans_test'),5,"Seq5";

# Hier hatten wir mal Timeouts, aber manche MySQL-Server ignorieren sowas,
# wenn's zu kurz eingestellt wird.
ffehler {
	DoTrans {
		is DoSeq('trans_test'),6,"Seq6 (im Fehlerfall, ignoriert)";
		DoSeq('trans_test');
		fehler "Blubb";
		fail "not reachable";
	};
} sub {
	like("@_",qr/Blubb/,"Raussprung");
};

# nach einem Timeout gibt es wieder eine Datenbank ;-)
okQ "select 1",1;

# alter Wert wiederhergestellt?
is DoSeq('trans_test'),6,"Seq5";

DoTrans {
       is DoSeq('trans_test'),7,"Seq a1";
       DoTransFail();
       is DoSeq('trans_test'),8,"Seq a2";
};

# alter Wert wiederhergestellt?
is DoSeq('trans_test'),7,"Seq6";

DoTrans {
       is DoSeq('trans_test'),8,"Seq b1";
       DoTransFail();
       is DoSeq('trans_test'),9,"Seq b2";
       is DoSeq('trans_test'),10,"Seq b3";
       DoTransExit();
       is DoSeq('trans_test'),8,"Seq b4";
};
is DoSeq('trans_test'),9,"Seq7";

# Unterbrechung?
my $repeat = 1;
DoTrans {
	is DoSeq('trans_test'),10,"Seq8 $repeat";
	fehler("FeHlEr!") if $repeat--;
} 1;
is DoSeq('trans_test'),11,"Seq7";

# Unterbrechnung, die nicht abgefangen werden darf?
$repeat = 1;
ffehler {
	DoTrans {
		is DoSeq('trans_test'),12,"Seq7";
		DoTransSuspend { pass "Transaktion unterbrochen"; };
		is DoSeq('trans_test'),13,"Seq7";
		fehler("FeHlEr!") if $repeat--;
	} 1;
	fail "Fehler abgefangen";
} sub {
	pass "Fehler nicht abgefangen"
};

is DoSeq('trans_test'),13,"Seq7";

