From: Mark Wells Date: Thu, 24 Apr 2014 19:06:48 +0000 (-0700) Subject: avoid excess memory usage in cust_main location upgrade, #28841 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=0296a565242ead37c8b60cd388b5e11c7e03f757 avoid excess memory usage in cust_main location upgrade, #28841 --- diff --git a/FS/FS/Cursor.pm b/FS/FS/Cursor.pm index ec7af93c1..6d02a16ad 100644 --- a/FS/FS/Cursor.pm +++ b/FS/FS/Cursor.pm @@ -57,7 +57,7 @@ sub new { my $sth = dbh->prepare($statement) or die dbh->errstr; - my $bind = 0; + my $bind = 1; foreach my $value ( @{ $q->{value} } ) { my $bind_type = shift @{ $q->{bind_type} }; $sth->bind_param($bind++, $value, $bind_type ); @@ -108,6 +108,12 @@ sub DESTROY { dbh->do('CLOSE '. $self->{id}) or die dbh->errstr; # clean-up the cursor in Pg } +sub DESTROY { + my $self = shift; + my $statement = "CLOSE ".$self->{id}; + dbh->do($statement); +} + =back =head1 TO DO diff --git a/FS/FS/cust_main/Location.pm b/FS/FS/cust_main/Location.pm index 4f382af43..9899f7230 100644 --- a/FS/FS/cust_main/Location.pm +++ b/FS/FS/cust_main/Location.pm @@ -4,6 +4,7 @@ use strict; use vars qw( $DEBUG $me @location_fields ); use FS::Record qw(qsearch qsearchs); use FS::UID qw(dbh); +use FS::Cursor; use FS::cust_location; use Carp qw(carp); @@ -137,6 +138,7 @@ sub _upgrade_data { || new FS::contact_class { classname => 'Service'}; if ( !$service_contact_class->classnum ) { + warn "Creating service contact class.\n"; $error = $service_contact_class->insert; die "error creating contact class for Service: $error" if $error; } @@ -158,11 +160,12 @@ sub _upgrade_data { } } - foreach my $cust_main (qsearch('cust_main', { - bill_locationnum => '', - address1 => { op=>'!=', value=>'' }, - })) - { + warn "Migrating customer locations.\n"; + my $search = FS::Cursor->new('cust_main', + { bill_locationnum => '', + address1 => { op=>'!=', value=>'' } + }); + while (my $cust_main = $search->fetch) { # Step 1: extract billing and service addresses into cust_location my $custnum = $cust_main->custnum; my $bill_location = FS::cust_location->new( @@ -287,9 +290,9 @@ sub _upgrade_data { if $error; # Step 4: set packages at the "default service location" to ship_location - foreach my $cust_pkg ( - qsearch('cust_pkg', { custnum => $custnum, locationnum => '' }) - ) { + my $pkg_search = + FS::Cursor->new('cust_pkg', { custnum => $custnum, locationnum => '' }); + while (my $cust_pkg = $pkg_search->fetch) { # not a location change $cust_pkg->set('locationnum', $cust_main->ship_locationnum); $error = $cust_pkg->replace; @@ -297,7 +300,7 @@ sub _upgrade_data { if $error; } - } #foreach $cust_main + } #while (my $cust_main...) # repair an error in earlier upgrades if (!FS::upgrade_journal->is_done('cust_location_censustract_repair')