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;
}
$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 {
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;
}