From ad81846ac22d8b6a625f788e2a48a38764ccf62e Mon Sep 17 00:00:00 2001 From: Rene Krenn Date: Fri, 9 Nov 2018 13:22:00 +0100 Subject: [PATCH] TT#46754 ama "block" and "file" objects WIP Change-Id: Ie8d5730cc4eabbcc2c907ef49640414fdd4ede4e (cherry picked from commit 746742259aa2310edf5ba8b746a5a211684c0c84) --- .../BulkProcessor/Projects/Export/Ama/CDR.pm | 264 +++++++++++++++--- .../Projects/Export/Ama/Format/Block.pm | 71 +++++ .../Projects/Export/Ama/Format/File.pm | 176 ++++++++++++ .../Projects/Export/Ama/Settings.pm | 31 +- .../Projects/Export/Ama/process.pl | 9 +- .../Projects/Export/Ama/settings.cfg | 1 - .../Projects/Export/Ama/settings.debug.cfg | 1 - .../BulkProcessor/Projects/Export/Ama/test.pl | 112 ++++---- .../Massive/Generator/settings.debug.cfg | 4 +- 9 files changed, 539 insertions(+), 130 deletions(-) create mode 100644 lib/NGCP/BulkProcessor/Projects/Export/Ama/Format/Block.pm create mode 100644 lib/NGCP/BulkProcessor/Projects/Export/Ama/Format/File.pm diff --git a/lib/NGCP/BulkProcessor/Projects/Export/Ama/CDR.pm b/lib/NGCP/BulkProcessor/Projects/Export/Ama/CDR.pm index 893e48d..5fa1896 100644 --- a/lib/NGCP/BulkProcessor/Projects/Export/Ama/CDR.pm +++ b/lib/NGCP/BulkProcessor/Projects/Export/Ama/CDR.pm @@ -16,7 +16,7 @@ use threads::shared qw(); #); use NGCP::BulkProcessor::Projects::Export::Ama::Settings qw( - $dry + $skip_errors $export_cdr_multithreading @@ -26,6 +26,7 @@ use NGCP::BulkProcessor::Projects::Export::Ama::Settings qw( $export_cdr_limit $export_cdr_stream ); +#$dry #$deadlock_retries #@providers #$generate_cdr_numofthreads @@ -54,6 +55,20 @@ use NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_export_status_data qw(); #use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_subscribers qw(); +use NGCP::BulkProcessor::Projects::Export::Ama::Format::File qw(); +use NGCP::BulkProcessor::Projects::Export::Ama::Format::Record qw(); +use NGCP::BulkProcessor::Projects::Export::Ama::Format::Structures::Structure0510 qw(); +use NGCP::BulkProcessor::Projects::Export::Ama::Format::Structures::Structure9013 qw(); +use NGCP::BulkProcessor::Projects::Export::Ama::Format::Structures::Structure9014 qw(); + +use NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::CallType qw(); +use NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::Date qw(); +use NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::ServiceFeature qw(); +use NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::SignificantDigitsNextField qw(); +use NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::DomesticInternational qw(); +use NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::ConnectTime qw(); +use NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::ElapsedTime qw(); + use NGCP::BulkProcessor::ConnectorPool qw( get_xa_db destroy_dbs @@ -65,6 +80,8 @@ use NGCP::BulkProcessor::ConnectorPool qw( ##use NGCP::BulkProcessor::RandomString qw(createtmpstring); #use NGCP::BulkProcessor::Array qw(array_to_map); +use NGCP::BulkProcessor::Calendar qw(current_local); + require Exporter; our @ISA = qw(Exporter); our @EXPORT_OK = qw( @@ -83,54 +100,39 @@ sub export_cdrs { static_context => $static_context, process_code => sub { my ($context,$records,$row_offset) = @_; - my $rownum = $row_offset; - my %cdr_id_map = map { $_->[0] => $_->[1]; } @$records; + $context->{rownum} = $row_offset; + $context->{block_cdr_id_map} = { map { $_->[0] => $_->[1]; } @$records }; foreach my $record (@$records) { - return 0 if (defined $export_cdr_limit and $rownum >= $export_cdr_limit); + return 0 if (defined $export_cdr_limit and $context->{rownum} >= $export_cdr_limit); my ($id,$call_id) = @$record; - next unless exists $cdr_id_map{$id}; - - my %dropped = (); + # skip if the cdr belongs to a call already done in this block: + next unless exists $context->{block_cdr_id_map}->{$id}; + # skip if the cdr is pending for flushing to file: + next if exists $context->{file_cdr_id_map}->{$id}; + # skip if call legs/data is incomplete: + next unless _export_cdrs_init_context($context,$call_id); + # go ahead: + foreach my $cdr (@{$context->{cdrs}}) { + $context->{file_cdr_id_map}->{$cdr->{id}} = $cdr->{start_time}; + delete $context->{cdr_id_map}->{$cdr->{id}}; + $context->{rownum} += 1; + } eval { - $context->{db}->db_begin(); - my $cdrs = NGCP::BulkProcessor::Dao::Trunk::accounting::cdr::findby_callidprefix($context->{db}, - $call_id,$export_cdr_joins,$export_cdr_conditions); - - #todo: write. - - foreach my $cdr (@$cdrs) { - #mark exported - NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_export_status_data::upsert_row($context->{db}, - cdr_id => $cdr->{id}, - status_id => $context->{export_status_id}, - export_status => $NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_export_status_data::EXPORTED, - cdr_start_time => $cdr->{start_time}, - ); - _info($context,"export_status set for cdr id $cdr->{id}",1); - $dropped{$cdr->{id}} = delete $cdr_id_map{$cdr->{id}}; - $rownum++; - } - if ($dry) { - $context->{db}->db_rollback(0); - } else { - $context->{db}->db_commit(); - } + $context->{file}->write_record( + get_transfer_in => \&_get_transfer_in, + get_record => \&_get_record, + get_transfer_out => \&_get_transfer_out, + commit_cb => \&_commit_export_status, + context => $context, + ); }; - my $err = $@; - if ($err) { - eval { - $context->{db}->db_rollback(1); - foreach (keys %dropped) { - $cdr_id_map{$_} = $dropped{$_}; - } - }; + if ($@) { if ($skip_errors) { - _warn($context,"problem while exporting call id $call_id (cdr id $id): " . $err); + _warn($context,"problem while exporting call id $call_id (cdr id $id): " . $@); } else { - _error($context,"problem while exporting call id $call_id (cdr id $id): " . $err); + _error($context,"problem while exporting call id $call_id (cdr id $id): " . $@); } } - } return 1; @@ -145,6 +147,22 @@ sub export_cdrs { }, uninit_process_context_code => sub { my ($context)= @_; + + eval { + $context->{file}->close( + get_transfer_out => \&_get_transfer_out, + commit_cb => \&_commit_export_status, + context => $context, + ); + }; + if ($@) { + if ($skip_errors) { + _warn($context,"problem while closing " . $context->{file}->get_file_name() . ": " . $@); + } else { + _error($context,"problem while exporting " . $context->{file}->get_file_name() . ": " . $@); + } + } + undef $context->{db}; destroy_all_dbs(); { @@ -163,6 +181,167 @@ sub export_cdrs { ),$warning_count); } + +sub _export_cdrs_init_context { + + my ($context,$call_id) = @_; + + my $result = 1; + + $context->{call_id} = $call_id; + $context->{cdrs} = NGCP::BulkProcessor::Dao::Trunk::accounting::cdr::findby_callidprefix($context->{db}, + $call_id,$export_cdr_joins,$export_cdr_conditions); + $result &= ((scalar @{$context->{cdrs}}) > 0 ? 1 : 0); + + #$result &= ((scalar @{$context->{cdrs}}) == 4 ? 1 : 0); + + $context->{dt} = current_local(); + $context->{source} = "43011001"; + $context->{destination} = "43011002"; + $context->{duration} = 123.456; + + return $result; + +} + +sub _commit_export_status { + + my %params = @_; + my ( + $context, + ) = @params{qw/ + context + /}; + #my %dropped = (); + eval { + $context->{db}->db_begin(); + foreach my $id (keys %{$context->{block_cdr_id_map}}) { + #mark exported + NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_export_status_data::upsert_row($context->{db}, + cdr_id => $id, + status_id => $context->{export_status_id}, + export_status => $NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_export_status_data::EXPORTED, + cdr_start_time => $context->{block_cdr_id_map}->{$id}->{start_time}, + ); + _info($context,"export_status set for cdr id $id",1); + #$dropped{$cdr_id} = delete $context->{file_cdrs}->{$cdr_id}; + } + + $context->{db}->db_commit(); + + }; + $context->{block_cdr_id_map} = {}; + my $err = $@; + if ($err) { + eval { + $context->{db}->db_rollback(1); + #foreach (keys %dropped) { + # $cdr_id_map{$_} = $dropped{$_}; + #} + }; + eval { + unlink $context->{file}->get_filename(); + }; + die($err); + } + +} + +sub _get_transfer_in { + + my %params = @_; + my ( + $context, + ) = @params{qw/ + context + /}; + return NGCP::BulkProcessor::Projects::Export::Ama::Format::Record->new( + NGCP::BulkProcessor::Projects::Export::Ama::Format::Structures::Structure9013->new( + + rewritten => 0, + sensor_id => '008708', # Graz + + padding => 0, + recording_office_id => '008708', + + date => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::Date::get_ama_date($context->{dt}), + + connect_time => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::ConnectTime::get_connect_time($context->{dt}), + + file_sequence_number => 1, + ) + ); + +} + +sub _get_record { + + my %params = @_; + my ( + $context, + ) = @params{qw/ + context + /}; + return NGCP::BulkProcessor::Projects::Export::Ama::Format::Record->new( + NGCP::BulkProcessor::Projects::Export::Ama::Format::Structures::Structure0510->new( + call_type => $NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::CallType::STATION_PAID, + + rewritten => 0, + sensor_id => '008708', # Graz + + padding => 0, + recording_office_id => '008708', + + date => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::Date::get_ama_date($context->{dt}), + + service_feature => $NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::ServiceFeature::OTHER, + + originating_significant_digits => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::SignificantDigitsNextField::get_number_length($context->{source}), + originating_open_digits_1 => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::SignificantDigitsNextField::get_number_digits_1($context->{source}), + originating_open_digits_2 => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::SignificantDigitsNextField::get_number_digits_2($context->{source}), + + domestic_international => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::DomesticInternational::get_number_domestic_international($context->{destination}), + + terminating_significant_digits => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::SignificantDigitsNextField::get_number_length($context->{destination}), + terminating_open_digits_1 => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::SignificantDigitsNextField::get_number_digits_1($context->{destination}), + terminating_open_digits_2 => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::SignificantDigitsNextField::get_number_digits_2($context->{destination}), + + connect_time => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::ConnectTime::get_connect_time($context->{dt}), + elapsed_time => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::ElapsedTime::get_elapsed_time($context->{duration}), + ) + ); + +} + +sub _get_transfer_out { + + my %params = @_; + my ( + $context, + ) = @params{qw/ + context + /}; + return NGCP::BulkProcessor::Projects::Export::Ama::Format::Record->new( + NGCP::BulkProcessor::Projects::Export::Ama::Format::Structures::Structure9014->new( + + rewritten => 0, + sensor_id => '008708', # Graz + + padding => 0, + recording_office_id => '008708', + + date => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::Date::get_ama_date($context->{dt}), + + connect_time => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::ConnectTime::get_connect_time($context->{dt}), + + #file_sequence_number => 1, + + #=> (scalar @records), + ) + ); + +} + sub _export_cdrs_create_context { my ($context) = @_; @@ -183,6 +362,9 @@ sub _export_cdrs_create_context { _info($context,"export stream '$export_cdr_stream' set"); } + $context->{file} = NGCP::BulkProcessor::Projects::Export::Ama::Format::File->new(); + $context->{file_cdr_id_map} = {}; + return $result; } diff --git a/lib/NGCP/BulkProcessor/Projects/Export/Ama/Format/Block.pm b/lib/NGCP/BulkProcessor/Projects/Export/Ama/Format/Block.pm new file mode 100644 index 0000000..a5fe2bf --- /dev/null +++ b/lib/NGCP/BulkProcessor/Projects/Export/Ama/Format/Block.pm @@ -0,0 +1,71 @@ +package NGCP::BulkProcessor::Projects::Export::Ama::Format::Block; +use strict; + +## no critic + +require Exporter; +our @ISA = qw(Exporter); +our @EXPORT_OK = qw( + +); + +my $block_descriptor_word_length = 8; +my $max_block_length = 2048; #bytes + +sub new { + + my $class = shift; + my $self = bless {}, $class; + $self->{records} = []; + $self->{padded} = 0; + $self->{length} = $block_descriptor_word_length; + + return $self; + +} + +sub add_record { + my $self = shift; + my $record = shift; + my $length; + if (not $self->{padded} and ($length = $self->get_length() + $record->get_length()) <= 2 * $max_block_length) { + push(@{$self->{records}},$record); + $self->{length} = $length; + return 1; + } + return 0; + +} + +sub get_hex { + + my $self = shift; + my $result = $self->_get_block_descriptor_word(); + foreach my $record (@{$self->{records}}) { + $result .= $record->get_hex(); + } + if ($self->{padded}) { + $result .= 'aa' x (2 * $max_block_length - length($result)); + } + return $result; +} + + +sub get_length { + my $self = shift; + return $self->{length}; +} + + +sub _get_block_descriptor_word { + my $self = shift; + return sprintf('%04x',$self->get_length() / 2) . '0000'; + #return total length in bytes (up to 256*256 bytes) +} + +sub set_padded { + my $self = shift; + $self->{padded} = shift; +} + +1; diff --git a/lib/NGCP/BulkProcessor/Projects/Export/Ama/Format/File.pm b/lib/NGCP/BulkProcessor/Projects/Export/Ama/Format/File.pm new file mode 100644 index 0000000..171b5c5 --- /dev/null +++ b/lib/NGCP/BulkProcessor/Projects/Export/Ama/Format/File.pm @@ -0,0 +1,176 @@ +package NGCP::BulkProcessor::Projects::Export::Ama::Format::File; +use strict; + +## no critic + +use NGCP::BulkProcessor::Projects::Export::Ama::Format::Block qw(); + +use NGCP::BulkProcessor::Logging qw( + getlogger +); + +use NGCP::BulkProcessor::LogError qw( + fileerror +); + +require Exporter; +our @ISA = qw(Exporter); +our @EXPORT_OK = qw( + +); + +my $max_blocks = 99; + +sub new { + + my $class = shift; + my $self = bless {}, $class; + $self->reset(); + + return $self; + +} + +sub reset { + my $self = shift; + $self->{current_block} = NGCP::BulkProcessor::Projects::Export::Ama::Format::Block->new(); + $self->{blocks} = [ $self->{current_block} ]; + $self->{record_count} = 0; + +} + +sub add_record { + my $self = shift; + my ($record,$pad) = shift; + my $result; + if (not $self->{current_block}->add_record($record)) { + if ((scalar @{$self->{blocks}}) >= $max_blocks) { + $result = 0; + } else { + $self->{current_block}->set_padded(1); + $self->{current_block} = NGCP::BulkProcessor::Projects::Export::Ama::Format::Block->new(); + push(@{$self->{blocks}},$self->{current_block}); + $result = $self->{current_block}->add_record($record); + $self->{record_count} += 1; + } + } else { + $self->{record_count} += 1; + $self->{current_block}->set_padded(1) if $pad; + $result = 1; + } + return $result; + +} + +sub get_filename { + my $self = shift; + return 'test.ama'; +} + +sub flush { + my $self = shift; + my %params = @_; + my ( + $commit_cb, + ) = @params{qw/ + commit_cb + /}; + #unlink 'test.ama'; + if ((scalar @{$self->{blocks}}) > 0 and (my $filename = $self->get_filename())) { + if (open(my $fh,">:raw",$filename)) { + foreach my $block (@{$self->{blocks}}) { + print $fh pack('H*',$block->get_hex()); + } + close $fh; + &$commit_cb(@_) if defined $commit_cb; + #restdebug($self,"$self->{crt_path} saved",getlogger(__PACKAGE__)); + return 1; + } else { + fileerror('failed to open ' . $filename . ": $!",getlogger(__PACKAGE__)); + return 0; + } + } else { + return 0; + } +} + +sub close { + + my $self = shift; + my %params = @_; + my ( + $get_transfer_out, + $commit_cb, + ) = @params{qw/ + get_transfer_out + commit_cb + /}; + my $result = 0; + $self->add_record( + &$get_transfer_out( + + #file_sequence_number => 1, + + #=> (scalar @records), + @_ + ), + 1, + ); + $result |= $self->flush( + commit_cb => $commit_cb, + @_ + ); + $self->reset(); + return $result; + +} + +sub write_record { + + my $self = shift; + my %params = @_; + my ( + $get_transfer_in, + $get_record, + $get_transfer_out, + $commit_cb, + ) = @params{qw/ + get_transfer_in + get_record + get_transfer_out + commit_cb + /}; + + $self->add_record( + &$get_transfer_in( + #file_sequence_number => 1, + @_, + ), + 1 + ) unless $self->{record_count} > 0; + + my $result = 0; + my $record = &$get_record(@_); + if (not $self->add_record($record)) { + $result |= $self->close( + get_transfer_out => $get_transfer_out, + commit_cb => $commit_cb, + @_ + ); + $self->add_record( + &$get_transfer_in( + + #file_sequence_number => 1, + @_ + ), + 1 + ); + + $self->add_record($record); + } + + return $result; + +} + +1; diff --git a/lib/NGCP/BulkProcessor/Projects/Export/Ama/Settings.pm b/lib/NGCP/BulkProcessor/Projects/Export/Ama/Settings.pm index c5497f5..b0c16e8 100644 --- a/lib/NGCP/BulkProcessor/Projects/Export/Ama/Settings.pm +++ b/lib/NGCP/BulkProcessor/Projects/Export/Ama/Settings.pm @@ -35,15 +35,13 @@ our @ISA = qw(Exporter); our @EXPORT_OK = qw( update_settings - check_dry - $input_path $output_path $defaultsettings $defaultconfig - $dry + $skip_errors $force @@ -57,6 +55,8 @@ our @EXPORT_OK = qw( $domestic_destination_pattern $international_destination_pattern ); +#check_dry +#$dry #update_provider_config #$deadlock_retries #$generate_cdr_count @@ -68,7 +68,7 @@ our $input_path = $working_path . 'input/'; our $output_path = $working_path . 'output/'; our $force = 0; -our $dry = 0; +#our $dry = 0; our $skip_errors = 0; our $export_cdr_multithreading = $enablemultithreading; @@ -102,7 +102,7 @@ sub update_settings { # $report_filename = undef; #} - $dry = $data->{dry} if exists $data->{dry}; + #$dry = $data->{dry} if exists $data->{dry}; $skip_errors = $data->{skip_errors} if exists $data->{skip_errors}; $export_cdr_multithreading = $data->{export_cdr_multithreading} if exists $data->{export_cdr_multithreading}; @@ -196,25 +196,4 @@ sub _parse_export_conditions { return (1,\@conditions); } -sub check_dry { - - if ($dry) { - scriptinfo('running in dry mode - NGCP databases will not be modified',getlogger(__PACKAGE__)); - return 1; - } else { - scriptinfo('NO DRY MODE - NGCP DATABASES WILL BE MODIFIED!',getlogger(__PACKAGE__)); - if (!$force) { - if ('yes' eq lc(prompt("Type 'yes' to proceed: "))) { - return 1; - } else { - return 0; - } - } else { - scriptinfo('force option applied',getlogger(__PACKAGE__)); - return 1; - } - } - -} - 1; diff --git a/lib/NGCP/BulkProcessor/Projects/Export/Ama/process.pl b/lib/NGCP/BulkProcessor/Projects/Export/Ama/process.pl index b80b0ae..af0dc9e 100644 --- a/lib/NGCP/BulkProcessor/Projects/Export/Ama/process.pl +++ b/lib/NGCP/BulkProcessor/Projects/Export/Ama/process.pl @@ -12,15 +12,15 @@ use Fcntl qw(LOCK_EX LOCK_NB); use NGCP::BulkProcessor::Globals qw(); use NGCP::BulkProcessor::Projects::Export::Ama::Settings qw( update_settings - check_dry $output_path $defaultsettings $defaultconfig - $dry $skip_errors $force ); +#$dry +#check_dry #@provider_config #@providers #$providers_yml @@ -99,8 +99,7 @@ sub init { "config=s" => \$configfile, "settings=s" => \$settingsfile, "task=s" => $tasks, - #"run=s" => \$run_id, - "dry" => \$dry, + #"dry" => \$dry, "skip-errors" => \$skip_errors, "force" => \$force, ); # or scripterror('error in command line arguments',getlogger(getscriptpath())); @@ -134,7 +133,7 @@ sub main() { } elsif (lc($export_cdr_task_opt) eq lc($task)) { if (taskinfo($export_cdr_task_opt,$result,1)) { - next unless check_dry(); + #next unless check_dry(); $result &= export_cdr_task(\@messages); $completion |= 1; } diff --git a/lib/NGCP/BulkProcessor/Projects/Export/Ama/settings.cfg b/lib/NGCP/BulkProcessor/Projects/Export/Ama/settings.cfg index 9a37ddd..daf3493 100755 --- a/lib/NGCP/BulkProcessor/Projects/Export/Ama/settings.cfg +++ b/lib/NGCP/BulkProcessor/Projects/Export/Ama/settings.cfg @@ -1,5 +1,4 @@ -#dry=0 #skip_errors=0 providers_yml = providers.yml diff --git a/lib/NGCP/BulkProcessor/Projects/Export/Ama/settings.debug.cfg b/lib/NGCP/BulkProcessor/Projects/Export/Ama/settings.debug.cfg index 7d4cb03..e5387cd 100755 --- a/lib/NGCP/BulkProcessor/Projects/Export/Ama/settings.debug.cfg +++ b/lib/NGCP/BulkProcessor/Projects/Export/Ama/settings.debug.cfg @@ -1,5 +1,4 @@ -#dry=0 #skip_errors=0 providers_yml = providers.yml diff --git a/lib/NGCP/BulkProcessor/Projects/Export/Ama/test.pl b/lib/NGCP/BulkProcessor/Projects/Export/Ama/test.pl index ecdb19a..cd8ea9e 100644 --- a/lib/NGCP/BulkProcessor/Projects/Export/Ama/test.pl +++ b/lib/NGCP/BulkProcessor/Projects/Export/Ama/test.pl @@ -8,6 +8,7 @@ use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../../../'); use NGCP::BulkProcessor::Calendar qw(current_local); +use NGCP::BulkProcessor::Projects::Export::Ama::Format::File qw(); use NGCP::BulkProcessor::Projects::Export::Ama::Format::Record qw(); use NGCP::BulkProcessor::Projects::Export::Ama::Format::Structures::Structure0510 qw(); use NGCP::BulkProcessor::Projects::Export::Ama::Format::Structures::Structure9013 qw(); @@ -26,80 +27,83 @@ my $source = "43011001"; my $destination = "43011002"; my $duration = 123.456; -my $transfer_in = NGCP::BulkProcessor::Projects::Export::Ama::Format::Record->new( - NGCP::BulkProcessor::Projects::Export::Ama::Format::Structures::Structure9013->new( +my $file = NGCP::BulkProcessor::Projects::Export::Ama::Format::File->new( - rewritten => 0, - sensor_id => '008708', # Graz +); - padding => 0, - recording_office_id => '008708', +my $limit = 1000; +my $i = 0; +while ($i < $limit) { + $file->write_record(sub { + return NGCP::BulkProcessor::Projects::Export::Ama::Format::Record->new( + NGCP::BulkProcessor::Projects::Export::Ama::Format::Structures::Structure9013->new( - date => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::Date::get_ama_date($dt), + rewritten => 0, + sensor_id => '008708', # Graz - connect_time => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::ConnectTime::get_connect_time($dt), + padding => 0, + recording_office_id => '008708', - file_sequence_number => 1, - ) -); + date => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::Date::get_ama_date($dt), -my @records = (); -push(@records,NGCP::BulkProcessor::Projects::Export::Ama::Format::Record->new( - NGCP::BulkProcessor::Projects::Export::Ama::Format::Structures::Structure0510->new( - call_type => $NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::CallType::STATION_PAID, + connect_time => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::ConnectTime::get_connect_time($dt), - rewritten => 0, - sensor_id => '008708', # Graz + file_sequence_number => 1, + ) + ); - padding => 0, - recording_office_id => '008708', + }, sub { + return NGCP::BulkProcessor::Projects::Export::Ama::Format::Record->new( + NGCP::BulkProcessor::Projects::Export::Ama::Format::Structures::Structure0510->new( + call_type => $NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::CallType::STATION_PAID, - date => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::Date::get_ama_date($dt), + rewritten => 0, + sensor_id => '008708', # Graz - service_feature => $NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::ServiceFeature::OTHER, + padding => 0, + recording_office_id => '008708', - originating_significant_digits => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::SignificantDigitsNextField::get_number_length($source), - originating_open_digits_1 => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::SignificantDigitsNextField::get_number_digits_1($source), - originating_open_digits_2 => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::SignificantDigitsNextField::get_number_digits_2($source), + date => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::Date::get_ama_date($dt), - domestic_international => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::DomesticInternational::get_number_domestic_international($destination), + service_feature => $NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::ServiceFeature::OTHER, - terminating_significant_digits => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::SignificantDigitsNextField::get_number_length($destination), - terminating_open_digits_1 => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::SignificantDigitsNextField::get_number_digits_1($destination), - terminating_open_digits_2 => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::SignificantDigitsNextField::get_number_digits_2($destination), + originating_significant_digits => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::SignificantDigitsNextField::get_number_length($source), + originating_open_digits_1 => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::SignificantDigitsNextField::get_number_digits_1($source), + originating_open_digits_2 => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::SignificantDigitsNextField::get_number_digits_2($source), - connect_time => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::ConnectTime::get_connect_time($dt), - elapsed_time => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::ElapsedTime::get_elapsed_time($duration), - ) -)); + domestic_international => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::DomesticInternational::get_number_domestic_international($destination), -my $transfer_out = NGCP::BulkProcessor::Projects::Export::Ama::Format::Record->new( - NGCP::BulkProcessor::Projects::Export::Ama::Format::Structures::Structure9014->new( + terminating_significant_digits => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::SignificantDigitsNextField::get_number_length($destination), + terminating_open_digits_1 => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::SignificantDigitsNextField::get_number_digits_1($destination), + terminating_open_digits_2 => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::SignificantDigitsNextField::get_number_digits_2($destination), - rewritten => 0, - sensor_id => '008708', # Graz + connect_time => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::ConnectTime::get_connect_time($dt), + elapsed_time => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::ElapsedTime::get_elapsed_time($duration), + ) + ); + }, sub { - padding => 0, - recording_office_id => '008708', + return NGCP::BulkProcessor::Projects::Export::Ama::Format::Record->new( + NGCP::BulkProcessor::Projects::Export::Ama::Format::Structures::Structure9014->new( - date => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::Date::get_ama_date($dt), + rewritten => 0, + sensor_id => '008708', # Graz + + padding => 0, + recording_office_id => '008708', - connect_time => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::ConnectTime::get_connect_time($dt), + date => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::Date::get_ama_date($dt), - file_sequence_number => 1, + connect_time => NGCP::BulkProcessor::Projects::Export::Ama::Format::Fields::ConnectTime::get_connect_time($dt), - => (scalar @records), - ) -); + file_sequence_number => 1, -print $test->{structure}->to_string()."\n"; -print $test->get_hex(); - -unlink 'test.ama'; -if (open(my $fh,">:raw",'test.ama')) { - print $fh pack('H*','004f0000' . $test->get_hex()); - close $fh; - #restdebug($self,"$self->{crt_path} saved",getlogger(__PACKAGE__)); -} else { - #fileerror("failed to open $self->{crt_path}: $!",getlogger(__PACKAGE__)); + => (scalar @records), + ) + ); + }); + $i++; } + +#print $test->{structure}->to_string()."\n"; +#print $test->get_hex(); \ No newline at end of file diff --git a/lib/NGCP/BulkProcessor/Projects/Massive/Generator/settings.debug.cfg b/lib/NGCP/BulkProcessor/Projects/Massive/Generator/settings.debug.cfg index 4d18144..a37b1c6 100755 --- a/lib/NGCP/BulkProcessor/Projects/Massive/Generator/settings.debug.cfg +++ b/lib/NGCP/BulkProcessor/Projects/Massive/Generator/settings.debug.cfg @@ -8,10 +8,10 @@ webpassword_length = 8 webusername_length = 8 sippassword_length = 16 sipusername_length = 8 -provision_subscriber_count = 30000 +provision_subscriber_count = 1000 providers_yml = providers.yml generate_cdr_multithreading = 1 #generate_cdr_numofthreads = 2 -generate_cdr_count = 5 +generate_cdr_count = 5000