package NGCP::Panel::Utils::Lnp; use strict; use warnings; use Text::CSV_XS; use NGCP::Panel::Utils::MySQL; sub _insert_batch { my ($c, $schema, $numbers, $chunk_size) = @_; NGCP::Panel::Utils::MySQL::bulk_insert( c => $c, schema => $schema, do_transaction => 0, query => "INSERT INTO billing.lnp_numbers(lnp_provider_id, number, routing_number, start, end)", data => $numbers, chunk_size => $chunk_size ); } sub upload_csv { my(%params) = @_; my ($c,$data,$schema) = @params{qw/c data schema/}; my ($start, $end); # csv bulk upload my $csv = Text::CSV_XS->new({ allow_whitespace => 1, binary => 1, keep_meta_info => 1 }); #my @cols = @{ $c->config->{lnp_csv}->{element_order} }; my @cols = qw/carrier_name carrier_prefix number routing_number start end/; my @fields ; my @fails = (); my $linenum = 0; my @numbers = (); my %carriers = (); open(my $fh, '<:encoding(utf8)', $data); $start = time; my $chunk_size = 2000; while ( my $line = $csv->getline($fh)) { ++$linenum; unless (scalar @{ $line } == scalar @cols) { push @fails, $linenum; next; } my $row = {}; @{$row}{@cols} = @{ $line }; my $k = $row->{carrier_name}; my $p = $row->{carrier_prefix}; unless(exists $carriers{$k}) { my $carrier = $schema->resultset('lnp_providers')->find_or_create({ name => $k, prefix => $p, }); $carriers{$k} = $carrier->id; } $row->{start} ||= undef; if($row->{start} && $row->{start} =~ /^\d{4}-\d{2}-\d{2}$/) { $row->{start} .= 'T00:00:00'; } $row->{end} ||= undef; if($row->{end} && $row->{end} =~ /^\d{4}-\d{2}-\d{2}$/) { $row->{end} .= 'T23:59:59'; } push @numbers, [$carriers{$k}, $row->{number}, $row->{routing_number}, $row->{start}, $row->{end}]; if($linenum % $chunk_size == 0) { _insert_batch($c, $schema, \@numbers, $chunk_size); @numbers = (); } } if(@numbers) { _insert_batch($c, $schema, \@numbers, $chunk_size); } $end = time; close $fh; $c->log->debug("Parsing and uploading LNP CSV took " . ($end - $start) . "s"); my $text = $c->loc('LNP numbers successfully uploaded'); if(@fails) { $text .= $c->loc(", but skipped the following line numbers: ") . (join ", ", @fails); } return ( \@numbers, \@fails, \$text ); } sub create_csv { my(%params) = @_; my($c) = @params{qw/c/}; #my @cols = @{ $c->config->{lnp_csv}->{element_order} }; my @cols = qw/carrier_name carrier_prefix number routing_number start end/; my $lnp_rs = $c->stash->{number_rs}->search_rs( undef, { '+select' => ['lnp_provider.name','lnp_provider.prefix'], '+as' => ['carrier_name','carrier_prefix'], 'join' => 'lnp_provider', } ); my ($start, $end); $start = time; while(my $lnp_row = $lnp_rs->next) { my %lnp = $lnp_row->get_inflated_columns; delete $lnp{id}; $lnp{start} =~ s/T\d{2}:\d{2}:\d{2}//; $lnp{end} =~ s/T\d{2}:\d{2}:\d{2}//; $c->res->write_fh->write(join (",", @lnp{@cols}) ); $c->res->write_fh->write("\n"); } $c->res->write_fh->close; $end = time; $c->log->debug("Creating LNP CSV for download took " . ($end - $start) . "s"); return 1; } 1; # vim: set tabstop=4 expandtab: