limit memory use when upgrading attachments
[freeside.git] / FS / FS / otaker_Mixin.pm
1 package FS::otaker_Mixin;
2
3 use strict;
4 use Carp qw( croak ); #confess );
5 use FS::Record qw( qsearch qsearchs );
6 use FS::access_user;
7
8 sub otaker {
9   my $self = shift;
10   if ( scalar(@_) ) { #set
11     my $otaker = shift;
12     my $access_user = qsearchs('access_user', { 'username' => $otaker } );
13     if ( !$access_user && $otaker =~ /^(.+), (.+)$/ ) { #same as below..
14       my($lastname, $firstname) = ($1, $2);
15       $otaker = lc($firstname.$lastname);
16       $access_user =  qsearchs('access_user', { 'first' => $firstname, 
17                                                 'last'  => $lastname  } )
18                    || qsearchs('access_user', { 'username' => $otaker } );
19     }
20     croak "can't set otaker: $otaker not found!" unless $access_user; #confess?
21     $self->usernum( $access_user->usernum );
22     $otaker; #not sure return is used anywhere, but just in case
23   } else { #get
24     if ( $self->usernum ) {
25       $self->access_user->username;
26     } elsif ( length($self->get('otaker')) ) {
27       $self->get('otaker');
28     } else {
29       '';
30     }
31   }
32 }
33
34 sub access_user {
35   my $self = shift;
36   qsearchs('access_user', { 'usernum' => $self->usernum } );
37 }
38
39 sub _upgrade_otaker {
40   my $class = shift;
41   my $table = $class->table;
42
43   my $limit = ( $table eq 'cust_attachment' ? 10 : 1000 );
44
45   while ( 1 ) {
46     my @records = qsearch({
47                     'table'     => $table,
48                     'hashref'   => {},
49                     'extra_sql' => "WHERE otaker IS NOT NULL LIMIT $limit",
50                   });
51     last unless @records;
52
53     foreach my $record (@records) {
54       eval { $record->otaker($record->otaker) };
55       if ( $@ ) {
56         my $username = $record->otaker;
57         my($lastname, $firstname) = ( 'User', 'Legacy' );
58         if ( $username =~ /^(.+), (.+)$/ ) {
59           ($lastname, $firstname) = ($1, $2);
60           $username = lc($firstname.$lastname);
61         }
62         my $access_user = new FS::access_user {
63           'username'  => $username,
64           '_password' => 'CHANGEME',
65           'first'     => $firstname,
66           'last'      => $lastname,
67           'disabled'  => 'Y',
68         };
69         my $error = $access_user->insert;
70         die $error if $error;
71         $record->otaker($record->otaker);
72       }
73       $record->set('otaker', '');
74       my $error = $record->replace;
75       die $error if $error;
76     }
77
78   }
79
80 }
81
82 1;