From be6e9d0c7e6b2d13127b1f3be2d482a8da6a6339 Mon Sep 17 00:00:00 2001 From: Michael Andreen Date: Sat, 30 Jan 2010 20:08:52 +0100 Subject: [PATCH] Catch errors in inc reports so we can rollback the transaction if needed --- Commands/Def.pm | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/Commands/Def.pm b/Commands/Def.pm index d16de2d..bdfc677 100644 --- a/Commands/Def.pm +++ b/Commands/Def.pm @@ -233,6 +233,7 @@ command report_incs => { help => q(Used to report incs, same as pasting in pm. Use ~ prefix to send output to channel), type => q(def), }, class extends NDIRC::Command { + use Try::Tiny; method execute($c,$msg) { $msg =~ /(\d+):(\d+):(\d+)\*?\s+(\d+):(\d+):(\d+)\s+([^:]*\S+)\s+(?:Ter|Cat|Xan|Zik|Etd)\s+([\d,]+)\s+Attack\s+(\d+)/ @@ -257,27 +258,27 @@ SELECT nick,alliance,pid,planet_status,relationship FROM current_planet_stats WHERE x = ? AND y = ? AND z = ? }); if (my @attacker = $dbh->selectrow_array($st,undef,$4,$5,$6)){ - $dbh->begin_work; - my $landing_tick = $dbh->selectrow_array(q{SELECT tick() + ?},undef,$9); - my @call = $dbh->selectrow_array(q{ + try { + $dbh->begin_work; + my $landing_tick = $dbh->selectrow_array(q{SELECT tick() + ?},undef,$9); + my @call = $dbh->selectrow_array(q{ SELECT call,status,calc FROM calls WHERE uid = ? AND landing_tick = ? - },undef,$user->{uid},$landing_tick); - my $threefleeter = $dbh->selectrow_array(q{ + },undef,$user->{uid},$landing_tick); + my $threefleeter = $dbh->selectrow_array(q{ SELECT COALESCE(gid = 'X',false) FROM groupmembers WHERE uid = ? AND gid = 'X' - },undef,$user->{uid}); - unless (@call){ #call doesn't exists, create a new one - @call = $dbh->selectrow_array(q{ + },undef,$user->{uid}); + unless (@call){ #call doesn't exists, create a new one + @call = $dbh->selectrow_array(q{ INSERT INTO calls (uid,landing_tick,info) VALUES(?,?,'') RETURNING call,status,calc - },undef,$user->{uid},$landing_tick); - if ($threefleeter){ - $dbh->do(q{UPDATE calls SET status = 'Ignored' WHERE call = $1},undef,$call[0]); - $c->def_log($call[0], 'This member has been marked as [B]NoDef[/B], do [B]not cover[/B] unless you have a good reaon.'); - $call[1] = 'Ignored'; + },undef,$user->{uid},$landing_tick); + if ($threefleeter){ + $dbh->do(q{UPDATE calls SET status = 'Ignored' WHERE call = $1},undef,$call[0]); + $c->def_log($call[0], 'This member has been marked as [B]NoDef[/B], do [B]not cover[/B] unless you have a good reaon.'); + $call[1] = 'Ignored'; + } } - } - if (@call){ my $pointlimits = $dbh->prepare(q{SELECT value :: float FROM misc WHERE id = ?}); my ($minpoints) = $dbh->selectrow_array($pointlimits,undef,'DEFMINPRIO'); my ($maxpoints) = $dbh->selectrow_array($pointlimits,undef,'DEFMAXPRIO'); @@ -315,8 +316,11 @@ SELECT count(*) FROM launch_confirmations WHERE uid = ? AND back = ? if ($fleetcatch > 0){ $c->reply("THIS IS A POSSIBLE FLEETCATCH!"); } - } - $dbh->commit; + $dbh->commit; + } catch { + $dbh->rollback; + die $_; + }; }else{ $c->reply("Didn't find any planet with coordinates $4:$5:$6 at this tick"); } -- 2.39.2