From d1f9776b822ae835ba5374dca3f76ce3ee76e5dc Mon Sep 17 00:00:00 2001 From: Mark Wells Date: Thu, 19 May 2016 16:57:06 -0700 Subject: [PATCH] fix some dangling records on upgrade, #32456 and #38765 --- FS/FS/Upgrade.pm | 4 +++- FS/FS/cust_pay_pending.pm | 13 +++++++++++++ FS/FS/password_history.pm | 23 +++++++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/FS/FS/Upgrade.pm b/FS/FS/Upgrade.pm index eb2587b34..aa0498e49 100644 --- a/FS/FS/Upgrade.pm +++ b/FS/FS/Upgrade.pm @@ -523,7 +523,9 @@ sub upgrade_schema_data { 'cust_bill_pkg_detail' => [], #add necessary columns to RT schema 'TicketSystem' => [], - + #remove possible dangling records + 'password_history' => [], + 'cust_pay_pending' => [], ; \%hash; diff --git a/FS/FS/cust_pay_pending.pm b/FS/FS/cust_pay_pending.pm index 1a5420385..dfb07b84d 100644 --- a/FS/FS/cust_pay_pending.pm +++ b/FS/FS/cust_pay_pending.pm @@ -470,6 +470,19 @@ sub _upgrade_data { #class method } +sub _upgrade_schema { + my ($class, %opts) = @_; + + # fix records where jobnum points to a nonexistent queue job + my $sql = 'UPDATE cust_pay_pending SET jobnum = NULL + WHERE NOT EXISTS ( + SELECT 1 FROM queue WHERE queue.jobnum = cust_pay_pending.jobnum + )'; + my $sth = dbh->prepare($sql) or die dbh->errstr; + $sth->execute or die $sth->errstr; + ''; +} + =back =head1 BUGS diff --git a/FS/FS/password_history.pm b/FS/FS/password_history.pm index dd527b980..a34f6169b 100644 --- a/FS/FS/password_history.pm +++ b/FS/FS/password_history.pm @@ -160,6 +160,29 @@ sub password_equals { } +sub _upgrade_schema { + # clean up history records where linked_acct has gone away + my @where; + for my $fk ( grep /__/, __PACKAGE__->dbdef_table->columns ) { + my ($table, $key) = split(/__/, $fk); + push @where, " + ( $fk IS NOT NULL AND NOT EXISTS(SELECT 1 FROM $table WHERE $table.$key = $fk) )"; + } + my @recs = qsearch({ + 'table' => 'password_history', + 'extra_sql' => ' WHERE ' . join(' AND ', @where), + }); + my $error; + if (@recs) { + warn "Removing unattached password_history records (".scalar(@recs).").\n"; + foreach my $password_history (@recs) { + $error = $password_history->delete; + die $error if $error; + } + } + ''; +} + =back =head1 BUGS -- 2.11.0