diff options
author | ivan <ivan> | 2009-04-22 00:54:07 +0000 |
---|---|---|
committer | ivan <ivan> | 2009-04-22 00:54:07 +0000 |
commit | 31ac0535a1fc31e690d724932047318c34cf541a (patch) | |
tree | 58778e45a8033b6e3f59ae8f4de71ef36f2d34a2 /FS | |
parent | eaa5b51133cff4062ef1253582f50487561cfbac (diff) |
have the big query find customers in batches. this should be way more efficient in multi-process mode, can start billing before the big query completes. RT#4412
Diffstat (limited to 'FS')
-rw-r--r-- | FS/FS/Cron/bill.pm | 101 |
1 files changed, 57 insertions, 44 deletions
diff --git a/FS/FS/Cron/bill.pm b/FS/FS/Cron/bill.pm index c1cfbae5e..5aeb03a68 100644 --- a/FS/FS/Cron/bill.pm +++ b/FS/FS/Cron/bill.pm @@ -91,50 +91,63 @@ END push @search, "( $where_pkg OR $where_bill_event )"; - ### - # get a list of custnums - ### - - warn "searching for customers:\n". join("\n", @search). "\n" - if $opt{'v'} || $opt{'l'}; - - my $sth = dbh->prepare( - "SELECT custnum FROM cust_main". - " WHERE ". join(' AND ', @search) - ) or die dbh->errstr; - - $sth->execute or die $sth->errstr; - - my @custnums = map { $_->[0] } @{ $sth->fetchall_arrayref }; - - ### - # for each custnum, queue or make one customer object and bill - # (one at a time, to reduce memory footprint with large #s of customers) - ### - - foreach my $custnum ( @custnums ) { - - my %args = ( - 'time' => $time, - 'invoice_time' => $invoice_time, - 'actual_time' => $^T, #when freeside-bill was started - #(not, when using -m, freeside-queued) - 'resetup' => ( $opt{'s'} ? $opt{'s'} : 0 ), - ); - - if ( $opt{'m'} ) { - - #add job to queue that calls bill_and_collect with options - my $queue = new FS::queue { - 'job' => 'FS::cust_main::queued_bill', - 'priority' => 99, #don't get in the way of provisioning jobs - }; - my $error = $queue->insert( 'custnum'=>$custnum, %args ); - - } else { - - my $cust_main = qsearchs( 'cust_main', { 'custnum' => $custnum } ); - $cust_main->bill_and_collect( %args, 'debug' => $debug ); + my $prev_custnum = 0; + while ( 1 ) { + + ### + # get a list of custnums + ### + + warn "searching for customers:\n". + join("\n", @search). + "custnum > $prev_custnum\n" + if $opt{'v'} || $opt{'l'}; + + my $sth = dbh->prepare( + "SELECT custnum FROM cust_main". + " WHERE ". join(' AND ', @search). + " AND custnum > $prev_custnum ". + " ORDER BY custnum LIMIT 100 " + ) or die dbh->errstr; + + $sth->execute or die $sth->errstr; + + my @custnums = map { $_->[0] } @{ $sth->fetchall_arrayref }; + + last unless scalar(@custnums); + + $prev_custnum = $custnums[-1]; + + ### + # for each custnum, queue or make one customer object and bill + # (one at a time, to reduce memory footprint with large #s of customers) + ### + + foreach my $custnum ( @custnums ) { + + my %args = ( + 'time' => $time, + 'invoice_time' => $invoice_time, + 'actual_time' => $^T, #when freeside-bill was started + #(not, when using -m, freeside-queued) + 'resetup' => ( $opt{'s'} ? $opt{'s'} : 0 ), + ); + + if ( $opt{'m'} ) { + + #add job to queue that calls bill_and_collect with options + my $queue = new FS::queue { + 'job' => 'FS::cust_main::queued_bill', + 'priority' => 99, #don't get in the way of provisioning jobs + }; + my $error = $queue->insert( 'custnum'=>$custnum, %args ); + + } else { + + my $cust_main = qsearchs( 'cust_main', { 'custnum' => $custnum } ); + $cust_main->bill_and_collect( %args, 'debug' => $debug ); + + } } |