You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1109 lines
42 KiB
1109 lines
42 KiB
package NGCP::BulkProcessor::Projects::Migration::IPGallery::Preferences;
|
|
use strict;
|
|
|
|
## no critic
|
|
|
|
use threads::shared qw();
|
|
#use List::Util qw();
|
|
|
|
use NGCP::BulkProcessor::Projects::Migration::IPGallery::Settings qw(
|
|
$dry
|
|
$skip_errors
|
|
$batch
|
|
|
|
$domain_name
|
|
$reseller_id
|
|
$subsciber_username_prefix
|
|
$set_barring_profiles_multithreading
|
|
$set_barring_profiles_numofthreads
|
|
$barring_profiles
|
|
|
|
$set_peer_auth_multithreading
|
|
$set_peer_auth_numofthreads
|
|
$peer_auth_realm
|
|
|
|
$set_allowed_ips_multithreading
|
|
$set_allowed_ips_numofthreads
|
|
$allowed_ips
|
|
|
|
$set_preference_bulk_multithreading
|
|
$set_preference_bulk_numofthreads
|
|
);
|
|
|
|
use NGCP::BulkProcessor::Logging qw (
|
|
getlogger
|
|
processing_info
|
|
processing_debug
|
|
);
|
|
use NGCP::BulkProcessor::LogError qw(
|
|
rowprocessingerror
|
|
rowprocessingwarn
|
|
);
|
|
|
|
use NGCP::BulkProcessor::Dao::Trunk::billing::ncos_levels qw();
|
|
use NGCP::BulkProcessor::Dao::Trunk::billing::domains qw();
|
|
use NGCP::BulkProcessor::Dao::Trunk::billing::domain_resellers qw();
|
|
use NGCP::BulkProcessor::Dao::Trunk::billing::voip_subscribers qw();
|
|
|
|
use NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Subscriber qw();
|
|
use NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::UsernamePassword qw();
|
|
use NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Batch qw();
|
|
|
|
use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_subscribers qw();
|
|
use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences qw();
|
|
use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_usr_preferences qw();
|
|
use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_aig_sequence qw();
|
|
use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_allowed_ip_groups qw();
|
|
|
|
use NGCP::BulkProcessor::ConnectorPool qw(
|
|
get_xa_db
|
|
);
|
|
|
|
use NGCP::BulkProcessor::Projects::Migration::IPGallery::ProjectConnectorPool qw(
|
|
destroy_all_dbs
|
|
);
|
|
|
|
use NGCP::BulkProcessor::Utils qw(threadid);
|
|
|
|
require Exporter;
|
|
our @ISA = qw(Exporter);
|
|
our @EXPORT_OK = qw(
|
|
set_barring_profiles
|
|
set_barring_profiles_batch
|
|
|
|
set_peer_auth
|
|
set_peer_auth_batch
|
|
|
|
set_allowed_ips
|
|
set_allowed_ips_batch
|
|
|
|
set_preference_bulk
|
|
set_preference_bulk_batch
|
|
|
|
clear_preferences
|
|
set_preference
|
|
get_preference
|
|
|
|
$INIT_PEER_AUTH_MODE
|
|
$SWITCHOVER_PEER_AUTH_MODE
|
|
$CLEAR_PEER_AUTH_MODE
|
|
);
|
|
|
|
our $INIT_PEER_AUTH_MODE = 'init';
|
|
our $SWITCHOVER_PEER_AUTH_MODE = 'switchover';
|
|
our $CLEAR_PEER_AUTH_MODE = 'clear';
|
|
|
|
sub set_barring_profiles {
|
|
|
|
my $static_context = {};
|
|
my $result = _set_barring_profiles_checks($static_context);
|
|
|
|
destroy_all_dbs();
|
|
my $warning_count :shared = 0;
|
|
return ($result && NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Subscriber::process_records(
|
|
static_context => $static_context,
|
|
process_code => sub {
|
|
my ($context,$records,$row_offset) = @_;
|
|
my $rownum = $row_offset;
|
|
foreach my $imported_subscriber (@$records) {
|
|
$rownum++;
|
|
next unless _reset_set_barring_profile_context($context,$imported_subscriber,$rownum);
|
|
_set_barring_profile($context);
|
|
}
|
|
|
|
#return 0;
|
|
return 1;
|
|
},
|
|
init_process_context_code => sub {
|
|
my ($context)= @_;
|
|
$context->{db} = &get_xa_db();
|
|
$context->{error_count} = 0;
|
|
$context->{warning_count} = 0;
|
|
# below is not mandatory..
|
|
_check_insert_tables();
|
|
},
|
|
uninit_process_context_code => sub {
|
|
my ($context)= @_;
|
|
undef $context->{db};
|
|
destroy_all_dbs();
|
|
{
|
|
lock $warning_count;
|
|
$warning_count += $context->{warning_count};
|
|
}
|
|
},
|
|
load_recursive => 0,
|
|
multithreading => $set_barring_profiles_multithreading,
|
|
numofthreads => $set_barring_profiles_numofthreads,
|
|
),$warning_count);
|
|
}
|
|
|
|
sub set_barring_profiles_batch {
|
|
|
|
my $static_context = {};
|
|
my $result = _set_barring_profiles_checks($static_context);
|
|
|
|
destroy_all_dbs();
|
|
my $warning_count :shared = 0;
|
|
return ($result && NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Batch::process_records(
|
|
static_context => $static_context,
|
|
process_code => sub {
|
|
my ($context,$records,$row_offset) = @_;
|
|
my $rownum = $row_offset;
|
|
foreach my $record (@$records) {
|
|
$rownum++;
|
|
my $imported_subscriber = NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Subscriber::findby_subscribernumber($record->{number});
|
|
if (defined $imported_subscriber) {
|
|
next unless _reset_set_barring_profile_context($context,$imported_subscriber,$rownum);
|
|
_set_barring_profile($context);
|
|
} else {
|
|
if ($skip_errors) {
|
|
_warn($context,'record ' . $rownum . ' - no subscriber record for batch number found: ' . $record->{number});
|
|
next;
|
|
} else {
|
|
_error($context,'record ' . $rownum . ' - no subscriber record for batch number found: ' . $record->{number});
|
|
}
|
|
}
|
|
}
|
|
|
|
#return 0;
|
|
return 1;
|
|
},
|
|
init_process_context_code => sub {
|
|
my ($context)= @_;
|
|
$context->{db} = &get_xa_db();
|
|
$context->{error_count} = 0;
|
|
$context->{warning_count} = 0;
|
|
# below is not mandatory..
|
|
_check_insert_tables();
|
|
},
|
|
uninit_process_context_code => sub {
|
|
my ($context)= @_;
|
|
undef $context->{db};
|
|
destroy_all_dbs();
|
|
{
|
|
lock $warning_count;
|
|
$warning_count += $context->{warning_count};
|
|
}
|
|
},
|
|
load_recursive => 0,
|
|
multithreading => $set_barring_profiles_multithreading,
|
|
numofthreads => $set_barring_profiles_numofthreads,
|
|
),$warning_count);
|
|
}
|
|
|
|
sub _check_insert_tables {
|
|
|
|
NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_usr_preferences::check_table();
|
|
|
|
}
|
|
|
|
sub _set_subscriber_preference {
|
|
my ($context,$set_code) = @_;
|
|
|
|
eval {
|
|
$context->{db}->db_begin();
|
|
#rowprocessingwarn($context->{tid},'AutoCommit is on' ,getlogger(__PACKAGE__)) if $context->{db}->{drh}->{AutoCommit};
|
|
|
|
my $existing_billing_voip_subscribers = NGCP::BulkProcessor::Dao::Trunk::billing::voip_subscribers::findby_domainid_username_states($context->{db},
|
|
$context->{billing_domain}->{id},$context->{username},{ 'NOT IN' => $NGCP::BulkProcessor::Dao::Trunk::billing::voip_subscribers::TERMINATED_STATE});
|
|
if ((scalar @$existing_billing_voip_subscribers) == 0) {
|
|
|
|
if ($context->{subscriberdelta} eq
|
|
$NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Subscriber::deleted_delta) {
|
|
_info($context,"($context->{rownum}) " . 'subscriber ' . $context->{cli} . ' is deleted, and no active subscriber found',1);
|
|
} else {
|
|
_warn($context,"($context->{rownum}) no active subscriber found for susbcriber " . $context->{cli});
|
|
}
|
|
} elsif ((scalar @$existing_billing_voip_subscribers) == 1) {
|
|
$context->{billing_voip_subscriber} = $existing_billing_voip_subscribers->[0];
|
|
$context->{provisioning_voip_subscriber} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_subscribers::findby_uuid(
|
|
$context->{db},$context->{billing_voip_subscriber}->{uuid});
|
|
if (defined $context->{provisioning_voip_subscriber}) {
|
|
if ($context->{subscriberdelta} eq
|
|
$NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Subscriber::deleted_delta) {
|
|
|
|
_warn($context,"($context->{rownum}) " . 'subscriber ' . $context->{cli} . ' is deleted, but active subscriber found');
|
|
|
|
} else {
|
|
if (defined $set_code and 'CODE' eq ref $set_code) {
|
|
&$set_code($context);
|
|
}
|
|
}
|
|
} else {
|
|
if ($skip_errors) {
|
|
_warn($context,"($context->{rownum}) " . 'no provisioning subscriber found: ' . $context->{cli});
|
|
} else {
|
|
_error($context,"($context->{rownum}) " . 'no provisioning subscriber found: ' . $context->{cli});
|
|
}
|
|
}
|
|
} else {
|
|
rowprocessingwarn($context->{tid},"($context->{rownum}) " . 'multiple (' . (scalar @$existing_billing_voip_subscribers) . ') existing billing subscribers with username ' . $context->{username} . ' found, skipping' ,getlogger(__PACKAGE__));
|
|
}
|
|
|
|
if ($dry) {
|
|
$context->{db}->db_rollback(0);
|
|
} else {
|
|
$context->{db}->db_commit();
|
|
}
|
|
|
|
};
|
|
my $err = $@;
|
|
if ($err) {
|
|
eval {
|
|
$context->{db}->db_rollback(1);
|
|
};
|
|
die($err) if !$skip_errors;
|
|
}
|
|
|
|
}
|
|
|
|
sub _set_barring_profile {
|
|
my ($context) = @_;
|
|
_set_subscriber_preference($context,\&_set_adm_ncos);
|
|
}
|
|
|
|
sub _checks {
|
|
|
|
my ($context) = @_;
|
|
|
|
my $result = 1;
|
|
#my $optioncount = 0;
|
|
#eval {
|
|
# $optioncount = NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::FeatureOption::countby_subscribernumber_option();
|
|
#};
|
|
#if ($@ or $optioncount == 0) {
|
|
# rowprocessingerror(threadid(),'please import subscriber features first',getlogger(__PACKAGE__));
|
|
# $result = 0; #even in skip-error mode..
|
|
#}
|
|
my $userpasswordcount = 0;
|
|
eval {
|
|
$userpasswordcount = NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::UsernamePassword::countby_fqdn();
|
|
};
|
|
if ($@ or $userpasswordcount == 0) {
|
|
rowprocessingerror(threadid(),'please import user passwords first',getlogger(__PACKAGE__));
|
|
$result = 0; #even in skip-error mode..
|
|
}
|
|
my $subscribercount = 0;
|
|
my $subscriber_barring_profiles = [];
|
|
eval {
|
|
$subscribercount = NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Subscriber::countby_subscribernumber();
|
|
$subscriber_barring_profiles = NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Subscriber::list_barringprofiles();
|
|
};
|
|
if ($@ or $subscribercount == 0) {
|
|
rowprocessingerror(threadid(),'please import subscribers first',getlogger(__PACKAGE__));
|
|
$result = 0; #even in skip-error mode..
|
|
}
|
|
|
|
if ($batch) {
|
|
my $batch_size = 0;
|
|
eval {
|
|
$batch_size = NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Batch::countby_delta({ 'NOT IN' =>
|
|
$NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Batch::deleted_delta});
|
|
};
|
|
if ($@ or $batch_size == 0) {
|
|
rowprocessingerror(threadid(),'please import a batch first',getlogger(__PACKAGE__));
|
|
$result = 0; #even in skip-error mode..
|
|
}
|
|
}
|
|
|
|
eval {
|
|
$context->{billing_domain} = NGCP::BulkProcessor::Dao::Trunk::billing::domains::findby_domain($domain_name);
|
|
if (defined $context->{billing_domain}
|
|
and NGCP::BulkProcessor::Dao::Trunk::billing::domain_resellers::countby_domainid_resellerid($context->{billing_domain}->{id},$reseller_id) == 0) {
|
|
undef $context->{billing_domain};
|
|
}
|
|
};
|
|
if ($@ or not defined $context->{billing_domain}) {
|
|
rowprocessingerror(threadid(),'cannot find billing domain',getlogger(__PACKAGE__));
|
|
$result = 0; #even in skip-error mode..
|
|
}
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
sub _set_barring_profiles_checks {
|
|
my ($context) = @_;
|
|
|
|
my $result = _checks($context);
|
|
|
|
my $subscriber_barring_profiles = [];
|
|
eval {
|
|
$subscriber_barring_profiles = NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Subscriber::list_barringprofiles();
|
|
};
|
|
if ($@ or (scalar @$subscriber_barring_profiles) == 0) {
|
|
rowprocessingerror(threadid(),'subscribers have no barring profiles',getlogger(__PACKAGE__));
|
|
$result = 0; #even in skip-error mode..
|
|
}
|
|
|
|
$context->{ncos_level_map} = {};
|
|
foreach my $barring_profile (@$subscriber_barring_profiles) {
|
|
if (not exists $barring_profiles->{$barring_profile}) {
|
|
rowprocessingerror(threadid(),"mapping for barring profile '" . $barring_profile . "' missing",getlogger(__PACKAGE__));
|
|
#$result = 0; #even in skip-error mode..
|
|
} else {
|
|
my $level = $barring_profiles->{$barring_profile};
|
|
if (not defined $level or length($level) == 0) {
|
|
$context->{ncos_level_map}->{$barring_profile} = undef;
|
|
} else {
|
|
eval {
|
|
$context->{ncos_level_map}->{$barring_profile} = NGCP::BulkProcessor::Dao::Trunk::billing::ncos_levels::findby_resellerid_level(
|
|
$reseller_id,$level);
|
|
};
|
|
if ($@ or not defined $context->{ncos_level_map}->{$barring_profile}) {
|
|
rowprocessingerror(threadid(),"cannot find ncos level '$level'",getlogger(__PACKAGE__));
|
|
$result = 0; #even in skip-error mode..
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
eval {
|
|
$context->{adm_ncos_id_attribute} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::findby_attribute(
|
|
$NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::ADM_NCOS_ID_ATTRIBUTE);
|
|
};
|
|
if ($@ or not defined $context->{adm_ncos_id_attribute}) {
|
|
rowprocessingerror(threadid(),'cannot find adm_ncos_id attribute',getlogger(__PACKAGE__));
|
|
$result = 0; #even in skip-error mode..
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
sub _set_adm_ncos {
|
|
|
|
my ($context) = @_;
|
|
|
|
$context->{adm_ncos_id_preference_id} = set_preference($context,$context->{provisioning_voip_subscriber}->{id},
|
|
$context->{adm_ncos_id_attribute},defined $context->{ncos_level} ? $context->{ncos_level}->{id} : undef);
|
|
|
|
_info($context,"($context->{rownum}) " . 'subscriber ' . $context->{cli} . ': ncos level ' .
|
|
(defined $context->{ncos_level} ? "'" . $context->{ncos_level}->{level} . "' set" : 'cleared') .
|
|
" for barring profile '" . $context->{barring_profile} . "'",1);
|
|
|
|
}
|
|
|
|
sub _reset_context {
|
|
|
|
my ($context,$imported_subscriber,$rownum) = @_;
|
|
|
|
my $result = 1;
|
|
|
|
$context->{rownum} = $rownum;
|
|
|
|
$context->{cli} = $imported_subscriber->subscribernumber();
|
|
$context->{e164} = {};
|
|
$context->{e164}->{cc} = substr($context->{cli},0,3);
|
|
$context->{e164}->{ac} = '';
|
|
$context->{e164}->{sn} = substr($context->{cli},3);
|
|
|
|
$context->{subscriberdelta} = $imported_subscriber->{delta};
|
|
|
|
my $userpassword = NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::UsernamePassword::findby_fqdn($context->{cli});
|
|
if (defined $userpassword) {
|
|
$context->{username} = (defined $subsciber_username_prefix ? $subsciber_username_prefix : '') . $userpassword->{username};
|
|
$context->{password} = $userpassword->{password};
|
|
$context->{userpassworddelta} = $userpassword->{delta};
|
|
} else {
|
|
# once full username+passwords is available:
|
|
delete $context->{username};
|
|
delete $context->{password};
|
|
delete $context->{userpassworddelta};
|
|
if ($context->{subscriberdelta} eq
|
|
$NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Subscriber::deleted_delta) {
|
|
|
|
} else {
|
|
$result &= 0;
|
|
|
|
# for now, as username+passwords are incomplete:
|
|
#$context->{username} = $context->{e164}->{sn};
|
|
#$context->{password} = $context->{username};
|
|
#$context->{userpassworddelta} = $NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::UsernamePassword::updated_delta;
|
|
|
|
if ($skip_errors) {
|
|
# for now, as username+passwords are incomplete:
|
|
_warn($context,"($context->{rownum}) " . 'no username/password for subscriber found: ' . $context->{cli});
|
|
} else {
|
|
_error($context,"($context->{rownum}) " . 'no username/password for subscriber found: ' . $context->{cli});
|
|
}
|
|
}
|
|
}
|
|
|
|
delete $context->{billing_voip_subscriber};
|
|
delete $context->{provisioning_voip_subscriber};
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
sub _reset_set_barring_profile_context {
|
|
|
|
my ($context,$imported_subscriber,$rownum) = @_;
|
|
|
|
my $result = _reset_context($context,$imported_subscriber,$rownum);
|
|
|
|
$context->{barring_profile} = $imported_subscriber->{barring_profile};
|
|
$context->{ncos_level} = $context->{ncos_level_map}->{$context->{barring_profile}};
|
|
|
|
delete $context->{adm_ncos_id_preference_id};
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub set_peer_auth {
|
|
|
|
my ($mode) = @_;
|
|
my $static_context = { mode => $mode };
|
|
my $result = _set_peer_auth_checks($static_context);
|
|
|
|
destroy_all_dbs();
|
|
my $warning_count :shared = 0;
|
|
return ($result && NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Subscriber::process_records(
|
|
static_context => $static_context,
|
|
process_code => sub {
|
|
my ($context,$records,$row_offset) = @_;
|
|
my $rownum = $row_offset;
|
|
foreach my $imported_subscriber (@$records) {
|
|
$rownum++;
|
|
next unless _reset_set_peer_auth_context($context,$imported_subscriber,$rownum);
|
|
_set_peer_auth($context);
|
|
}
|
|
|
|
#return 0;
|
|
return 1;
|
|
},
|
|
init_process_context_code => sub {
|
|
my ($context)= @_;
|
|
$context->{db} = &get_xa_db();
|
|
$context->{error_count} = 0;
|
|
$context->{warning_count} = 0;
|
|
# below is not mandatory..
|
|
_check_insert_tables();
|
|
},
|
|
uninit_process_context_code => sub {
|
|
my ($context)= @_;
|
|
undef $context->{db};
|
|
destroy_all_dbs();
|
|
{
|
|
lock $warning_count;
|
|
$warning_count += $context->{warning_count};
|
|
}
|
|
},
|
|
load_recursive => 0,
|
|
multithreading => $set_peer_auth_multithreading,
|
|
numofthreads => $set_peer_auth_numofthreads,
|
|
),$warning_count);
|
|
}
|
|
|
|
sub set_peer_auth_batch {
|
|
|
|
my ($mode) = @_;
|
|
my $static_context = { mode => $mode };
|
|
my $result = _set_peer_auth_checks($static_context);
|
|
|
|
destroy_all_dbs();
|
|
my $warning_count :shared = 0;
|
|
return ($result && NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Batch::process_records(
|
|
static_context => $static_context,
|
|
process_code => sub {
|
|
my ($context,$records,$row_offset) = @_;
|
|
my $rownum = $row_offset;
|
|
foreach my $record (@$records) {
|
|
$rownum++;
|
|
my $imported_subscriber = NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Subscriber::findby_subscribernumber($record->{number});
|
|
if (defined $imported_subscriber) {
|
|
next unless _reset_set_peer_auth_context($context,$imported_subscriber,$rownum);
|
|
_set_peer_auth($context);
|
|
} else {
|
|
if ($skip_errors) {
|
|
_warn($context,'record ' . $rownum . ' - no subscriber record for batch number found: ' . $record->{number});
|
|
next;
|
|
} else {
|
|
_error($context,'record ' . $rownum . ' - no subscriber record for batch number found: ' . $record->{number});
|
|
}
|
|
}
|
|
}
|
|
|
|
#return 0;
|
|
return 1;
|
|
},
|
|
init_process_context_code => sub {
|
|
my ($context)= @_;
|
|
$context->{db} = &get_xa_db();
|
|
$context->{error_count} = 0;
|
|
$context->{warning_count} = 0;
|
|
# below is not mandatory..
|
|
_check_insert_tables();
|
|
},
|
|
uninit_process_context_code => sub {
|
|
my ($context)= @_;
|
|
undef $context->{db};
|
|
destroy_all_dbs();
|
|
{
|
|
lock $warning_count;
|
|
$warning_count += $context->{warning_count};
|
|
}
|
|
},
|
|
load_recursive => 0,
|
|
multithreading => $set_peer_auth_multithreading,
|
|
numofthreads => $set_peer_auth_numofthreads,
|
|
),$warning_count);
|
|
}
|
|
|
|
sub _set_peer_auth {
|
|
my ($context) = @_;
|
|
_set_subscriber_preference($context,\&_set_peer_auth_preferences);
|
|
}
|
|
|
|
sub _set_peer_auth_checks {
|
|
my ($context) = @_;
|
|
|
|
my $result = _checks($context);
|
|
|
|
eval {
|
|
$context->{peer_auth_user_attribute} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::findby_attribute(
|
|
$NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::PEER_AUTH_USER);
|
|
};
|
|
if ($@ or not defined $context->{peer_auth_user_attribute}) {
|
|
rowprocessingerror(threadid(),'cannot find peer_auth_user attribute',getlogger(__PACKAGE__));
|
|
$result = 0; #even in skip-error mode..
|
|
}
|
|
|
|
eval {
|
|
$context->{peer_auth_pass_attribute} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::findby_attribute(
|
|
$NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::PEER_AUTH_PASS);
|
|
};
|
|
if ($@ or not defined $context->{peer_auth_pass_attribute}) {
|
|
rowprocessingerror(threadid(),'cannot find peer_auth_pass attribute',getlogger(__PACKAGE__));
|
|
$result = 0; #even in skip-error mode..
|
|
}
|
|
|
|
eval {
|
|
$context->{peer_auth_realm_attribute} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::findby_attribute(
|
|
$NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::PEER_AUTH_REALM);
|
|
};
|
|
if ($@ or not defined $context->{peer_auth_realm_attribute}) {
|
|
rowprocessingerror(threadid(),'cannot find peer_auth_realm attribute',getlogger(__PACKAGE__));
|
|
$result = 0; #even in skip-error mode..
|
|
}
|
|
|
|
eval {
|
|
$context->{peer_auth_register_attribute} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::findby_attribute(
|
|
$NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::PEER_AUTH_REGISTER);
|
|
};
|
|
if ($@ or not defined $context->{peer_auth_register_attribute}) {
|
|
rowprocessingerror(threadid(),'cannot find peer_auth_register attribute',getlogger(__PACKAGE__));
|
|
$result = 0; #even in skip-error mode..
|
|
}
|
|
|
|
eval {
|
|
$context->{force_inbound_calls_to_peer_attribute} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::findby_attribute(
|
|
$NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::FORCE_INBOUND_CALLS_TO_PEER);
|
|
};
|
|
if ($@ or not defined $context->{force_inbound_calls_to_peer_attribute}) {
|
|
rowprocessingerror(threadid(),'cannot find force_inbound_calls_to_peer attribute',getlogger(__PACKAGE__));
|
|
$result = 0; #even in skip-error mode..
|
|
}
|
|
|
|
#eval {
|
|
# $context->{force_outbound_calls_to_peer_attribute} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::findby_attribute(
|
|
# $NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::FORCE_OUTBOUND_CALLS_TO_PEER);
|
|
#};
|
|
#if ($@ or not defined $context->{force_outbound_calls_to_peer_attribute}) {
|
|
# rowprocessingerror(threadid(),'cannot find force_outbound_calls_to_peer attribute',getlogger(__PACKAGE__));
|
|
# $result = 0; #even in skip-error mode..
|
|
#}
|
|
|
|
return $result;
|
|
}
|
|
|
|
sub _set_peer_auth_preferences {
|
|
|
|
my ($context) = @_;
|
|
|
|
if ($INIT_PEER_AUTH_MODE eq $context->{mode}) {
|
|
|
|
$context->{peer_auth_user_preference_id} = set_preference($context,$context->{provisioning_voip_subscriber}->{id},
|
|
$context->{peer_auth_user_attribute},$context->{username});
|
|
$context->{peer_auth_pass_preference_id} = set_preference($context,$context->{provisioning_voip_subscriber}->{id},
|
|
$context->{peer_auth_pass_attribute},$context->{password});
|
|
$context->{peer_auth_realm_preference_id} = set_preference($context,$context->{provisioning_voip_subscriber}->{id},
|
|
$context->{peer_auth_realm_attribute},$context->{realm});
|
|
|
|
$context->{peer_auth_register_attribute_preference_id} = set_preference($context,$context->{provisioning_voip_subscriber}->{id},
|
|
$context->{peer_auth_register_attribute},$NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_usr_preferences::FALSE);
|
|
$context->{force_inbound_calls_to_peer_preference_id} = set_preference($context,$context->{provisioning_voip_subscriber}->{id},
|
|
$context->{force_inbound_calls_to_peer_attribute},$NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_usr_preferences::TRUE);
|
|
|
|
_info($context,"($context->{rownum}) " . $context->{mode} . ' peer authentication preferences for subscriber ' . $context->{cli},1);
|
|
|
|
} elsif ($SWITCHOVER_PEER_AUTH_MODE eq $context->{mode}) {
|
|
|
|
$context->{peer_auth_user_preference_id} = set_preference($context,$context->{provisioning_voip_subscriber}->{id},
|
|
$context->{peer_auth_user_attribute},$context->{username});
|
|
$context->{peer_auth_pass_preference_id} = set_preference($context,$context->{provisioning_voip_subscriber}->{id},
|
|
$context->{peer_auth_pass_attribute},$context->{password});
|
|
$context->{peer_auth_realm_preference_id} = set_preference($context,$context->{provisioning_voip_subscriber}->{id},
|
|
$context->{peer_auth_realm_attribute},$context->{realm});
|
|
|
|
$context->{peer_auth_register_attribute_preference_id} = set_preference($context,$context->{provisioning_voip_subscriber}->{id},
|
|
$context->{peer_auth_register_attribute},$NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_usr_preferences::TRUE);
|
|
$context->{force_inbound_calls_to_peer_preference_id} = set_preference($context,$context->{provisioning_voip_subscriber}->{id},
|
|
$context->{force_inbound_calls_to_peer_attribute},$NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_usr_preferences::FALSE);
|
|
|
|
_info($context,"($context->{rownum}) " . $context->{mode} . ' peer authentication preferences for subscriber ' . $context->{cli},1);
|
|
|
|
} elsif ($CLEAR_PEER_AUTH_MODE eq $context->{mode}) {
|
|
|
|
$context->{peer_auth_user_preference_id} = set_preference($context,$context->{provisioning_voip_subscriber}->{id},
|
|
$context->{peer_auth_user_attribute},undef);
|
|
$context->{peer_auth_pass_preference_id} = set_preference($context,$context->{provisioning_voip_subscriber}->{id},
|
|
$context->{peer_auth_pass_attribute},undef);
|
|
$context->{peer_auth_realm_preference_id} = set_preference($context,$context->{provisioning_voip_subscriber}->{id},
|
|
$context->{peer_auth_realm_attribute},undef);
|
|
|
|
$context->{peer_auth_register_attribute_preference_id} = set_preference($context,$context->{provisioning_voip_subscriber}->{id},
|
|
$context->{peer_auth_register_attribute},undef);
|
|
$context->{force_inbound_calls_to_peer_preference_id} = set_preference($context,$context->{provisioning_voip_subscriber}->{id},
|
|
$context->{force_inbound_calls_to_peer_attribute},undef);
|
|
|
|
_info($context,"($context->{rownum}) " . $context->{mode} . ' peer authentication preferences for subscriber ' . $context->{cli},1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
sub _reset_set_peer_auth_context {
|
|
|
|
my ($context,$imported_subscriber,$rownum) = @_;
|
|
|
|
my $result = _reset_context($context,$imported_subscriber,$rownum);
|
|
|
|
$context->{realm} = $peer_auth_realm;
|
|
#$context->{mode} = $mode;
|
|
|
|
delete $context->{peer_auth_user_preference_id};
|
|
delete $context->{peer_auth_pass_preference_id};
|
|
delete $context->{peer_auth_realm_preference_id};
|
|
|
|
delete $context->{peer_auth_register_attribute_preference_id};
|
|
delete $context->{force_inbound_calls_to_peer_preference_id};
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
|
sub set_allowed_ips {
|
|
|
|
my ($mode) = @_;
|
|
my $static_context = { mode => $mode };
|
|
my $result = _set_allowed_ips_checks($static_context);
|
|
|
|
destroy_all_dbs();
|
|
my $warning_count :shared = 0;
|
|
return ($result && NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Subscriber::process_records(
|
|
static_context => $static_context,
|
|
process_code => sub {
|
|
my ($context,$records,$row_offset) = @_;
|
|
my $rownum = $row_offset;
|
|
foreach my $imported_subscriber (@$records) {
|
|
$rownum++;
|
|
next unless _reset_set_allowed_ips_context($context,$imported_subscriber,$rownum);
|
|
_set_allowed_ips($context);
|
|
}
|
|
|
|
#return 0;
|
|
return 1;
|
|
},
|
|
init_process_context_code => sub {
|
|
my ($context)= @_;
|
|
$context->{db} = &get_xa_db();
|
|
$context->{error_count} = 0;
|
|
$context->{warning_count} = 0;
|
|
# below is not mandatory..
|
|
_check_insert_tables();
|
|
},
|
|
uninit_process_context_code => sub {
|
|
my ($context)= @_;
|
|
undef $context->{db};
|
|
destroy_all_dbs();
|
|
{
|
|
lock $warning_count;
|
|
$warning_count += $context->{warning_count};
|
|
}
|
|
},
|
|
load_recursive => 0,
|
|
multithreading => $set_allowed_ips_multithreading,
|
|
numofthreads => $set_allowed_ips_numofthreads,
|
|
),$warning_count);
|
|
}
|
|
|
|
sub set_allowed_ips_batch {
|
|
|
|
my ($mode) = @_;
|
|
my $static_context = { mode => $mode };
|
|
my $result = _set_allowed_ips_checks($static_context);
|
|
|
|
destroy_all_dbs();
|
|
my $warning_count :shared = 0;
|
|
return ($result && NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Batch::process_records(
|
|
static_context => $static_context,
|
|
process_code => sub {
|
|
my ($context,$records,$row_offset) = @_;
|
|
my $rownum = $row_offset;
|
|
foreach my $record (@$records) {
|
|
$rownum++;
|
|
my $imported_subscriber = NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Subscriber::findby_subscribernumber($record->{number});
|
|
if (defined $imported_subscriber) {
|
|
next unless _reset_set_allowed_ips_context($context,$imported_subscriber,$rownum);
|
|
_set_allowed_ips($context);
|
|
} else {
|
|
if ($skip_errors) {
|
|
_warn($context,'record ' . $rownum . ' - no subscriber record for batch number found: ' . $record->{number});
|
|
next;
|
|
} else {
|
|
_error($context,'record ' . $rownum . ' - no subscriber record for batch number found: ' . $record->{number});
|
|
}
|
|
}
|
|
}
|
|
|
|
#return 0;
|
|
return 1;
|
|
},
|
|
init_process_context_code => sub {
|
|
my ($context)= @_;
|
|
$context->{db} = &get_xa_db();
|
|
$context->{error_count} = 0;
|
|
$context->{warning_count} = 0;
|
|
# below is not mandatory..
|
|
_check_insert_tables();
|
|
},
|
|
uninit_process_context_code => sub {
|
|
my ($context)= @_;
|
|
undef $context->{db};
|
|
destroy_all_dbs();
|
|
{
|
|
lock $warning_count;
|
|
$warning_count += $context->{warning_count};
|
|
}
|
|
},
|
|
load_recursive => 0,
|
|
multithreading => $set_allowed_ips_multithreading,
|
|
numofthreads => $set_allowed_ips_numofthreads,
|
|
),$warning_count);
|
|
}
|
|
|
|
sub _set_allowed_ips {
|
|
my ($context) = @_;
|
|
_set_subscriber_preference($context,\&_set_allowed_ips_preferences);
|
|
}
|
|
|
|
sub _set_allowed_ips_checks {
|
|
my ($context) = @_;
|
|
|
|
my $result = _checks($context);
|
|
|
|
eval {
|
|
$context->{allowed_ips_grp_attribute} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::findby_attribute(
|
|
$NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::ALLOWED_IPS_GRP_ATTRIBUTE);
|
|
};
|
|
if ($@ or not defined $context->{allowed_ips_grp_attribute}) {
|
|
rowprocessingerror(threadid(),'cannot find allowed_ips_grp attribute',getlogger(__PACKAGE__));
|
|
$result = 0; #even in skip-error mode..
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
sub _set_allowed_ips_preferences {
|
|
|
|
my ($context) = @_;
|
|
|
|
my $subscriber_id = $context->{provisioning_voip_subscriber}->{id};
|
|
my $attribute = $context->{allowed_ips_grp_attribute};
|
|
|
|
my $allowed_ips_grp_attribute_preference = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_usr_preferences::findby_subscriberid_attributeid(
|
|
$context->{db},$subscriber_id,$attribute->{id})->[0];
|
|
|
|
if (defined $allowed_ips_grp_attribute_preference) {
|
|
$context->{allowed_ip_group_id} = $allowed_ips_grp_attribute_preference->{value};
|
|
$context->{allowed_ips_grp_attribute_preference_id} = $allowed_ips_grp_attribute_preference->{id};
|
|
NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_allowed_ip_groups::delete_groupid($context->{db},$context->{allowed_ip_group_id});
|
|
_info($context,"($context->{rownum}) " . 'allowed ips group for subscriber ' . $context->{cli} . ' exists, ipnets deleted',1);
|
|
} else {
|
|
$context->{allowed_ip_group_id} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_aig_sequence::forupdate_increment($context->{db});
|
|
_info($context,"($context->{rownum}) " . 'new allowed ips group id for subscriber ' . $context->{cli} . ' aquired',1);
|
|
}
|
|
|
|
$context->{allowed_ips_grp_ipnet_ids} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_allowed_ip_groups::insert_rows($context->{db},$context->{allowed_ip_group_id},$context->{allowed_ips});
|
|
_info($context,"($context->{rownum}) " . 'new allowed ips group id for subscriber ' . $context->{cli} . ' aquired',1);
|
|
|
|
if (not defined $allowed_ips_grp_attribute_preference) {
|
|
$context->{allowed_ips_grp_attribute_preference_id} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_usr_preferences::insert_row($context->{db},
|
|
attribute_id => $attribute->{id},
|
|
subscriber_id => $subscriber_id,
|
|
value => $context->{allowed_ip_group_id},
|
|
);
|
|
_info($context,"($context->{rownum}) " . 'new allowed ips group preference value for subscriber ' . $context->{cli} . ' added',1);
|
|
}
|
|
|
|
}
|
|
|
|
sub _reset_set_allowed_ips_context {
|
|
|
|
my ($context,$imported_subscriber,$rownum) = @_;
|
|
|
|
my $result = _reset_context($context,$imported_subscriber,$rownum);
|
|
|
|
$context->{allowed_ips} = $allowed_ips;
|
|
|
|
delete $context->{allowed_ip_group_id};
|
|
delete $context->{allowed_ips_grp_attribute_preference_id};
|
|
delete $context->{allowed_ips_grp_ipnet_ids};
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
|
sub set_preference_bulk {
|
|
|
|
my ($bulk_attribute_name,$value) = @_;
|
|
my $static_context = { bulk_attribute_name => $bulk_attribute_name, value => $value };
|
|
my $result = _set_preference_bulk_checks($static_context);
|
|
|
|
destroy_all_dbs();
|
|
my $warning_count :shared = 0;
|
|
return ($result && NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Subscriber::process_records(
|
|
static_context => $static_context,
|
|
process_code => sub {
|
|
my ($context,$records,$row_offset) = @_;
|
|
my $rownum = $row_offset;
|
|
foreach my $imported_subscriber (@$records) {
|
|
$rownum++;
|
|
next unless _reset_set_preference_bulk_context($context,$imported_subscriber,$rownum);
|
|
_set_preference_bulk($context);
|
|
}
|
|
|
|
#return 0;
|
|
return 1;
|
|
},
|
|
init_process_context_code => sub {
|
|
my ($context)= @_;
|
|
$context->{db} = &get_xa_db();
|
|
$context->{error_count} = 0;
|
|
$context->{warning_count} = 0;
|
|
# below is not mandatory..
|
|
_check_insert_tables();
|
|
},
|
|
uninit_process_context_code => sub {
|
|
my ($context)= @_;
|
|
undef $context->{db};
|
|
destroy_all_dbs();
|
|
{
|
|
lock $warning_count;
|
|
$warning_count += $context->{warning_count};
|
|
}
|
|
},
|
|
load_recursive => 0,
|
|
multithreading => $set_preference_bulk_multithreading,
|
|
numofthreads => $set_preference_bulk_numofthreads,
|
|
),$warning_count);
|
|
}
|
|
|
|
sub set_preference_bulk_batch {
|
|
|
|
my ($bulk_attribute_name,$value) = @_;
|
|
my $static_context = { bulk_attribute_name => $bulk_attribute_name, value => $value };
|
|
my $result = _set_preference_bulk_checks($static_context);
|
|
|
|
destroy_all_dbs();
|
|
my $warning_count :shared = 0;
|
|
return ($result && NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Batch::process_records(
|
|
static_context => $static_context,
|
|
process_code => sub {
|
|
my ($context,$records,$row_offset) = @_;
|
|
my $rownum = $row_offset;
|
|
foreach my $record (@$records) {
|
|
$rownum++;
|
|
my $imported_subscriber = NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::import::Subscriber::findby_subscribernumber($record->{number});
|
|
if (defined $imported_subscriber) {
|
|
next unless _reset_set_preference_bulk_context($context,$imported_subscriber,$rownum);
|
|
_set_preference_bulk($context);
|
|
} else {
|
|
if ($skip_errors) {
|
|
_warn($context,'record ' . $rownum . ' - no subscriber record for batch number found: ' . $record->{number});
|
|
next;
|
|
} else {
|
|
_error($context,'record ' . $rownum . ' - no subscriber record for batch number found: ' . $record->{number});
|
|
}
|
|
}
|
|
}
|
|
|
|
#return 0;
|
|
return 1;
|
|
},
|
|
init_process_context_code => sub {
|
|
my ($context)= @_;
|
|
$context->{db} = &get_xa_db();
|
|
$context->{error_count} = 0;
|
|
$context->{warning_count} = 0;
|
|
# below is not mandatory..
|
|
_check_insert_tables();
|
|
},
|
|
uninit_process_context_code => sub {
|
|
my ($context)= @_;
|
|
undef $context->{db};
|
|
destroy_all_dbs();
|
|
{
|
|
lock $warning_count;
|
|
$warning_count += $context->{warning_count};
|
|
}
|
|
},
|
|
load_recursive => 0,
|
|
multithreading => $set_preference_bulk_multithreading,
|
|
numofthreads => $set_preference_bulk_numofthreads,
|
|
),$warning_count);
|
|
}
|
|
|
|
sub _set_preference_bulk {
|
|
my ($context) = @_;
|
|
_set_subscriber_preference($context,\&_set_preferences_bulk);
|
|
}
|
|
|
|
sub _set_preference_bulk_checks {
|
|
my ($context) = @_;
|
|
|
|
my $result = _checks($context);
|
|
|
|
eval {
|
|
$context->{bulk_attribute} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_preferences::findby_attribute(
|
|
$context->{bulk_attribute_name});
|
|
};
|
|
if ($@ or not defined $context->{bulk_attribute}) {
|
|
rowprocessingerror(threadid(),'cannot find ' . $context->{bulk_attribute_name} . ' attribute',getlogger(__PACKAGE__));
|
|
$result = 0; #even in skip-error mode..
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
sub _set_preferences_bulk {
|
|
|
|
my ($context) = @_;
|
|
|
|
$context->{bulk_attribute_id} = set_preference($context,$context->{provisioning_voip_subscriber}->{id},
|
|
$context->{bulk_attribute},$context->{value});
|
|
_info($context,"($context->{rownum}) " . 'set ' . $context->{bulk_attribute_name} . ' preference value for subscriber ' . $context->{cli},1);
|
|
|
|
}
|
|
|
|
sub _reset_set_preference_bulk_context {
|
|
|
|
my ($context,$imported_subscriber,$rownum) = @_;
|
|
|
|
my $result = _reset_context($context,$imported_subscriber,$rownum);
|
|
|
|
delete $context->{bulk_attribute_id};
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
|
sub clear_preferences {
|
|
my ($context,$subscriber_id,$attribute,$except_value) = @_;
|
|
|
|
return NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_usr_preferences::delete_preferences($context->{db},
|
|
$subscriber_id,$attribute->{id},defined $except_value ? { 'NOT IN' => $except_value } : undef);
|
|
|
|
}
|
|
|
|
sub set_preference {
|
|
my ($context,$subscriber_id,$attribute,$value) = @_;
|
|
|
|
if ($attribute->{max_occur} == 1) {
|
|
my $old_preferences = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_usr_preferences::findby_subscriberid_attributeid($context->{db},
|
|
$subscriber_id,$attribute->{id});
|
|
if (defined $value) {
|
|
if ((scalar @$old_preferences) == 1) {
|
|
NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_usr_preferences::update_row($context->{db},{
|
|
id => $old_preferences->[0]->{id},
|
|
value => $value,
|
|
});
|
|
return $old_preferences->[0]->{id};
|
|
} else {
|
|
if ((scalar @$old_preferences) > 1) {
|
|
NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_usr_preferences::delete_preferences($context->{db},
|
|
$subscriber_id,$attribute->{id});
|
|
}
|
|
return NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_usr_preferences::insert_row($context->{db},
|
|
attribute_id => $attribute->{id},
|
|
subscriber_id => $subscriber_id,
|
|
value => $value,
|
|
);
|
|
}
|
|
} else {
|
|
NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_usr_preferences::delete_preferences($context->{db},
|
|
$subscriber_id,$attribute->{id});
|
|
return undef;
|
|
}
|
|
} else {
|
|
if (defined $value) {
|
|
return NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_usr_preferences::insert_row($context->{db},
|
|
attribute_id => $attribute->{id},
|
|
subscriber_id => $subscriber_id,
|
|
value => $value,
|
|
);
|
|
} else {
|
|
return undef;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
sub get_preference {
|
|
my ($context,$subscriber_id,$attribute) = @_;
|
|
|
|
my $preferences = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_usr_preferences::findby_subscriberid_attributeid($context->{db},
|
|
$subscriber_id,$attribute->{id});
|
|
if ($attribute->{max_occur} == 1) {
|
|
return $preferences->[0];
|
|
} else {
|
|
return $preferences;
|
|
}
|
|
|
|
}
|
|
|
|
sub _error {
|
|
|
|
my ($context,$message) = @_;
|
|
$context->{error_count} = $context->{error_count} + 1;
|
|
rowprocessingerror($context->{tid},$message,getlogger(__PACKAGE__));
|
|
|
|
}
|
|
|
|
sub _warn {
|
|
|
|
my ($context,$message) = @_;
|
|
$context->{warning_count} = $context->{warning_count} + 1;
|
|
rowprocessingwarn($context->{tid},$message,getlogger(__PACKAGE__));
|
|
|
|
}
|
|
|
|
sub _info {
|
|
|
|
my ($context,$message,$debug) = @_;
|
|
if ($debug) {
|
|
processing_debug($context->{tid},$message,getlogger(__PACKAGE__));
|
|
} else {
|
|
processing_info($context->{tid},$message,getlogger(__PACKAGE__));
|
|
}
|
|
}
|
|
|
|
1;
|