1 package FS::cdr::Import;
4 use Date::Format 'time2str';
5 use FS::UID qw(adminsuidsetup dbh);
10 use vars qw( $DEBUG );
15 FS::cdr::Import - CDR importing
21 FS::cdr::Import->dbi_import(
22 'dbd' => 'mysql', #Pg, Sybase, etc.
23 'table' => 'TABLE_NAME',
24 'primary_key' => 'BILLING_ID',
25 'column_map' => { #freeside => remote_db
26 'freeside_column' => 'remote_db_column',
27 'freeside_column' => sub { my $row = shift; $row->{remote_db_column}; },
43 my %args = @_; #args are specifed by the script using this sub
45 my %opt; #opt is specified for each install / run of the script
46 getopts('H:U:P:D:T:c:L:', \%opt);
47 my $user = shift(@ARGV) or die $class->cli_usage;
49 $opt{D} ||= $args{database};
51 my $dsn = 'dbi:'. $args{dbd};
52 #$dsn .= ":host=$opt{H}"; #if $opt{H};
53 $dsn .= ":server=$opt{H}"; #if $opt{H};
54 $dsn .= ";database=$opt{D}" if $opt{D};
56 my $dbi = DBI->connect($dsn, $opt{U}, $opt{P})
61 #my $fsdbh = FS::UID::dbh;
63 my $table = $opt{T} || $args{table};
64 my $pkey = $args{primary_key};
66 #just doing this manually with IVR MSSQL databases for now
67 # # check for existence of freesidestatus
68 # my $status = $dbi->selectall_arrayref("SHOW COLUMNS FROM $table WHERE Field = 'freesidestatus'");
70 # print "Adding freesidestatus column...\n";
71 # $dbi->do("ALTER TABLE $table ADD COLUMN freesidestatus varchar(32)")
72 # or die $dbi->errstr;
75 # print "freesidestatus column present\n";
78 #my @cols = values %{ $args{column_map} };
79 my $sql = "SELECT * FROM $table ". # join(',', @cols). " FROM $table ".
81 ' WHERE freesidestatus IS NULL ';
82 #$sql .= ' LIMIT '. $opt{L} if $opt{L};
83 my $sth = $dbi->prepare($sql);
84 $sth->execute or die $sth->errstr. " executing $sql";
85 #MySQL-specific print "Importing ".$sth->rows." records...\n";
87 my $cdr_batch = new FS::cdr_batch({
88 'cdrbatch' => 'IVR-import-'. time2str('%Y/%m/%d-%T',time),
90 my $error = $cdr_batch->insert;
92 my $cdrbatchnum = $cdr_batch->cdrbatchnum;
96 while ( $row = $sth->fetchrow_hashref ) {
98 my %hash = ( 'cdrbatchnum' => $cdrbatchnum );
99 foreach my $field ( keys %{ $args{column_map} } ) {
100 my $col_or_coderef = $args{column_map}->{$field};
101 if ( ref($col_or_coderef) eq 'CODE' ) {
102 $hash{$field} = &{ $col_or_coderef }( $row );
104 $hash{$field} = $row->{ $col_or_coderef };
106 $hash{$field} = '' if $hash{$field} =~ /^\s+$/; #IVR (MSSQL?) bs
108 my $cdr = FS::cdr->new(\%hash);
110 $cdr->cdrtypenum($opt{c}) if $opt{c};
112 #print $row->{$pkey},"\n" if $opt{v};
113 my $error = $cdr->insert;
115 #die $row->{$pkey} . ": failed import: $error\n";
116 print $row->{$pkey} . ": failed import: $error\n";
120 my $updated = $dbi->do(
121 "UPDATE $table SET freesidestatus = 'done' WHERE $pkey = ?",
125 #$updates += $updated;
126 die "failed to set status: ".$dbi->errstr."\n" unless $updated;
129 if ( $opt{L} && $imported >= $opt{L} ) {
136 print "Imported $imported CDRs.\n" if $imported;
143 #"Usage: \n $0\n\t[ -H hostname ]\n\t-D database\n\t-U user\n\t-P password\n\tfreesideuser\n";
144 #"Usage: \n $0\n\t-H hostname\n\t-D database\n\t-U user\n\t-P password\n\t[ -c cdrtypenum ]\n\tfreesideuser\n";
145 "Usage: \n $0\n\t-H hostname\n\t[ -D database ]\n\t-U user\n\t-P password\n\t[ -c cdrtypenum ]\n\t[ -L num_cdrs_limit ]\n\tfreesideuser\n";
150 Not everything has been refactored out of the various bin/cdr-*.import scripts,
151 let alone other places.
153 Sparse documentation.