X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2FUpgrade.pm;h=d212d451d5133dd828e9a02870227828a1b2e63b;hb=747fee2b23da71a4c124d610850bc55f71fcaa3c;hp=f559d2e0a44adcfb4f2d670a689b6ea3fb404556;hpb=75977a956e68945d450364784a54fb046f9759dc;p=freeside.git diff --git a/FS/FS/Upgrade.pm b/FS/FS/Upgrade.pm index f559d2e0a..d212d451d 100644 --- a/FS/FS/Upgrade.pm +++ b/FS/FS/Upgrade.pm @@ -8,6 +8,7 @@ use File::Slurp; use FS::UID qw( dbh driver_name ); use FS::Conf; use FS::Record qw(qsearchs qsearch str2time_sql); +use FS::queue; use FS::upgrade_journal; use FS::svc_domain; @@ -153,6 +154,26 @@ sub upgrade { $class->_upgrade_data(%opt); + # New interface for async upgrades: a class can declare a + # "queueable_upgrade" method, which will run as part of the normal + # upgrade, but if the -j option is passed, will instead be run from + # the job queue. + if ( $class->can('queueable_upgrade') ) { + my $jobname = $class . '::queueable_upgrade'; + my $num_jobs = FS::queue->count("job = '$jobname' and status != 'failed'"); + if ($num_jobs > 0) { + warn "$class upgrade already scheduled.\n"; + } else { + if ( $opt{'queue'} ) { + warn "Scheduling $class upgrade.\n"; + my $job = FS::queue->new({ job => $jobname }); + $job->insert($class, %opt); + } else { + $class->queueable_upgrade(%opt); + } + } #$num_jobs == 0 + } + if ( $oldAutoCommit ) { warn " committing\n"; dbh->commit or die dbh->errstr;