X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=cgi-auth-hybrid.pm;fp=cgi-auth-hybrid.pm;h=0617881eb1b81224a29301660c5ed3ba1fd24f46;hb=b317fbd689b5ef362192025f797da0d451105f8e;hp=f22083a94b3714fa3b0d16baac0278eb13075144;hpb=fab56651097dfbcb896d161e60a4003eb51143f2;p=cgi-auth-flexible.git diff --git a/cgi-auth-hybrid.pm b/cgi-auth-hybrid.pm index f22083a..0617881 100644 --- a/cgi-auth-hybrid.pm +++ b/cgi-auth-hybrid.pm @@ -209,14 +209,14 @@ sub _dbopen ($) { die "$dsn $! ?" unless $dbh; $v->{Dbh} = $dbh; - $dbh->do("BEGIN"); - eval { - $dbh->do("CREATE TABLE $v->{S}{assocdb_table} (". - " associdh VARCHAR PRIMARY KEY,". - " username VARCHAR,". - " last INTEGER NOT NULL". - ")"); + $r->_db_transaction(sub { + $dbh->do("CREATE TABLE $v->{S}{assocdb_table} (". + " associdh VARCHAR PRIMARY KEY,". + " username VARCHAR,". + " last INTEGER NOT NULL". + ")"); + }); }; return $dbh; } @@ -228,6 +228,29 @@ sub disconnect ($) { $dbh->disconnect(); } +sub _db_transaction ($$) { + my ($r, $fn) = @_; + my $retries = 10; + my $rv; + my $dbh = $v->{Dbh}; + for (;;) { + if (!eval { + $rv = $fn->(); + 1; + }) { + { local ($@); $dbh->rollback(); } + die $@; + } + if (eval { + $dbh->commit(); + 1; + }) { + return $rv; + } + die $@ if !--$retries; + } +} + #---------- request object methods ---------- sub new_request { @@ -550,16 +573,8 @@ sub check_divert ($) { return $r->{Divert}; } my $dbh = $r->{Dbh}; - $dbh->do("BEGIN"); - if (!eval { - $divert = $r->_check_divert_core(); - 1; - }) { - $dbh->do("ABORT"); - die $@; - } - $r->{Divert} = $divert; - $dbh->do("COMMIT"); + $r->{Divert} = $r->_db_transaction(sub { $r->_check_divert_core(); }); + $dbh->commit(); return $divert; }