TT#46754 ama "block" and "file" objects WIP

Change-Id: Ie8d5730cc4eabbcc2c907ef49640414fdd4ede4e
(cherry picked from commit 746742259a)
changes/04/25604/1
Rene Krenn 7 years ago
parent 02bc75b81f
commit d01abbc99c

@ -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;
}

@ -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;

@ -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;

@ -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;

@ -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;
}

@ -1,5 +1,4 @@
#dry=0
#skip_errors=0
providers_yml = providers.yml

@ -1,5 +1,4 @@
#dry=0
#skip_errors=0
providers_yml = providers.yml

@ -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();

@ -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

Loading…
Cancel
Save