MT#18663 MT#20893 row bulk processing framework WIP #5

+setting to drop duplicate setoptionitems in
 Feature_Define.cfg
+adjust Feature_Define.cfg threads vs block size
 settings to arrange with a low sqlite busy_timeout
+Subscriber_Define.cfg importer
+resolve garbage collector problems with
 log4perl
+refactoring to conform with perl module
 lib/folder structure for installation
 -runs again

Change-Id: I1821cc0085086684c3c1415be4c262453509045a
changes/13/6913/6
Rene Krenn 9 years ago committed by Victor Seva
parent cc3e93d77b
commit 52d66ca0de

@ -1,6 +0,0 @@
package NoSqlConnector;
use strict;
## no critic
1;

@ -1,126 +0,0 @@
package Projects::Migration::IPGallery::Import;
use strict;
## no critic
use File::Basename;
use Cwd;
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../');
use Globals qw(
$cpucount
);
use Projects::Migration::IPGallery::Settings qw(
$import_multithreading
$feature_define_import_numofthreads
$dry
);
use Logging qw (
getlogger
);
use LogError qw(
fileprocessingwarn
fileprocessingerror
);
#use FileProcessors::CSVFile;
use Projects::Migration::IPGallery::FileProcessors::FeaturesDefineFile qw();
use Projects::Migration::IPGallery::FeaturesDefineParser qw();
use Projects::Migration::IPGallery::ProjectConnectorPool qw(
get_import_db
);
use Projects::Migration::IPGallery::Dao::FeatureOption qw();
use Projects::Migration::IPGallery::Dao::FeatureOptionSet qw();
use Array qw(removeduplicates);
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(
import_features_define
);
sub import_features_define {
my ($file) = @_;
my $result = Projects::Migration::IPGallery::Dao::FeatureOption::create_table(1);
$result &= Projects::Migration::IPGallery::Dao::FeatureOptionSet::create_table(1);
my $importer = Projects::Migration::IPGallery::FileProcessors::FeaturesDefineFile->new($feature_define_import_numofthreads);
$importer->{stoponparseerrors} = !$dry;
return $result && $importer->process($file,sub {
my ($context,$rows,$row_offset) = @_;
my $rownum = $row_offset;
my @featureoption_rows = ();
my @featureoptionset_rows = ();
foreach my $line (@$rows) {
my $row = undef;
if (not $importer->{parselines}) {
eval {
$row = Projects::Migration::IPGallery::FeaturesDefineParser::parse(\$line,$context->{grammar});
};
if ($@) {
if ($importer->{stoponparseerrors}) {
fileprocessingerror($context->{filename},'record ' . ($rownum + 1) . ' - ' . $@,getlogger(__PACKAGE__));
} else {
fileprocessingwarn($context->{filename},'record ' . ($rownum + 1) . ' - ' . $@,getlogger(__PACKAGE__));
}
}
}
next unless defined $row;
$rownum++;
foreach my $subscriber_number (keys %$row) {
foreach my $option (@{$row->{$subscriber_number}}) {
if ('HASH' eq ref $option) {
foreach my $setoption (keys %$option) {
foreach my $setoptionitem (@{removeduplicates($option->{$setoption})}) {
push(@featureoptionset_rows,[ $subscriber_number, $setoption, $setoptionitem ]);
}
push(@featureoption_rows,[ $subscriber_number, $setoption ]);
}
} else {
push(@featureoption_rows,[ $subscriber_number, $option ]);
}
}
}
}
my $import_db = &get_import_db();
if ((scalar @featureoption_rows) > 0) {
$import_db->db_do_begin(
Projects::Migration::IPGallery::Dao::FeatureOption::getinsertstatement(),
Projects::Migration::IPGallery::Dao::FeatureOption::gettablename(),
#lock - $import_multithreading
);
$import_db->db_do_rowblock(\@featureoption_rows);
$import_db->db_finish();
}
if ((scalar @featureoptionset_rows) > 0) {
$import_db->db_do_begin(
Projects::Migration::IPGallery::Dao::FeatureOptionSet::getinsertstatement(),
Projects::Migration::IPGallery::Dao::FeatureOptionSet::gettablename(),
#lock
);
$import_db->db_do_rowblock(\@featureoptionset_rows);
$import_db->db_finish();
}
return 1;
}, sub {
my ($context)= @_;
if (not $importer->{parselines}) {
eval {
$context->{grammar} = Projects::Migration::IPGallery::FeaturesDefineParser::create_grammar();
};
if ($@) {
fileprocessingerror($context->{filename},$@,getlogger(__PACKAGE__));
}
}
},$import_multithreading);
}
1;

@ -1,7 +0,0 @@
features_define_filename = /home/rkrenn/test/Features_Define.cfg
import_multithreading = 1
feature_define_import_numofthreads = 10
#dry=0

@ -1,105 +0,0 @@
#!/usr/bin/perl
use warnings;
use strict;
use Marpa::R2;
use Data::Dumper;
my $input = do { local $/; <DATA> };
my $dsl = << '__GRAMMAR__';
lexeme default = latm => 1
:start ::= List
:default ::= action => ::first
List ::= Hash+ action => list
Hash ::= String '{' Pairs '}' action => hash
Pairs ::= Pair+ action => list
Pair ::= String Value ';' action => pair
| Hash
Value ::= Simple
| Bracketed
Bracketed ::= '[' String ']' action => second
Simple ::= String
String ~ [-a-zA-Z_0-9]+
whitespace ~ [\s] +
:discard ~ whitespace
__GRAMMAR__
sub hash { +{ $_[1] => $_[3] } }
sub pair { +{ $_[1] => $_[2] } }
sub second { [ @_[ 2 .. $#_-1 ] ] }
sub list { shift; \@_ }
my $grammar = Marpa::R2::Scanless::G->new( { source => \$dsl } );
my $recce = Marpa::R2::Scanless::R->new(
{ grammar => $grammar, semantics_package => 'main' } );
#my $input = '42 * 1 + 7';
$recce->read( \$input );
my $value_ref = $recce->value;
my $value = $value_ref ? ${$value_ref} : 'No Parse';
print Dumper $value;
#my $parser = 'Marpa::R2::Scanless::G'->new({ source => \$grammar });
#print Dumper $parser->parse(\$input, 'main', { trace_terminals => 1 });
__DATA__
bob {
ed {
larry {
rule5 {
option {
disable-server-response-inspection no;
}
tag [ some_tag ];
from [ prod-L3 ];
to [ corp-L3 ];
source [ any ];
destination [ any ];
source-user [ any ];
category [ any ];
application [ any ];
service [ any ];
hip-profiles [ any ];
log-start no;
log-end yes;
negate-source no;
negate-destination no;
action allow;
log-setting orion_log;
}
rule6 {
option {
disable-server-response-inspection no;
}
tag [ some_tag ];
from [ prod-L3 ];
to [ corp-L3 ];
source [ any ];
destination [ any ];
source-user [ any ];
category [ any ];
application [ any ];
service [ any ];
hip-profiles [ any ];
log-start no;
log-end yes;
negate-source no;
negate-destination no;
action allow;
log-setting orion_log;
}
}
}
}

@ -1,62 +0,0 @@
use strict;
my $buffersize = 100 * 1024;
my $default_encoding = 'UTF-8';
_get_linecount('/home/rkrenn/test/Features_Define.cfg',$default_encoding,\&breaklines);
exit;
sub breaklines {
my ($buffer_ref) = @_;
my $spearator = "\n";
my $count = 0;
my $last_record;
my $records = [];
foreach my $record (split(/$spearator(?=(?:\d+$spearator))/,$$buffer_ref)) {
$count++;
$last_record = $record;
push(@$records,$record);
}
#if ($last_record =~ /$spearator\}\s*$/) {
# $$buffer_ref = '';
#} else {
$count--;
$$buffer_ref = $last_record;
pop @$records;
#}
return $count;
}
sub _get_linecount {
my ($file,$encoding,$breaklines_code) = @_;
#local $/ = $lineseparator;
local *INPUTFILE_LINECOUNT;
if (not open (INPUTFILE_LINECOUNT, '<:encoding(' . $encoding . ')', $file)) {
print('get line count - cannot open file ' . $file . ': ' . $!);
return undef;
}
binmode INPUTFILE_LINECOUNT;
my $linecount = 0;
my $buffer = '';
my $chunk = undef;
my $n = 0;
while (defined ($n = read(INPUTFILE_LINECOUNT,$chunk,$buffersize)) && $n != 0) {
$buffer .= $chunk;
$linecount += &$breaklines_code(\$buffer);
}
if (not defined $n) {
print('get line count - error reading file ' . $file . ': ' . $!);
close(INPUTFILE_LINECOUNT);
return undef;
}
close(INPUTFILE_LINECOUNT);
return $linecount;
}

@ -1,9 +1,9 @@
package Array; package NGCP::BulkProcessor::Array;
use strict; use strict;
## no critic ## no critic
use Table; use NGCP::BulkProcessor::Table;
require Exporter; require Exporter;
our @ISA = qw(Exporter); our @ISA = qw(Exporter);
@ -83,19 +83,19 @@ sub itemcount {
sub grouparray { sub grouparray {
my ($array_ptr,$case_insensitive) = @_; my ($array_ptr,$case_insensitive) = @_;
my $result = new Table(); my $result = new NGCP::BulkProcessor::Table();
my $reducedarray = removeduplicates($array_ptr,$case_insensitive); my $reducedarray = removeduplicates($array_ptr,$case_insensitive);
my $sort_occurencecount_desc; my $sort_occurencecount_desc;
if ($case_insensitive) { if ($case_insensitive) {
$sort_occurencecount_desc = sub { $sort_occurencecount_desc = sub {
return ((lc($Table::b->[1]) <=> lc($Table::a->[1])) or (lc($Table::a->[0]) cmp lc($Table::b->[0]))); return ((lc($NGCP::BulkProcessor::Table::b->[1]) <=> lc($NGCP::BulkProcessor::Table::a->[1])) or (lc($NGCP::BulkProcessor::Table::a->[0]) cmp lc($NGCP::BulkProcessor::Table::b->[0])));
}; };
} else { } else {
$sort_occurencecount_desc = sub { $sort_occurencecount_desc = sub {
return (($Table::b->[1] <=> $Table::a->[1]) or ($Table::a->[0] cmp $Table::b->[0])); return (($NGCP::BulkProcessor::Table::b->[1] <=> $NGCP::BulkProcessor::Table::a->[1]) or ($NGCP::BulkProcessor::Table::a->[0] cmp $NGCP::BulkProcessor::Table::b->[0]));
}; };
} }
@ -381,4 +381,4 @@ sub mapeq {
} }
} }
1; 1;

@ -2,15 +2,15 @@
## no critic ## no critic
package AttachmentDownloader; package NGCP::BulkProcessor::AttachmentDownloader;
use strict; use strict;
use Logging qw( use NGCP::BulkProcessor::Logging qw(
getlogger getlogger
attachmentdownloaderdebug attachmentdownloaderdebug
attachmentdownloaderinfo attachmentdownloaderinfo
); );
use LogError qw( use NGCP::BulkProcessor::LogError qw(
fileerror fileerror
attachmentdownloadererror attachmentdownloadererror
attachmentdownloaderwarn attachmentdownloaderwarn
@ -25,7 +25,7 @@ use LWP::UserAgent;
use HTTP::Request; use HTTP::Request;
#use HTTP::Cookies; #use HTTP::Cookies;
use Utils qw(kbytes2gigs changemod); use NGCP::BulkProcessor::Utils qw(kbytes2gigs changemod);
require Exporter; require Exporter;
our @ISA = qw(Exporter); our @ISA = qw(Exporter);
@ -263,4 +263,4 @@ sub DESTROY {
$self->logout(); $self->logout();
} }
1; 1;

@ -1,9 +1,9 @@
package ConnectorPool; package NGCP::BulkProcessor::ConnectorPool;
use strict; use strict;
## no critic ## no critic
use Globals qw( use NGCP::BulkProcessor::Globals qw(
$accounting_databasename $accounting_databasename
$accounting_username $accounting_username
@ -25,23 +25,23 @@ use Globals qw(
); );
use Logging qw(getlogger); use NGCP::BulkProcessor::Logging qw(getlogger);
use LogError qw(dbclustererror dbclusterwarn); #nodumpdbset use NGCP::BulkProcessor::LogError qw(dbclustererror dbclusterwarn); #nodumpdbset
use SqlConnectors::MySQLDB; use NGCP::BulkProcessor::SqlConnectors::MySQLDB;
#use SqlConnectors::OracleDB; #use NGCP::BulkProcessor::SqlConnectors::OracleDB;
#use SqlConnectors::PostgreSQLDB; #use NGCP::BulkProcessor::SqlConnectors::PostgreSQLDB;
#use SqlConnectors::SQLiteDB qw($staticdbfilemode #use NGCP::BulkProcessor::SqlConnectors::SQLiteDB qw($staticdbfilemode
# cleanupdbfiles); # cleanupdbfiles);
use SqlConnectors::CSVDB; use NGCP::BulkProcessor::SqlConnectors::CSVDB;
#use SqlConnectors::SQLServerDB; #use NGCP::BulkProcessor::SqlConnectors::SQLServerDB;
use RestConnectors::NGCPRestApi; use NGCP::BulkProcessor::RestConnectors::NGCPRestApi;
use SqlRecord qw(cleartableinfo); use NGCP::BulkProcessor::SqlRecord qw(cleartableinfo);
use Utils qw(threadid); use NGCP::BulkProcessor::Utils qw(threadid);
use Array qw( use NGCP::BulkProcessor::Array qw(
filter filter
mergearrays mergearrays
getroundrobinitem getroundrobinitem
@ -77,7 +77,7 @@ sub get_accounting_db {
my ($instance_name,$reconnect) = @_; my ($instance_name,$reconnect) = @_;
my $name = get_connectorinstancename($instance_name); my $name = get_connectorinstancename($instance_name);
if (!defined $accounting_dbs->{$name}) { if (!defined $accounting_dbs->{$name}) {
$accounting_dbs->{$name} = SqlConnectors::MySQLDB->new($instance_name); $accounting_dbs->{$name} = NGCP::BulkProcessor::SqlConnectors::MySQLDB->new($instance_name);
if (!defined $reconnect) { if (!defined $reconnect) {
$reconnect = 1; $reconnect = 1;
} }
@ -93,7 +93,7 @@ sub accounting_db_tableidentifier {
my ($get_target_db,$tablename) = @_; my ($get_target_db,$tablename) = @_;
my $target_db = (ref $get_target_db eq 'CODE') ? &$get_target_db() : $get_target_db; my $target_db = (ref $get_target_db eq 'CODE') ? &$get_target_db() : $get_target_db;
return $target_db->getsafetablename(SqlConnectors::MySQLDB::get_tableidentifier($tablename,$accounting_databasename)); return $target_db->getsafetablename(NGCP::BulkProcessor::SqlConnectors::MySQLDB::get_tableidentifier($tablename,$accounting_databasename));
} }
@ -103,7 +103,7 @@ sub get_billing_db {
my ($instance_name,$reconnect) = @_; my ($instance_name,$reconnect) = @_;
my $name = get_connectorinstancename($instance_name); my $name = get_connectorinstancename($instance_name);
if (!defined $billing_dbs->{$name}) { if (!defined $billing_dbs->{$name}) {
$billing_dbs->{$name} = SqlConnectors::MySQLDB->new($instance_name); $billing_dbs->{$name} = NGCP::BulkProcessor::SqlConnectors::MySQLDB->new($instance_name);
if (!defined $reconnect) { if (!defined $reconnect) {
$reconnect = 1; $reconnect = 1;
} }
@ -119,7 +119,7 @@ sub billing_db_tableidentifier {
my ($get_target_db,$tablename) = @_; my ($get_target_db,$tablename) = @_;
my $target_db = (ref $get_target_db eq 'CODE') ? &$get_target_db() : $get_target_db; my $target_db = (ref $get_target_db eq 'CODE') ? &$get_target_db() : $get_target_db;
return $target_db->getsafetablename(SqlConnectors::MySQLDB::get_tableidentifier($tablename,$billing_databasename)); return $target_db->getsafetablename(NGCP::BulkProcessor::SqlConnectors::MySQLDB::get_tableidentifier($tablename,$billing_databasename));
} }
@ -128,7 +128,7 @@ sub get_ngcp_restapi {
my ($instance_name) = @_; my ($instance_name) = @_;
my $name = get_connectorinstancename($instance_name); my $name = get_connectorinstancename($instance_name);
if (!defined $ngcp_restapis->{$name}) { if (!defined $ngcp_restapis->{$name}) {
$ngcp_restapis->{$name} = RestConnectors::NGCPRestApi->new($instance_name,$ngcprestapi_uri,$ngcprestapi_username,$ngcprestapi_password,$ngcprestapi_realm); $ngcp_restapis->{$name} = NGCP::BulkProcessor::RestConnectors::NGCPRestApi->new($instance_name,$ngcprestapi_uri,$ngcprestapi_username,$ngcprestapi_password,$ngcprestapi_realm);
} }
return $ngcp_restapis->{$name}; return $ngcp_restapis->{$name};

@ -1,4 +1,4 @@
package DSSorter; package NGCP::BulkProcessor::DSSorter;
use strict; use strict;
## no critic ## no critic
@ -6,15 +6,17 @@ use strict;
# guarantee stability, regardless of algorithm # guarantee stability, regardless of algorithm
use sort 'stable'; use sort 'stable';
use Logging qw(getlogger); use NGCP::BulkProcessor::Logging qw(getlogger);
use LogError qw(sortconfigerror); use NGCP::BulkProcessor::LogError qw(sortconfigerror);
use Table; use NGCP::BulkProcessor::Table;
require Exporter; require Exporter;
our @ISA = qw(Exporter); our @ISA = qw(Exporter);
our @EXPORT_OK = qw(sort_by_config_ids our @EXPORT_OK = qw(
sort_by_configs); sort_by_config_ids
sort_by_configs
);
#my $logger = getlogger(__PACKAGE__); #my $logger = getlogger(__PACKAGE__);
@ -22,7 +24,7 @@ sub new {
my $class = shift; my $class = shift;
my $self = {}; my $self = {};
$self->{sortconfig} = Table->new(); $self->{sortconfig} = NGCP::BulkProcessor::Table->new();
bless($self,$class); bless($self,$class);
return $self; return $self;
@ -117,7 +119,7 @@ sub sort_by_config_ids {
ref $sortingconfigurations eq 'HASH') { ref $sortingconfigurations eq 'HASH') {
my @sorting_ids = @$sortings; my @sorting_ids = @$sortings;
if ((scalar @sorting_ids) > 0) { if ((scalar @sorting_ids) > 0) {
my $sorter = DSSorter->new(); my $sorter = NGCP::BulkProcessor::DSSorter->new();
foreach my $sorting_id (@sorting_ids) { foreach my $sorting_id (@sorting_ids) {
my $sc = $sortingconfigurations->{$sorting_id}; my $sc = $sortingconfigurations->{$sorting_id};
if (defined $sc and ref $sc eq 'HASH') { if (defined $sc and ref $sc eq 'HASH') {
@ -156,7 +158,7 @@ sub sort_by_configs {
my @scs = @$sortingconfigurations; my @scs = @$sortingconfigurations;
if ((scalar @scs) > 0) { if ((scalar @scs) > 0) {
my $sorter = DSSorter->new(); my $sorter = NGCP::BulkProcessor::DSSorter->new();
my $sorting_id = -1; my $sorting_id = -1;
foreach my $sc (@scs) { foreach my $sc (@scs) {
#my $sc = $sortingconfigurations->{$sorting_id}; #my $sc = $sortingconfigurations->{$sorting_id};
@ -183,4 +185,4 @@ sub sort_by_configs {
} }
1; 1;

@ -1,22 +1,21 @@
package NGCP::BulkProcessor::Dao::Trunk::billing::contract_balances;
package Dao::Trunk::billing::contract_balances;
use strict; use strict;
## no critic ## no critic
use File::Basename; #use File::Basename;
use Cwd; #use Cwd;
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../'); #use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../');
#use Logging qw(getlogger);
use ConnectorPool qw(get_billing_db use NGCP::BulkProcessor::ConnectorPool qw(
billing_db_tableidentifier); get_billing_db
billing_db_tableidentifier
);
use SqlRecord qw(checktableinfo); use NGCP::BulkProcessor::SqlRecord qw(checktableinfo);
require Exporter; require Exporter;
our @ISA = qw(Exporter SqlRecord); our @ISA = qw(Exporter NGCP::BulkProcessor::SqlRecord);
our @EXPORT_OK = qw( our @EXPORT_OK = qw(
XX XX
backoffice_client_byboclientid backoffice_client_byboclientid
@ -53,7 +52,7 @@ my $expected_fieldnames = [
sub new { sub new {
my $class = shift; my $class = shift;
my $self = SqlRecord->new($get_db, my $self = NGCP::BulkProcessor::SqlRecord->new($get_db,
gettablename(), gettablename(),
$expected_fieldnames); $expected_fieldnames);

@ -1,24 +1,24 @@
package Downloaders::IMAPAttachmentDownloader; package NGCP::BulkProcessor::Downloaders::IMAPAttachmentDownloader;
use strict; use strict;
## no critic ## no critic
use File::Basename; #use File::Basename;
use Cwd; #use Cwd;
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../'); #use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../');
use Logging qw( use NGCP::BulkProcessor::Logging qw(
getlogger getlogger
attachmentdownloaderdebug attachmentdownloaderdebug
attachmentdownloaderinfo attachmentdownloaderinfo
); );
use LogError qw( use NGCP::BulkProcessor::LogError qw(
fileerror fileerror
attachmentdownloadererror attachmentdownloadererror
attachmentdownloaderwarn attachmentdownloaderwarn
); );
use Utils qw(kbytes2gigs); # changemod); use NGCP::BulkProcessor::Utils qw(kbytes2gigs); # changemod);
use IO::Socket::SSL; use IO::Socket::SSL;
use Mail::IMAPClient; use Mail::IMAPClient;
@ -29,7 +29,7 @@ use MIME::Base64;
#use Authen::SASL qw(Perl); #use Authen::SASL qw(Perl);
require Exporter; require Exporter;
our @ISA = qw(Exporter AttachmentDownloader); our @ISA = qw(Exporter NGCP::BulkProcessor::AttachmentDownloader);
our @EXPORT_OK = qw(); our @EXPORT_OK = qw();
#my $logger = getlogger(__PACKAGE__); #my $logger = getlogger(__PACKAGE__);
@ -38,7 +38,7 @@ sub new {
my $class = shift; my $class = shift;
my ($server,$ssl,$user,$pass,$foldername,$checkfilenamecode,$download_urls) = @_; my ($server,$ssl,$user,$pass,$foldername,$checkfilenamecode,$download_urls) = @_;
my $self = AttachmentDownloader->new($class,$server,$ssl,$user,$pass,$foldername,$checkfilenamecode,$download_urls); my $self = NGCP::BulkProcessor::AttachmentDownloader->new($class,$server,$ssl,$user,$pass,$foldername,$checkfilenamecode,$download_urls);
attachmentdownloaderdebug('IMAP attachment downloader object created',getlogger(__PACKAGE__)); attachmentdownloaderdebug('IMAP attachment downloader object created',getlogger(__PACKAGE__));
return $self; return $self;
@ -180,4 +180,4 @@ sub download {
} }
1; 1;

@ -1,4 +1,4 @@
package FakeTime; package NGCP::BulkProcessor::FakeTime;
use strict; use strict;
## no critic ## no critic
@ -9,12 +9,12 @@ use DateTime::TimeZone qw();
use DateTime::Format::Strptime qw(); use DateTime::Format::Strptime qw();
use DateTime::Format::ISO8601 qw(); use DateTime::Format::ISO8601 qw();
use Logging qw( use NGCP::BulkProcessor::Logging qw(
getlogger getlogger
faketimedebug faketimedebug
faketimeinfo); faketimeinfo);
use LogError qw( use NGCP::BulkProcessor::LogError qw(
faketimeerror faketimeerror
restwarn); restwarn);
@ -32,8 +32,8 @@ our @EXPORT_OK = qw(
#my $logger = getlogger(__PACKAGE__); #my $logger = getlogger(__PACKAGE__);
my $is_fake_time = 0; my $is_fake_time = 0;
sub set_time { sub set_time {
my ($o) = @_; my ($o) = @_;
if (defined $o) { if (defined $o) {
@ -53,8 +53,8 @@ sub _get_fake_clienttime_now {
sub get_now { sub get_now {
return _current_local(); return _current_local();
} }
sub current_unix { sub current_unix {
if ($is_fake_time) { if ($is_fake_time) {
return Time::Warp::time; return Time::Warp::time;
@ -141,4 +141,4 @@ sub _set_fake_time {
} }
} }
1; 1;

@ -1,4 +1,4 @@
package FileProcessor; package NGCP::BulkProcessor::FileProcessor;
use strict; use strict;
## no critic ## no critic
@ -9,11 +9,11 @@ use Thread::Queue;
use Time::HiRes qw(sleep); use Time::HiRes qw(sleep);
use Globals qw( use NGCP::BulkProcessor::Globals qw(
$enablemultithreading $enablemultithreading
$cpucount $cpucount
); );
use Logging qw( use NGCP::BulkProcessor::Logging qw(
getlogger getlogger
filethreadingdebug filethreadingdebug
fileprocessingstarted fileprocessingstarted
@ -22,19 +22,14 @@ use Logging qw(
processing_lines processing_lines
); );
use NGCP::BulkProcessor::LogError qw(
# fetching_rows
# writing_rows
# processing_rows
use LogError qw(
processzerofilesize processzerofilesize
fileprocessingfailed fileprocessingfailed
fileerror fileerror
notimplementederror notimplementederror
); );
use Utils qw(threadid); use NGCP::BulkProcessor::Utils qw(threadid);
require Exporter; require Exporter;
our @ISA = qw(Exporter); our @ISA = qw(Exporter);
@ -93,7 +88,7 @@ sub process {
my $self = shift; my $self = shift;
my ($file,$process_code,$init_process_context_code,$multithreading) = @_; my ($file,$process_code,$init_process_context_code,$uninit_process_context_code,$multithreading) = @_;
if (ref $process_code eq 'CODE') { if (ref $process_code eq 'CODE') {
@ -132,6 +127,7 @@ sub process {
filename => $file, filename => $file,
process_code => $process_code, process_code => $process_code,
init_process_context_code => $init_process_context_code, init_process_context_code => $init_process_context_code,
uninit_process_context_code => $uninit_process_context_code,
instance => $self, instance => $self,
}); });
if (!defined $processor) { if (!defined $processor) {
@ -241,6 +237,10 @@ sub process {
} }
close(INPUTFILE); close(INPUTFILE);
if ('CODE' eq ref $uninit_process_context_code) {
&$uninit_process_context_code($context);
}
}; };
if ($@) { if ($@) {
@ -433,6 +433,9 @@ sub _process {
sleep($thread_sleep_secs); #2015-01 sleep($thread_sleep_secs); #2015-01
} }
} }
if ('CODE' eq ref $context->{uninit_process_context_code}) {
&{$context->{uninit_process_context_code}}($context);
}
}; };
filethreadingdebug($@ ? '[' . $tid . '] processor thread error: ' . $@ : '[' . $tid . '] processor thread finished (' . $blockcount . ' blocks)',getlogger(__PACKAGE__)); filethreadingdebug($@ ? '[' . $tid . '] processor thread error: ' . $@ : '[' . $tid . '] processor thread finished (' . $blockcount . ' blocks)',getlogger(__PACKAGE__));
lock $context->{errorstates}; lock $context->{errorstates};

@ -1,24 +1,20 @@
package FileProcessors::CSVFile; package NGCP::BulkProcessor::FileProcessors::CSVFile;
use strict; use strict;
## no critic ## no critic
use File::Basename; #use File::Basename;
use Cwd; #use Cwd;
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../'); #use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../');
#use Globals qw( use NGCP::BulkProcessor::Logging qw(
# $cpucount
#);
use Logging qw(
getlogger getlogger
); );
use FileProcessor; use NGCP::BulkProcessor::FileProcessor;
require Exporter; require Exporter;
our @ISA = qw(Exporter FileProcessor); our @ISA = qw(Exporter NGCP::BulkProcessor::FileProcessor);
our @EXPORT_OK = qw(); our @EXPORT_OK = qw();
my $default_lineseparator = '\\n\\r|\\r|\\n'; my $default_lineseparator = '\\n\\r|\\r|\\n';
@ -35,7 +31,7 @@ sub new {
my $class = shift; my $class = shift;
my $self = FileProcessor->new(@_); my $self = NGCP::BulkProcessor::FileProcessor->new(@_);
$self->{numofthreads} = shift // $default_numofthreads; $self->{numofthreads} = shift // $default_numofthreads;
$self->{line_separator} = shift // $default_lineseparator; $self->{line_separator} = shift // $default_lineseparator;

@ -1,4 +1,4 @@
package Globals; package NGCP::BulkProcessor::Globals;
use strict; use strict;
## no critic ## no critic
@ -17,13 +17,14 @@ use File::Basename qw(dirname);
use File::Temp qw(tempdir); use File::Temp qw(tempdir);
use FindBin qw(); use FindBin qw();
use Utils qw( use NGCP::BulkProcessor::Utils qw(
get_ipaddress get_ipaddress
get_hostfqdn get_hostfqdn
get_cpucount get_cpucount
makepath makepath
fixdirpath fixdirpath
$chmod_umask); $chmod_umask
);
require Exporter; require Exporter;
our @ISA = qw(Exporter); our @ISA = qw(Exporter);
@ -60,53 +61,45 @@ our @EXPORT_OK = qw(
$billing_host $billing_host
$billing_port $billing_port
$ngcprestapi_uri $ngcprestapi_uri
$ngcprestapi_username $ngcprestapi_username
$ngcprestapi_password $ngcprestapi_password
$ngcprestapi_realm $ngcprestapi_realm
$csv_path $csv_path
$input_path $input_path
$local_db_path
$local_db_path $emailenable
$emailenable $erroremailrecipient
$erroremailrecipient $warnemailrecipient
$warnemailrecipient $completionemailrecipient
$completionemailrecipient $successemailrecipient
$successemailrecipient $mailfile_path
$mailfile_path
$ismsexchangeserver
$ismsexchangeserver $sender_address
$sender_address $smtp_server
$smtp_server $smtpuser
$smtpuser $smtppasswd
$smtppasswd $writefiles
$writefiles
$logfile_path
$logfile_path $fileloglevel
$fileloglevel $screenloglevel
$screenloglevel $emailloglevel
$emailloglevel $mailprog
$mailprog $mailtype
$mailtype
$defaultconfig
$defaultconfig update_mainconfig
update_mainconfig $chmod_umask
@jobservers
$jobnamespace
$chmod_umask );
@jobservers
$jobnamespace
);
#set process umask for open and mkdir calls: #set process umask for open and mkdir calls:
umask 0000; umask 0000;

@ -1,9 +1,9 @@
package LoadConfig; package NGCP::BulkProcessor::LoadConfig;
use strict; use strict;
## no critic ## no critic
use Globals qw( use NGCP::BulkProcessor::Globals qw(
$system_name $system_name
$system_version $system_version
$system_instance_label $system_instance_label
@ -16,19 +16,19 @@ use Globals qw(
update_mainconfig update_mainconfig
); );
use Logging qw( use NGCP::BulkProcessor::Logging qw(
getlogger getlogger
configurationinfo configurationinfo
); );
use LogError qw( use NGCP::BulkProcessor::LogError qw(
fileerror fileerror
configurationwarn configurationwarn
configurationerror configurationerror
); );
use YAML::Tiny; use YAML::Tiny;
use Utils qw(format_number); use NGCP::BulkProcessor::Utils qw(format_number);
require Exporter; require Exporter;
our @ISA = qw(Exporter); our @ISA = qw(Exporter);
@ -51,7 +51,7 @@ our $YAML_CONFIG_TYPE = 2;
sub load_config { sub load_config {
my ($configfile,$process_code,$configtype) = @_; my ($configfile,$process_code,$configtype) = @_;
my $is_settings = 'CODE' eq ref $process_code; my $is_settings = 'CODE' eq ref $process_code;
my $data; my $data;
if (defined $configfile) { if (defined $configfile) {
@ -78,7 +78,7 @@ sub load_config {
fileerror('no ' . ($is_settings ? 'settings' : 'config') . ' file specified',getlogger(__PACKAGE__)); fileerror('no ' . ($is_settings ? 'settings' : 'config') . ' file specified',getlogger(__PACKAGE__));
return 0; return 0;
} }
if ($is_settings) { if ($is_settings) {
my $result = &$process_code($data,$configfile, my $result = &$process_code($data,$configfile,
\&split_tuple, \&split_tuple,
@ -106,13 +106,13 @@ sub load_config {
} }
sub _splashinfo { sub _splashinfo {
configurationinfo($system_name . ' ' . $system_version . ' (' . $system_instance_label . ') [' . $local_fqdn . ']',getlogger(__PACKAGE__)); configurationinfo($system_name . ' ' . $system_version . ' (' . $system_instance_label . ') [' . $local_fqdn . ']',getlogger(__PACKAGE__));
configurationinfo('application path ' . $application_path,getlogger(__PACKAGE__)); configurationinfo('application path ' . $application_path,getlogger(__PACKAGE__));
configurationinfo('working path ' . $working_path,getlogger(__PACKAGE__)); configurationinfo('working path ' . $working_path,getlogger(__PACKAGE__));
#configurationinfo('executable path ' . $executable_path,getlogger(__PACKAGE__)); #configurationinfo('executable path ' . $executable_path,getlogger(__PACKAGE__));
configurationinfo($cpucount . ' cpu(s), multithreading ' . ($enablemultithreading ? 'enabled' : 'disabled'),getlogger(__PACKAGE__)); configurationinfo($cpucount . ' cpu(s), multithreading ' . ($enablemultithreading ? 'enabled' : 'disabled'),getlogger(__PACKAGE__));
} }
sub _parse_config { sub _parse_config {
@ -122,7 +122,7 @@ sub _parse_config {
if ($configtype == $SIMPLE_CONFIG_TYPE) { if ($configtype == $SIMPLE_CONFIG_TYPE) {
$data = _parse_simple_config($file); $data = _parse_simple_config($file);
} elsif ($configtype == $YAML_CONFIG_TYPE) { } elsif ($configtype == $YAML_CONFIG_TYPE) {
$data = _parse_yaml_config($file); $data = _parse_yaml_config($file);
} else { } else {
$data = _parse_simple_config($file); $data = _parse_simple_config($file);
} }
@ -163,58 +163,58 @@ sub split_tuple {
sub _parse_simple_config { sub _parse_simple_config {
my $file = shift; my $file = shift;
my $config = {}; my $config = {};
local *CF; local *CF;
if (not open (CF, '<' . $file)) { if (not open (CF, '<' . $file)) {
fileerror('parsing simple format - cannot open file ' . $file . ': ' . $!,getlogger(__PACKAGE__)); fileerror('parsing simple format - cannot open file ' . $file . ': ' . $!,getlogger(__PACKAGE__));
return $config; return $config;
} }
read(CF, my $data, -s $file); read(CF, my $data, -s $file);
close(CF); close(CF);
my @lines = split(/\015\012|\012|\015/,$data); my @lines = split(/\015\012|\012|\015/,$data);
my $count = 0; my $count = 0;
foreach my $line(@lines) { foreach my $line(@lines) {
$count++; $count++;
next if($line =~ /^\s*#/); next if($line =~ /^\s*#/);
next if($line !~ /^\s*\S+\s*=.*$/); next if($line !~ /^\s*\S+\s*=.*$/);
#my $cindex = index($line,'#'); #my $cindex = index($line,'#');
#if ($cindex >= 0) { #if ($cindex >= 0) {
# $line = substr($line,0,$cindex); # $line = substr($line,0,$cindex);
#} #}
my ($key,$value) = split(/=/,$line,2); my ($key,$value) = split(/=/,$line,2);
# Remove whitespaces at the beginning and at the end # Remove whitespaces at the beginning and at the end
$key =~ s/^\s+//g; $key =~ s/^\s+//g;
$key =~ s/\s+$//g; $key =~ s/\s+$//g;
$value =~ s/^\s+//g; $value =~ s/^\s+//g;
$value =~ s/\s+$//g; $value =~ s/\s+$//g;
if (exists $config->{$key}) { if (exists $config->{$key}) {
configurationwarn($file,'parsing simple format - parameter ' . $key . ' defined twice in line ' . $count,getlogger(__PACKAGE__)); configurationwarn($file,'parsing simple format - parameter ' . $key . ' defined twice in line ' . $count,getlogger(__PACKAGE__));
} }
$config->{$key} = $value; $config->{$key} = $value;
#print $key . "\n"; #print $key . "\n";
} }
return $config; return $config;
} }
sub _parse_yaml_config { sub _parse_yaml_config {
my $file = shift; my $file = shift;
my $yaml = undef; my $yaml = undef;
eval { eval {
$yaml = YAML::Tiny->read($file); $yaml = YAML::Tiny->read($file);
@ -223,9 +223,9 @@ sub _parse_yaml_config {
configurationerror($file,'parsing yaml format - error: ' . $!,getlogger(__PACKAGE__)); configurationerror($file,'parsing yaml format - error: ' . $!,getlogger(__PACKAGE__));
return $yaml; return $yaml;
} }
return $yaml; return $yaml;
} }
1; 1;

@ -1,13 +1,9 @@
package LogError; package NGCP::BulkProcessor::LogError;
use strict; use strict;
## no critic ## no critic
#use threads 1.72; # qw(running); use NGCP::BulkProcessor::Globals qw(
#use threads::shared;
#use LoadConfig;
use Globals qw(
$system_version $system_version
$erroremailrecipient $erroremailrecipient
$warnemailrecipient $warnemailrecipient
@ -17,7 +13,7 @@ use Globals qw(
$root_threadid $root_threadid
); );
use Mail qw( use NGCP::BulkProcessor::Mail qw(
send_message send_message
send_email send_email
$signature $signature
@ -25,7 +21,7 @@ use Mail qw(
$lowpriority $lowpriority
$normalpriority $normalpriority
); );
use Utils qw( use NGCP::BulkProcessor::Utils qw(
threadid threadid
create_guid create_guid
getscriptpath getscriptpath

@ -1,11 +1,9 @@
# a verbose logging module package NGCP::BulkProcessor::Logging;
package Logging;
use strict; use strict;
## no critic ## no critic
use Globals qw( use NGCP::BulkProcessor::Globals qw(
$root_threadid $root_threadid
$logfile_path $logfile_path
$fileloglevel $fileloglevel
@ -18,8 +16,8 @@ use Log::Log4perl qw(get_logger);
use File::Basename qw(basename); use File::Basename qw(basename);
use Utils qw(timestampdigits datestampdigits changemod chopstring trim kbytes2gigs); use NGCP::BulkProcessor::Utils qw(timestampdigits datestampdigits changemod chopstring trim kbytes2gigs);
use Array qw (contains); use NGCP::BulkProcessor::Array qw (contains);
require Exporter; require Exporter;
our @ISA = qw(Exporter); our @ISA = qw(Exporter);
@ -86,7 +84,6 @@ our @EXPORT_OK = qw(
servicedebug servicedebug
serviceinfo serviceinfo
); );
#abortthread
my $logfileextension = '.log'; my $logfileextension = '.log';
@ -96,9 +93,6 @@ our $attachmentlogfile;
my $loginitialized = 0; my $loginitialized = 0;
##eval {
# init_log4perl();
##};
init_log_default(); init_log_default();
sub createlogfile { sub createlogfile {

@ -1,21 +1,15 @@
# mail module: sending emails with attachments package NGCP::BulkProcessor::Mail;
package Mail;
#BEGIN { $INC{Mail} ||= __FILE__ };
use strict; use strict;
## no critic ## no critic
#require Logging; use NGCP::BulkProcessor::Logging qw(
use Logging qw( getlogger
getlogger emailinfo
emailinfo emaildebug
emaildebug); );
#use LogError qw(fileerror);
#use LogWarn qw(emailwarn);
#use LoadConfig; use NGCP::BulkProcessor::Globals qw(
use Globals qw(
$system_name $system_name
$system_instance_label $system_instance_label
$system_version $system_version
@ -33,7 +27,7 @@ use Globals qw(
$writefiles $writefiles
); );
use Utils qw(trim file_md5 create_guid wrap_text changemod); use NGCP::BulkProcessor::Utils qw(trim file_md5 create_guid wrap_text changemod);
use File::Basename; use File::Basename;
#use File::Temp qw(tempfile tempdir); #use File::Temp qw(tempfile tempdir);
@ -624,4 +618,4 @@ sub send_email {
} }
1; 1;

@ -0,0 +1,6 @@
package NGCP::BulkProcessor::NoSqlConnector;
use strict;
## no critic
1;

@ -1,21 +1,19 @@
package Projects::Migration::IPGallery::Dao::FeatureOption; package NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::FeatureOption;
use strict; use strict;
## no critic ## no critic
use File::Basename; #use File::Basename;
use Cwd; #use Cwd;
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../../'); #use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../../');
#use Logging qw(getlogger); use NGCP::BulkProcessor::Projects::Migration::IPGallery::ProjectConnectorPool qw(
use Projects::Migration::IPGallery::ProjectConnectorPool qw(
get_import_db get_import_db
); );
#import_db_tableidentifier #import_db_tableidentifier
use SqlRecord qw( use NGCP::BulkProcessor::SqlRecord qw(
registertableinfo registertableinfo
create_targettable create_targettable
checktableinfo checktableinfo
@ -25,7 +23,7 @@ use SqlRecord qw(
); );
require Exporter; require Exporter;
our @ISA = qw(Exporter SqlRecord); our @ISA = qw(Exporter NGCP::BulkProcessor::SqlRecord);
our @EXPORT_OK = qw( our @EXPORT_OK = qw(
create_table create_table
gettablename gettablename
@ -55,7 +53,7 @@ my $fixtable_statements = [];
sub new { sub new {
my $class = shift; my $class = shift;
my $self = SqlRecord->new($get_db, my $self = NGCP::BulkProcessor::SqlRecord->new($get_db,
$tablename, $tablename,
$expected_fieldnames,$indexes); $expected_fieldnames,$indexes);

@ -1,21 +1,19 @@
package Projects::Migration::IPGallery::Dao::FeatureOptionSet; package NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::FeatureOptionSet;
use strict; use strict;
## no critic ## no critic
use File::Basename; #use File::Basename;
use Cwd; #use Cwd;
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../../'); #use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../../');
#use Logging qw(getlogger); use NGCP::BulkProcessor::Projects::Migration::IPGallery::ProjectConnectorPool qw(
use Projects::Migration::IPGallery::ProjectConnectorPool qw(
get_import_db get_import_db
); );
#import_db_tableidentifier #import_db_tableidentifier
use SqlRecord qw( use NGCP::BulkProcessor::SqlRecord qw(
registertableinfo registertableinfo
create_targettable create_targettable
checktableinfo checktableinfo
@ -25,7 +23,7 @@ use SqlRecord qw(
); );
require Exporter; require Exporter;
our @ISA = qw(Exporter SqlRecord); our @ISA = qw(Exporter NGCP::BulkProcessor::SqlRecord);
our @EXPORT_OK = qw( our @EXPORT_OK = qw(
create_table create_table
gettablename gettablename
@ -47,16 +45,16 @@ my $expected_fieldnames = [ 'subscribernumber',
'option', 'option',
'optionsetitem' ]; 'optionsetitem' ];
my $primarykey_fieldnames = [ 'subscribernumber', 'option', 'optionsetitem' ]; my $primarykey_fieldnames = []; #[ 'subscribernumber', 'option', 'optionsetitem' ];
my $indexes = {}; my $indexes = { $tablename . '_subscribernumber_option_optionsetitem' => ['subscribernumber(11)', 'option(32)', 'optionsetitem(32)'] }; #(25),(27)
my $fixtable_statements = []; my $fixtable_statements = [];
sub new { sub new {
my $class = shift; my $class = shift;
my $self = SqlRecord->new($get_db, my $self = NGCP::BulkProcessor::SqlRecord->new($get_db,
$tablename, $tablename,
$expected_fieldnames,$indexes); $expected_fieldnames,$indexes);

@ -0,0 +1,133 @@
package NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::Subscriber;
use strict;
## no critic
#use File::Basename;
#use Cwd;
#use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../../');
use NGCP::BulkProcessor::Projects::Migration::IPGallery::ProjectConnectorPool qw(
get_import_db
);
#import_db_tableidentifier
use NGCP::BulkProcessor::SqlRecord qw(
registertableinfo
create_targettable
checktableinfo
copy_row
insert_stmt
);
require Exporter;
our @ISA = qw(Exporter NGCP::BulkProcessor::SqlRecord);
our @EXPORT_OK = qw(
create_table
gettablename
check_table
getinsertstatement
test_table_bycolumn1
test_table_local_select
test_table_source_select
test_table_source_select_temptable
);
my $tablename = 'subscriber';
my $get_db = \&get_import_db;
#my $get_tablename = \&import_db_tableidentifier;
my $expected_fieldnames = [
'country_code', #356
'area_code', #None
'dial_number', #35627883323
'rgw_fqdn', #35627883323
'port', #None
'region_name', #None
'carrier_code', #None
'time_zone_name', #malta
'lang_code', #eng
'barring_profile', #None
];
my $primarykey_fieldnames = [ 'country_code', 'area_code', 'dial_number' ];
my $indexes = {};
my $fixtable_statements = [];
sub new {
my $class = shift;
my $self = NGCP::BulkProcessor::SqlRecord->new($get_db,
$tablename,
$expected_fieldnames,$indexes);
bless($self,$class);
copy_row($self,shift,$expected_fieldnames);
return $self;
}
sub create_table {
my ($truncate) = @_;
my $db = &$get_db();
registertableinfo($db,$tablename,$expected_fieldnames,$indexes,$primarykey_fieldnames);
return create_targettable($db,$tablename,$db,$tablename,$truncate,0,undef);
}
sub buildrecords_fromrows {
my ($rows,$load_recursive) = @_;
my @records = ();
my $record;
if (defined $rows and ref $rows eq 'ARRAY') {
foreach my $row (@$rows) {
$record = __PACKAGE__->new($row);
# transformations go here ...
push @records,$record;
}
}
return \@records;
}
sub getinsertstatement {
check_table();
return insert_stmt($get_db,$tablename);
}
sub gettablename {
return $tablename;
}
sub check_table {
return checktableinfo($get_db,
$tablename,
$expected_fieldnames,
$indexes);
}
1;

@ -1,11 +1,11 @@
package Projects::Migration::IPGallery::FeaturesDefineParser; package NGCP::BulkProcessor::Projects::Migration::IPGallery::FeaturesDefineParser;
use strict; use strict;
## no critic ## no critic
use File::Basename; #use File::Basename;
use Cwd; #use Cwd;
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../'); #use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../');
use Marpa::R2; use Marpa::R2;
use Data::Dumper::Concise; use Data::Dumper::Concise;

@ -1,32 +1,28 @@
package Projects::Migration::IPGallery::FileProcessors::FeaturesDefineFile; package NGCP::BulkProcessor::Projects::Migration::IPGallery::FileProcessors::FeaturesDefineFile;
use strict; use strict;
## no critic ## no critic
use File::Basename; #use File::Basename;
use Cwd; #use Cwd;
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../../'); #use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../../');
#use Globals qw( use NGCP::BulkProcessor::Logging qw(
# $cpucount
#);
use Logging qw(
getlogger getlogger
); );
use LogError qw( use NGCP::BulkProcessor::LogError qw(
fileprocessingerror fileprocessingerror
fileprocessingwarn fileprocessingwarn
); );
use FileProcessor; use NGCP::BulkProcessor::FileProcessor;
use Projects::Migration::IPGallery::FeaturesDefineParser qw( use NGCP::BulkProcessor::Projects::Migration::IPGallery::FeaturesDefineParser qw(
create_grammar create_grammar
parse parse
); );
require Exporter; require Exporter;
our @ISA = qw(Exporter FileProcessor); our @ISA = qw(Exporter NGCP::BulkProcessor::FileProcessor);
our @EXPORT_OK = qw(); our @EXPORT_OK = qw();
my $lineseparator = '\\n(?=(?:\d+\\n))'; my $lineseparator = '\\n(?=(?:\d+\\n))';
@ -34,9 +30,9 @@ my $encoding = 'UTF-8';
my $buffersize = 1400; # 512 * 1024; my $buffersize = 1400; # 512 * 1024;
my $threadqueuelength = 10; my $threadqueuelength = 10;
my $default_numofthreads = undef; #3; my $default_numofthreads = 2; #3;
#my $multithreading = 0; #my $multithreading = 0;
my $blocksize = 200; #2000; my $blocksize = 1000; #2000;
my $stoponparseerrors = 1; #1; my $stoponparseerrors = 1; #1;
my $parselines = 0; my $parselines = 0;
@ -45,7 +41,7 @@ sub new {
my $class = shift; my $class = shift;
my $self = FileProcessor->new(@_); my $self = NGCP::BulkProcessor::FileProcessor->new(@_);
$self->{numofthreads} = shift // $default_numofthreads; $self->{numofthreads} = shift // $default_numofthreads;
$self->{line_separator} = $lineseparator; $self->{line_separator} = $lineseparator;

@ -0,0 +1,66 @@
package NGCP::BulkProcessor::Projects::Migration::IPGallery::FileProcessors::SubscriberDefineFile;
use strict;
## no critic
#use File::Basename;
#use Cwd;
#use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../../');
use NGCP::BulkProcessor::Logging qw(
getlogger
);
use NGCP::BulkProcessor::LogError qw(
fileprocessingerror
fileprocessingwarn
);
use NGCP::BulkProcessor::FileProcessor;
require Exporter;
our @ISA = qw(Exporter NGCP::BulkProcessor::FileProcessor);
our @EXPORT_OK = qw();
my $lineseparator = '\\n';
my $fieldseparator = " +";
my $encoding = 'UTF-8';
my $buffersize = 100 * 1024;
my $threadqueuelength = 10;
my $default_numofthreads = 3;
#my $multithreading = 0;
my $blocksize = 100;
sub new {
my $class = shift;
my $self = NGCP::BulkProcessor::FileProcessor->new(@_);
$self->{numofthreads} = shift // $default_numofthreads;
$self->{line_separator} = $lineseparator;
$self->{field_separator} = $fieldseparator;
$self->{encoding} = $encoding;
$self->{buffersize} = $buffersize;
$self->{threadqueuelength} = $threadqueuelength;
#$self->{multithreading} = $multithreading;
$self->{blocksize} = $blocksize;
bless($self,$class);
#restdebug($self,__PACKAGE__ . ' file processor created',getlogger(__PACKAGE__));
return $self;
}
sub extractfields {
my ($context,$line_ref) = @_;
my $separator = $context->{instance}->{field_separator};
$$line_ref =~ s/^ +//;
$$line_ref =~ s/ +$//;
my @fields = split(/$separator/,$$line_ref,-1);
return \@fields;
}
1;

@ -0,0 +1,164 @@
package NGCP::BulkProcessor::Projects::Migration::IPGallery::Import;
use strict;
## no critic
#use File::Basename;
#use Cwd;
#use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../');
use NGCP::BulkProcessor::Globals qw(
$cpucount
);
use NGCP::BulkProcessor::Projects::Migration::IPGallery::Settings qw(
$import_multithreading
$features_define_import_numofthreads
$skip_duplicate_setoptionitems
$subscriber_define_import_numofthreads
$dry
);
use NGCP::BulkProcessor::Logging qw (
getlogger
);
use NGCP::BulkProcessor::LogError qw(
fileprocessingwarn
fileprocessingerror
);
use NGCP::BulkProcessor::Projects::Migration::IPGallery::FileProcessors::FeaturesDefineFile qw();
use NGCP::BulkProcessor::Projects::Migration::IPGallery::FeaturesDefineParser qw();
use NGCP::BulkProcessor::Projects::Migration::IPGallery::FileProcessors::SubscriberDefineFile qw();
use NGCP::BulkProcessor::Projects::Migration::IPGallery::ProjectConnectorPool qw(
get_import_db
destroy_dbs
);
use NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::FeatureOption qw();
use NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::FeatureOptionSet qw();
use NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::Subscriber qw();
use NGCP::BulkProcessor::Array qw(removeduplicates);
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(
import_features_define
import_subscriber_define
);
sub import_features_define {
my ($file) = @_;
my $result = NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::FeatureOption::create_table(1);
$result &= NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::FeatureOptionSet::create_table(1);
destroy_dbs(); #close all db connections before forking..
my $importer = NGCP::BulkProcessor::Projects::Migration::IPGallery::FileProcessors::FeaturesDefineFile->new($features_define_import_numofthreads);
$importer->{stoponparseerrors} = !$dry;
return $result && $importer->process($file,sub {
my ($context,$rows,$row_offset) = @_;
my $rownum = $row_offset;
my @featureoption_rows = ();
my @featureoptionset_rows = ();
foreach my $line (@$rows) {
my $row = undef;
if (not $importer->{parselines}) {
eval {
$row = NGCP::BulkProcessor::Projects::Migration::IPGallery::FeaturesDefineParser::parse(\$line,$context->{grammar});
};
if ($@) {
if ($importer->{stoponparseerrors}) {
fileprocessingerror($context->{filename},'record ' . ($rownum + 1) . ' - ' . $@,getlogger(__PACKAGE__));
} else {
fileprocessingwarn($context->{filename},'record ' . ($rownum + 1) . ' - ' . $@,getlogger(__PACKAGE__));
}
}
}
next unless defined $row;
$rownum++;
foreach my $subscriber_number (keys %$row) {
foreach my $option (@{$row->{$subscriber_number}}) {
if ('HASH' eq ref $option) {
foreach my $setoption (keys %$option) {
foreach my $setoptionitem (@{$skip_duplicate_setoptionitems ? removeduplicates($option->{$setoption}) : $option->{$setoption}}) {
push(@featureoptionset_rows,[ $subscriber_number, $setoption, $setoptionitem ]);
}
push(@featureoption_rows,[ $subscriber_number, $setoption ]);
}
} else {
push(@featureoption_rows,[ $subscriber_number, $option ]);
}
}
}
}
if ((scalar @featureoption_rows) > 0) {
$context->{db}->db_do_begin(
NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::FeatureOption::getinsertstatement(),
NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::FeatureOption::gettablename(),
#lock - $import_multithreading
);
$context->{db}->db_do_rowblock(\@featureoption_rows);
$context->{db}->db_finish();
}
if ((scalar @featureoptionset_rows) > 0) {
$context->{db}->db_do_begin(
NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::FeatureOptionSet::getinsertstatement(),
NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::FeatureOptionSet::gettablename(),
#lock
);
$context->{db}->db_do_rowblock(\@featureoptionset_rows);
$context->{db}->db_finish();
}
return 1;
}, sub {
my ($context)= @_;
if (not $importer->{parselines}) {
eval {
$context->{grammar} = NGCP::BulkProcessor::Projects::Migration::IPGallery::FeaturesDefineParser::create_grammar();
};
if ($@) {
fileprocessingerror($context->{filename},$@,getlogger(__PACKAGE__));
}
}
$context->{db} = &get_import_db(); # keep ref count low..
}, sub {
my ($context)= @_;
undef $context->{db};
destroy_dbs();
},$import_multithreading);
}
sub import_subscriber_define {
my ($file) = @_;
my $result = NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::Subscriber::create_table(1);
my $importer = NGCP::BulkProcessor::Projects::Migration::IPGallery::FileProcessors::SubscriberDefineFile->new($subscriber_define_import_numofthreads);
destroy_dbs(); #close all db connections before forking..
return $result && $importer->process($file,sub {
my ($context,$rows,$row_offset) = @_;
if ((scalar @$rows) > 0) {
$context->{db}->db_do_begin(
NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::Subscriber::getinsertstatement(),
NGCP::BulkProcessor::Projects::Migration::IPGallery::Dao::Subscriber::gettablename(),
#lock - $import_multithreading
);
$context->{db}->db_do_rowblock($rows);
$context->{db}->db_finish();
}
return 1;
}, sub {
my ($context)= @_;
$context->{db} = &get_import_db(); # keep ref count low..
}, sub {
my ($context)= @_;
undef $context->{db};
destroy_dbs();
}, $import_multithreading);
}
1;

@ -1,4 +1,4 @@
package Projects::Migration::IPGallery::ProjectConnectorPool; package NGCP::BulkProcessor::Projects::Migration::IPGallery::ProjectConnectorPool;
use strict; use strict;
## no critic ## no critic
@ -7,28 +7,26 @@ use File::Basename;
use Cwd; use Cwd;
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../'); use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../');
use Projects::Migration::IPGallery::Settings qw( use NGCP::BulkProcessor::Projects::Migration::IPGallery::Settings qw(
$import_db_file $import_db_file
); );
use ConnectorPool qw( use NGCP::BulkProcessor::ConnectorPool qw(
get_connectorinstancename get_connectorinstancename
); );
#use SqlConnectors::MySQLDB; #use NGCP::BulkProcessor::SqlConnectors::MySQLDB;
#use SqlConnectors::OracleDB; #use NGCP::BulkProcessor::SqlConnectors::OracleDB;
#use SqlConnectors::PostgreSQLDB; #use NGCP::BulkProcessor::SqlConnectors::PostgreSQLDB;
use SqlConnectors::SQLiteDB qw( use NGCP::BulkProcessor::SqlConnectors::SQLiteDB qw(
$staticdbfilemode $staticdbfilemode
cleanupdbfiles cleanupdbfiles
); );
#use SqlConnectors::CSVDB; #use NGCP::BulkProcessor::SqlConnectors::CSVDB;
#use SqlConnectors::SQLServerDB; #use NGCP::BulkProcessor::SqlConnectors::SQLServerDB;
#use RestConnectors::NGCPRestApi; #use NGCP::BulkProcessor::RestConnectors::NGCPRestApi;
use SqlRecord qw(cleartableinfo); use NGCP::BulkProcessor::SqlRecord qw(cleartableinfo);
#use Utils qw(threadid);
require Exporter; require Exporter;
our @ISA = qw(Exporter); our @ISA = qw(Exporter);
@ -49,7 +47,7 @@ sub get_import_db {
my $name = get_connectorinstancename($instance_name); #threadid(); #shift; my $name = get_connectorinstancename($instance_name); #threadid(); #shift;
if (not defined $import_dbs->{$name}) { if (not defined $import_dbs->{$name}) {
$import_dbs->{$name} = SqlConnectors::SQLiteDB->new($instance_name); #$name); $import_dbs->{$name} = NGCP::BulkProcessor::SqlConnectors::SQLiteDB->new($instance_name); #$name);
if (not defined $reconnect) { if (not defined $reconnect) {
$reconnect = 1; $reconnect = 1;
} }
@ -66,7 +64,7 @@ sub import_db_tableidentifier {
my ($get_target_db,$tablename) = @_; my ($get_target_db,$tablename) = @_;
my $target_db = (ref $get_target_db eq 'CODE') ? &$get_target_db() : $get_target_db; my $target_db = (ref $get_target_db eq 'CODE') ? &$get_target_db() : $get_target_db;
return $target_db->getsafetablename(SqlConnectors::SQLiteDB::get_tableidentifier($tablename,$staticdbfilemode,$import_db_file)); return $target_db->getsafetablename(NGCP::BulkProcessor::SqlConnectors::SQLiteDB::get_tableidentifier($tablename,$staticdbfilemode,$import_db_file));
} }

@ -1,20 +1,20 @@
package Projects::Migration::IPGallery::Settings; package NGCP::BulkProcessor::Projects::Migration::IPGallery::Settings;
use strict; use strict;
## no critic ## no critic
use File::Basename; #use File::Basename;
use Cwd; #use Cwd;
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../'); #use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../');
use Globals qw( use NGCP::BulkProcessor::Globals qw(
update_working_path update_working_path
$input_path $input_path
$enablemultithreading $enablemultithreading
$cpucount $cpucount
); );
use Logging qw( use NGCP::BulkProcessor::Logging qw(
getlogger getlogger
scriptinfo scriptinfo
); );
@ -26,7 +26,10 @@ our @EXPORT_OK = qw(
$defaultsettings $defaultsettings
$defaultconfig $defaultconfig
$features_define_filename $features_define_filename
$feature_define_import_numofthreads $features_define_import_numofthreads
$skip_duplicate_setoptionitems
$subscriber_define_filename
$subscriber_define_import_numofthreads
$import_multithreading $import_multithreading
$run_id $run_id
@ -40,9 +43,14 @@ our $defaultconfig = 'config.cfg';
our $defaultsettings = 'settings.cfg'; our $defaultsettings = 'settings.cfg';
our $features_define_filename = undef; our $features_define_filename = undef;
our $subscriber_define_filename = undef;
our $import_multithreading = $enablemultithreading; our $import_multithreading = $enablemultithreading;
our $feature_define_import_numofthreads = $cpucount; our $features_define_import_numofthreads = $cpucount;
our $subscriber_define_import_numofthreads = $cpucount;
our $skip_duplicate_setoptionitems = 0;
our $force = 0; our $force = 0;
our $dry = 1; our $dry = 1;
@ -71,12 +79,21 @@ sub update_settings {
$features_define_filename = $input_path . $features_define_filename unless -e $features_define_filename; $features_define_filename = $input_path . $features_define_filename unless -e $features_define_filename;
} }
$subscriber_define_filename = $data->{subscriber_define_filename} if exists $data->{subscriber_define_filename};
if (defined $subscriber_define_filename and length($subscriber_define_filename) > 0) {
$subscriber_define_filename = $input_path . $subscriber_define_filename unless -e $subscriber_define_filename;
}
$import_multithreading = $data->{import_multithreading} if exists $data->{import_multithreading}; $import_multithreading = $data->{import_multithreading} if exists $data->{import_multithreading};
#my $new_working_path = (exists $data->{working_path} ? $data->{working_path} : $working_path); #my $new_working_path = (exists $data->{working_path} ? $data->{working_path} : $working_path);
$feature_define_import_numofthreads = $cpucount; $features_define_import_numofthreads = $cpucount;
$feature_define_import_numofthreads = $data->{feature_define_import_numofthreads} if exists $data->{feature_define_import_numofthreads}; $features_define_import_numofthreads = $data->{features_define_import_numofthreads} if exists $data->{features_define_import_numofthreads};
$feature_define_import_numofthreads = $cpucount if $feature_define_import_numofthreads > $cpucount; $features_define_import_numofthreads = $cpucount if $features_define_import_numofthreads > $cpucount;
$subscriber_define_import_numofthreads = $cpucount;
$subscriber_define_import_numofthreads = $data->{subscriber_define_import_numofthreads} if exists $data->{subscriber_define_import_numofthreads};
$subscriber_define_import_numofthreads = $cpucount if $subscriber_define_import_numofthreads > $cpucount;
#return update_working_path($new_working_path,1,$fileerrorcode,$configlogger); #return update_working_path($new_working_path,1,$fileerrorcode,$configlogger);
$import_db_file = ((defined $run_id and length($run_id) > 0) ? '_' : '') . 'import'; $import_db_file = ((defined $run_id and length($run_id) > 0) ? '_' : '') . 'import';

@ -4,52 +4,56 @@ use strict;
use File::Basename; use File::Basename;
use Cwd; use Cwd;
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../'); use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../../../');
use Getopt::Long qw(GetOptions); use Getopt::Long qw(GetOptions);
use Fcntl qw(LOCK_EX LOCK_NB); use Fcntl qw(LOCK_EX LOCK_NB);
use Globals qw(); use NGCP::BulkProcessor::Globals qw();
use Projects::Migration::IPGallery::Settings qw( use NGCP::BulkProcessor::Projects::Migration::IPGallery::Settings qw(
$defaultsettings $defaultsettings
$defaultconfig $defaultconfig
update_settings update_settings
check_dry check_dry
$run_id $run_id
$features_define_filename $features_define_filename
$subscriber_define_filename
$dry $dry
$force $force
); );
use Logging qw( use NGCP::BulkProcessor::Logging qw(
init_log init_log
getlogger getlogger
$attachmentlogfile $attachmentlogfile
scriptinfo scriptinfo
); );
use LogError qw ( use NGCP::BulkProcessor::LogError qw (
completion completion
success success
scriptwarn scriptwarn
scripterror scripterror
); );
use LoadConfig qw( use NGCP::BulkProcessor::LoadConfig qw(
load_config load_config
$SIMPLE_CONFIG_TYPE $SIMPLE_CONFIG_TYPE
$YAML_CONFIG_TYPE $YAML_CONFIG_TYPE
); );
use Array qw(removeduplicates); use NGCP::BulkProcessor::Array qw(removeduplicates);
use Utils qw(getscriptpath prompt); use NGCP::BulkProcessor::Utils qw(getscriptpath prompt);
use Mail qw(wrap_mailbody use NGCP::BulkProcessor::Mail qw(
$signature wrap_mailbody
$normalpriority $signature
$lowpriority $normalpriority
$highpriority); $lowpriority
$highpriority
use ConnectorPool qw(); );
use Projects::Migration::IPGallery::ProjectConnectorPool qw();
use NGCP::BulkProcessor::ConnectorPool qw();
use Projects::Migration::IPGallery::Import qw( use NGCP::BulkProcessor::Projects::Migration::IPGallery::ProjectConnectorPool qw();
use NGCP::BulkProcessor::Projects::Migration::IPGallery::Import qw(
import_features_define import_features_define
import_subscriber_define
); );
scripterror(getscriptpath() . ' already running',getlogger(getscriptpath())) unless flock DATA, LOCK_EX | LOCK_NB; # not tested on windows yet scripterror(getscriptpath() . ' already running',getlogger(getscriptpath())) unless flock DATA, LOCK_EX | LOCK_NB; # not tested on windows yet
@ -59,6 +63,8 @@ my @TASK_OPTS = ();
my $tasks = []; my $tasks = [];
my $import_features_define_task_opt = 'import_features_define'; my $import_features_define_task_opt = 'import_features_define';
push(@TASK_OPTS,$import_features_define_task_opt); push(@TASK_OPTS,$import_features_define_task_opt);
my $import_subscriber_define_task_opt = 'import_subscriber_define';
push(@TASK_OPTS,$import_subscriber_define_task_opt);
if (init()) { if (init()) {
main(); main();
@ -102,6 +108,9 @@ sub main() {
if (lc($import_features_define_task_opt) eq lc($task)) { if (lc($import_features_define_task_opt) eq lc($task)) {
scriptinfo('task: ' . $import_features_define_task_opt,getlogger(getscriptpath())); scriptinfo('task: ' . $import_features_define_task_opt,getlogger(getscriptpath()));
$result |= import_features_define_task(\@messages); $result |= import_features_define_task(\@messages);
} elsif (lc($import_subscriber_define_task_opt) eq lc($task)) {
scriptinfo('task: ' . $import_subscriber_define_task_opt,getlogger(getscriptpath()));
$result |= import_subscriber_define_task(\@messages);
} elsif (lc('blah') eq lc($task)) { } elsif (lc('blah') eq lc($task)) {
scriptinfo('task: ' . 'balh',getlogger(getscriptpath())); scriptinfo('task: ' . 'balh',getlogger(getscriptpath()));
next unless check_dry(); next unless check_dry();
@ -151,11 +160,26 @@ sub import_features_define_task {
} }
sub import_subscriber_define_task {
my ($messages) = shift;
if (import_subscriber_define(
$subscriber_define_filename
)) {
push(@$messages,'sucessfully inserted x records...');
return 1;
} else {
push(@$messages,'was not executed');
return 0;
}
}
END { END {
# this should not be required explicitly, but prevents Log4Perl's # this should not be required explicitly, but prevents Log4Perl's
# "rootlogger not initialized error upon exit.. # "rootlogger not initialized error upon exit..
Projects::Migration::IPGallery::ProjectConnectorPool::destroy_dbs(); NGCP::BulkProcessor::Projects::Migration::IPGallery::ProjectConnectorPool::destroy_dbs();
ConnectorPool::destroy_dbs(); NGCP::BulkProcessor::ConnectorPool::destroy_dbs();
} }
__DATA__ __DATA__

@ -0,0 +1,10 @@
features_define_filename = /home/rkrenn/test/Features_Define.cfg
import_multithreading = 1
features_define_import_numofthreads = 2
subscriber_define_filename = /home/rkrenn/test/Subscriber_Define.cfg
subscriber_define_import_numofthreads = 2
#dry=0

@ -2,6 +2,8 @@
use warnings; use warnings;
use strict; use strict;
## no critic
use Marpa::R2; use Marpa::R2;
use Data::Dumper; use Data::Dumper;

@ -1,12 +1,19 @@
# mysql, oracle, mssql, .. matrix db interconnection test
use strict; use strict;
## no critic ## no critic
use LoadCLIConfig; use File::Basename;
use Cwd;
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../../');
# mysql, oracle, mssql, .. matrix db interconnection test
use ConnectorPool qw( use NGCP::BulkProcessor::Globals qw($defaultconfig);
use NGCP::BulkProcessor::LoadConfig qw(
load_config
);
use NGCP::BulkProcessor::ConnectorPool qw(
destroy_dbs destroy_dbs
get_sqlserver_test_db get_sqlserver_test_db
get_postgres_test_db get_postgres_test_db
@ -25,6 +32,8 @@ use test::postgres_table;
use test::sqlite_table; use test::sqlite_table;
use test::sqlserver_table; use test::sqlserver_table;
load_config($defaultconfig);
my $sort_config = [ { numeric => 1, my $sort_config = [ { numeric => 1,
dir => 1, dir => 1,
column => 'column1', column => 'column1',
@ -150,20 +159,20 @@ sub test_select_source_mysql {
} }
sub test_select_local { sub test_select_local {
$ConnectorPool::test_db = 'sqlserver'; $NGCP::BulkProcessor::ConnectorPool::test_db = 'sqlserver';
_table_local_selects(); _table_local_selects();
$ConnectorPool::test_db = 'postgres'; $NGCP::BulkProcessor::ConnectorPool::test_db = 'postgres';
_table_local_selects(); _table_local_selects();
$ConnectorPool::test_db = 'oracle'; $NGCP::BulkProcessor::ConnectorPool::test_db = 'oracle';
_table_local_selects(); _table_local_selects();
$ConnectorPool::test_db = 'sqlite'; $NGCP::BulkProcessor::ConnectorPool::test_db = 'sqlite';
_table_local_selects(); _table_local_selects();
$ConnectorPool::test_db = 'mysql'; $NGCP::BulkProcessor::ConnectorPool::test_db = 'mysql';
_table_local_selects(); _table_local_selects();
$ConnectorPool::test_db = 'csv'; $NGCP::BulkProcessor::ConnectorPool::test_db = 'csv';
_table_local_selects(); _table_local_selects();
$ConnectorPool::test_db = 'mysql'; $NGCP::BulkProcessor::ConnectorPool::test_db = 'mysql';
} }
sub _table_local_selects { sub _table_local_selects {
my $result = test::sqlserver_table::test_table_local_select('column1 is not null',2,1,$sort_config); my $result = test::sqlserver_table::test_table_local_select('column1 is not null',2,1,$sort_config);
@ -232,4 +241,4 @@ run_suite();
destroy_dbs(); destroy_dbs();
exit; exit;

@ -1,19 +1,26 @@
# gearman service layer test
use strict; use strict;
## no critic ## no critic
use LoadCLIConfig; use File::Basename;
use Cwd;
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../../../../');
use Logging; # gearman service layer test
use NGCP::BulkProcessor::Globals qw($defaultconfig);
use NGCP::BulkProcessor::LoadConfig qw(
load_config
);
use NGCP::BulkProcessor::Logging;
use Test::Unit::Procedural; use Test::Unit::Procedural;
use Service::TestService; use NGCP::BulkProcessor::Service::TestService;
use ServiceProxy qw(new_async_do); use NGCP::BulkProcessor::ServiceProxy qw(new_async_do);
use Serialization qw( use NGCP::BulkProcessor::Serialization qw(
$format_xml $format_xml
$format_yaml $format_yaml
$format_json $format_json
@ -21,16 +28,18 @@ use Serialization qw(
$format_perl $format_perl
); );
load_config($defaultconfig);
my $service1; my $service1;
my $service2; my $service2;
my $service3; my $service3;
my $service = test::TestService->new(); my $service = NGCP::BulkProcessor::Service::TestService->new();
my $proxy = ServiceProxy->new(); my $proxy = NGCP::BulkProcessor::ServiceProxy->new();
#$service1 = test::TestService->new(); #$service1 = test::TestService->new();
#$service2 = test::TestService->new(); #$service2 = test::TestService->new();
#$service3 = test::TestService->new(); #$service3 = test::TestService->new();
sub set_up { sub set_up {
@ -191,7 +200,7 @@ sub test_exception_do {
sub test_sleep_roundtrip_do { sub test_sleep_roundtrip_do {
my $proxy = ServiceProxy->new(undef,1.5); my $proxy = NGCP::BulkProcessor::ServiceProxy->new(undef,1.5);
my $data = {}; my $data = {};
@ -208,7 +217,7 @@ sub test_sleep_roundtrip_do {
sub test_sleep_roundtrip_do_async1 { sub test_sleep_roundtrip_do_async1 {
#my $service = test::TestService->new(); #my $service = test::TestService->new();
my $proxy = ServiceProxy->new(); my $proxy = NGCP::BulkProcessor::ServiceProxy->new();
my $data = {}; my $data = {};
my $output = undef; my $output = undef;
@ -344,4 +353,4 @@ run_suite();
undef $service; undef $service;
undef $proxy; undef $proxy;
exit; exit;

@ -1,4 +1,4 @@
package RandomString; package NGCP::BulkProcessor::RandomString;
use strict; use strict;
## no critic ## no critic
@ -284,4 +284,4 @@ sub createtmpstring {
} }
1; 1;

@ -1,4 +1,4 @@
package RestConnector; package NGCP::BulkProcessor::RestConnector;
use strict; use strict;
## no critic ## no critic
@ -6,19 +6,18 @@ use strict;
use URI; use URI;
use LWP::UserAgent qw(); use LWP::UserAgent qw();
use Logging qw( use NGCP::BulkProcessor::Logging qw(
getlogger getlogger
restdebug restdebug
restinfo); restinfo);
use LogError qw( use NGCP::BulkProcessor::LogError qw(
resterror resterror
restwarn restwarn
restrequesterror restrequesterror
restresponseerror restresponseerror
notimplementederror); notimplementederror);
use Utils qw(threadid); use NGCP::BulkProcessor::Utils qw(threadid);
#use Array qw(arrayeq);
require Exporter; require Exporter;
our @ISA = qw(Exporter); our @ISA = qw(Exporter);
@ -39,7 +38,7 @@ sub new {
$self->{netloc} = undef; $self->{netloc} = undef;
$self->{ua} = undef; $self->{ua} = undef;
$self->{req} = undef; $self->{req} = undef;
$self->{res} = undef; $self->{res} = undef;
$self->{requestdata} = undef; $self->{requestdata} = undef;
@ -58,7 +57,7 @@ sub connectidentifier {
} }
sub baseuri { sub baseuri {
my $self = shift; my $self = shift;
if (@_) { if (@_) {
my $uri = shift; my $uri = shift;
@ -75,7 +74,7 @@ sub baseuri {
} }
} }
return (defined $self->{uri} ? $self->{uri}->clone() : undef); return (defined $self->{uri} ? $self->{uri}->clone() : undef);
} }
sub _clearrequestdata { sub _clearrequestdata {
@ -130,7 +129,7 @@ sub _ua_request {
} }
sub _add_headers { sub _add_headers {
my ($req,$headers) = @_; my ($req,$headers) = @_;
foreach my $headername (keys %$headers) { foreach my $headername (keys %$headers) {
$req->header($headername => $headers->{$headername}); $req->header($headername => $headers->{$headername});
} }
@ -220,7 +219,7 @@ sub post {
restresponseerror($self,'error decoding POST response content: ' . $@,$self->{res},getlogger(__PACKAGE__)); restresponseerror($self,'error decoding POST response content: ' . $@,$self->{res},getlogger(__PACKAGE__));
} }
return $self->{res}; return $self->{res};
} }
sub _add_get_headers { sub _add_get_headers {
@ -250,9 +249,9 @@ sub get {
}; };
if ($@) { if ($@) {
restresponseerror($self,'error decoding GET response content: ' . $@,$self->{res},getlogger(__PACKAGE__)); restresponseerror($self,'error decoding GET response content: ' . $@,$self->{res},getlogger(__PACKAGE__));
} }
return $self->{res}; return $self->{res};
} }
sub _add_patch_headers { sub _add_patch_headers {
@ -297,7 +296,7 @@ sub patch {
restresponseerror($self,'error decoding PATCH response content: ' . $@,$self->{res},getlogger(__PACKAGE__)); restresponseerror($self,'error decoding PATCH response content: ' . $@,$self->{res},getlogger(__PACKAGE__));
} }
return $self->{res}; return $self->{res};
} }
sub _add_put_headers { sub _add_put_headers {
@ -342,7 +341,7 @@ sub put {
restresponseerror($self,'error decoding PUT response content: ' . $@,$self->{res},getlogger(__PACKAGE__)); restresponseerror($self,'error decoding PUT response content: ' . $@,$self->{res},getlogger(__PACKAGE__));
} }
return $self->{res}; return $self->{res};
} }
sub _add_delete_headers { sub _add_delete_headers {
@ -374,7 +373,7 @@ sub delete {
restresponseerror($self,'error decoding DELETE response content: ' . $@,$self->{res},getlogger(__PACKAGE__)); restresponseerror($self,'error decoding DELETE response content: ' . $@,$self->{res},getlogger(__PACKAGE__));
} }
return $self->{res}; return $self->{res};
} }
sub instanceidentifier { sub instanceidentifier {
@ -407,4 +406,4 @@ sub responsedata {
return $self->{responsedata}; return $self->{responsedata};
} }
1; 1;

@ -1,30 +1,30 @@
package RestConnectors::NGCPRestApi; package NGCP::BulkProcessor::RestConnectors::NGCPRestApi;
use strict; use strict;
## no critic ## no critic
use File::Basename; #use File::Basename;
use Cwd; #use Cwd;
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../'); #use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../');
use JSON qw(); use JSON qw();
use Globals qw($LongReadLen_limit); use NGCP::BulkProcessor::Globals qw($LongReadLen_limit);
use Logging qw( use NGCP::BulkProcessor::Logging qw(
getlogger getlogger
restdebug restdebug
restinfo restinfo
); );
use LogError qw( use NGCP::BulkProcessor::LogError qw(
resterror resterror
restwarn restwarn
restrequesterror restrequesterror
restresponseerror); restresponseerror);
use RestConnector; use NGCP::BulkProcessor::RestConnector;
require Exporter; require Exporter;
our @ISA = qw(Exporter RestConnector); our @ISA = qw(Exporter NGCP::BulkProcessor::RestConnector);
our @EXPORT_OK = qw(); our @EXPORT_OK = qw();
my $defaulturi = 'https://127.0.0.1:443'; my $defaulturi = 'https://127.0.0.1:443';
@ -41,7 +41,7 @@ sub new {
my $class = shift; my $class = shift;
my $self = RestConnector->new(@_); my $self = NGCP::BulkProcessor::RestConnector->new(@_);
baseuri(shift // $defaulturi); baseuri(shift // $defaulturi);
$self->{username} = shift; $self->{username} = shift;
@ -138,4 +138,4 @@ sub _add_delete_headers {
$self->SUPER::_add_delete_headers($req,$headers); $self->SUPER::_add_delete_headers($req,$headers);
} }
1; 1;

@ -1,4 +1,4 @@
package Serialization; package NGCP::BulkProcessor::Serialization;
use strict; use strict;
## no critic ## no critic
@ -22,7 +22,7 @@ our @EXPORT_OK = qw(
deserialize_perl deserialize_perl
serialize_storable_base64 serialize_storable_base64
deserialize_storable_base64 deserialize_storable_base64
$format_xml $format_xml
$format_yaml $format_yaml
$format_json $format_json
@ -113,10 +113,10 @@ sub deserialize {
} elsif ($format == $format_perl) { } elsif ($format == $format_perl) {
return deserialize_perl($input_ref); return deserialize_perl($input_ref);
} elsif ($format == $format_storable_base64) { } elsif ($format == $format_storable_base64) {
return deserialize_storable_base64($input_ref); return deserialize_storable_base64($input_ref);
} else { #$format_storable } else { #$format_storable
return deserialize_storable($input_ref); return deserialize_storable($input_ref);
} }
} }
sub serialize_storable { sub serialize_storable {
@ -150,7 +150,7 @@ sub _get_xml_dumper {
$xml_dumper = XML::Dumper->new(%xml_parser_params); $xml_dumper = XML::Dumper->new(%xml_parser_params);
#$xml_dumper->{xml_parser_params} = \%xml_parser_params; #$xml_dumper->{xml_parser_params} = \%xml_parser_params;
$xml_dumper->dtd(); $xml_dumper->dtd();
return $xml_dumper; return $xml_dumper;
} }
@ -208,6 +208,6 @@ sub deserialize_perl {
} else { } else {
return $data; return $data;
} }
} }
1; 1;

@ -1,6 +1,4 @@
# service layer backend package NGCP::BulkProcessor::Service;
package Service;
use strict; use strict;
## no critic ## no critic
@ -8,24 +6,24 @@ use strict;
use threads qw(yield); use threads qw(yield);
use threads::shared; use threads::shared;
use Globals qw( use NGCP::BulkProcessor::Globals qw(
@jobservers @jobservers
$jobnamespace $jobnamespace
); );
use Logging qw( use NGCP::BulkProcessor::Logging qw(
getlogger getlogger
servicedebug servicedebug
serviceinfo serviceinfo
); );
use LogError qw( use NGCP::BulkProcessor::LogError qw(
serviceerror serviceerror
servicewarn servicewarn
notimplementederror notimplementederror
); );
use Utils qw(threadid); use NGCP::BulkProcessor::Utils qw(threadid);
use Serialization qw(serialize deserialize); use NGCP::BulkProcessor::Serialization qw(serialize deserialize);
use Encode qw(encode_utf8); use Encode qw(encode_utf8);
@ -290,4 +288,4 @@ sub _is_create_thread {
return $self->{create_tid} == threadid(); return $self->{create_tid} == threadid();
} }
1; 1;

@ -1,15 +1,15 @@
package Service::TestService; package NGCP::BulkProcessor::Service::TestService;
use strict; use strict;
## no critic ## no critic
use File::Basename; #use File::Basename;
use Cwd; #use Cwd;
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../'); #use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../');
use Logging qw(getlogger servicedebug); use NGCP::BulkProcessor::Logging qw(getlogger servicedebug);
use Service; use NGCP::BulkProcessor::Service;
#use test::csv_table; # qw(test_table_bycolumn1); #use test::csv_table; # qw(test_table_bycolumn1);
#use test::mysql_table; #use test::mysql_table;
@ -18,10 +18,10 @@ use Service;
#use test::sqlite_table; #use test::sqlite_table;
#use test::sqlserver_table; #use test::sqlserver_table;
use Utils; # qw(create_guid); use NGCP::BulkProcessor::Utils; # qw(create_guid);
require Exporter; require Exporter;
our @ISA = qw(Exporter Service); our @ISA = qw(Exporter NGCP::BulkProcessor::Service);
our @EXPORT_OK = qw( our @EXPORT_OK = qw(
roundtrip roundtrip
sleep_seconds sleep_seconds
@ -32,7 +32,7 @@ our @EXPORT_OK = qw(
#my $logger = getlogger(__PACKAGE__); #my $logger = getlogger(__PACKAGE__);
my $functions = { my $functions = {
create_uuid => \&Utils::create_guid, create_uuid => \&NGCP::BulkProcessor::Utils::create_guid,
roundtrip => \&roundtrip, roundtrip => \&roundtrip,
noop => \&noop, noop => \&noop,
exception => \&exception, exception => \&exception,
@ -47,13 +47,13 @@ my $functions = {
sub new { sub new {
#my $class = shift; #my $class = shift;
#my $self = Service->new($functions,$class); #my $self = NGCP::BulkProcessor::Service->new($functions,$class);
#bless($self,$class); #bless($self,$class);
#return $self; #return $self;
my $self = Service->new($functions,@_); my $self = NGCP::BulkProcessor::Service->new($functions,@_);
servicedebug($self,__PACKAGE__ . ' service created',getlogger(__PACKAGE__)); servicedebug($self,__PACKAGE__ . ' service created',getlogger(__PACKAGE__));
return $self; return $self;
@ -94,4 +94,4 @@ sub exception {
# print "_on_fail\n"; # print "_on_fail\n";
#} #}
1; 1;

@ -1,6 +1,4 @@
# service layer backend package NGCP::BulkProcessor::ServiceProxy;
package ServiceProxy;
use strict; use strict;
## no critic ## no critic
@ -11,24 +9,24 @@ use Thread::Queue;
use Time::HiRes qw(sleep); use Time::HiRes qw(sleep);
use Globals qw( use NGCP::BulkProcessor::Globals qw(
@jobservers @jobservers
$jobnamespace $jobnamespace
); );
use Logging qw( use NGCP::BulkProcessor::Logging qw(
getlogger getlogger
servicedebug servicedebug
serviceinfo serviceinfo
); );
use LogError qw( use NGCP::BulkProcessor::LogError qw(
serviceerror serviceerror
servicewarn servicewarn
notimplementederror notimplementederror
); );
use Utils qw(threadid); use NGCP::BulkProcessor::Utils qw(threadid);
use Serialization qw(serialize deserialize); use NGCP::BulkProcessor::Serialization qw(serialize deserialize);
use Encode qw(encode_utf8); use Encode qw(encode_utf8);
require Exporter; require Exporter;
@ -504,4 +502,4 @@ sub _is_create_thread {
return $self->{create_tid} == threadid(); return $self->{create_tid} == threadid();
} }
1; 1;

@ -1,18 +1,15 @@
package SqlConnector; package NGCP::BulkProcessor::SqlConnector;
use strict; use strict;
## no critic ## no critic
#use threads; use NGCP::BulkProcessor::Globals qw($enablemultithreading);
#use threads::shared;
use Globals qw($enablemultithreading); use NGCP::BulkProcessor::Logging qw(
use Logging qw(
getlogger getlogger
dbdebug dbdebug
dbinfo); dbinfo);
use LogError qw( use NGCP::BulkProcessor::LogError qw(
dberror dberror
dbwarn dbwarn
notimplementederror notimplementederror
@ -20,9 +17,9 @@ use LogError qw(
use DBI; use DBI;
use Utils qw(threadid); use NGCP::BulkProcessor::Utils qw(threadid);
use Array qw(arrayeq); use NGCP::BulkProcessor::Array qw(arrayeq);
use RandomString qw(createtmpstring); use NGCP::BulkProcessor::RandomString qw(createtmpstring);
require Exporter; require Exporter;
our @ISA = qw(Exporter); our @ISA = qw(Exporter);
@ -869,4 +866,4 @@ sub db_finish {
} }
1; 1;

@ -1,14 +1,14 @@
package SqlConnectors::PostgreSQLDB; package NGCP::BulkProcessor::SqlConnectors::PostgreSQLDB;
use strict; use strict;
## no critic ## no critic
use File::Basename; #use File::Basename;
use Cwd; #use Cwd;
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../'); #use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../');
use Globals qw($LongReadLen_limit); use NGCP::BulkProcessor::Globals qw($LongReadLen_limit);
use Logging qw( use NGCP::BulkProcessor::Logging qw(
getlogger getlogger
dbinfo dbinfo
dbdebug dbdebug
@ -18,17 +18,17 @@ use Logging qw(
primarykeycreated primarykeycreated
tabletruncated tabletruncated
tabledropped); tabledropped);
use LogError qw(dberror dbwarn fieldnamesdiffer); use NGCP::BulkProcessor::LogError qw(dberror dbwarn fieldnamesdiffer);
use DBI; use DBI;
use DBD::Pg 2.17.2; use DBD::Pg 2.17.2;
use Array qw(arrayeq itemcount contains setcontains); use NGCP::BulkProcessor::Array qw(arrayeq itemcount contains setcontains);
use SqlConnector; use NGCP::BulkProcessor::SqlConnector;
require Exporter; require Exporter;
our @ISA = qw(Exporter SqlConnector); our @ISA = qw(Exporter NGCP::BulkProcessor::SqlConnector);
our @EXPORT_OK = qw(get_tableidentifier); our @EXPORT_OK = qw(get_tableidentifier);
my $defaulthost = '127.0.0.1'; my $defaulthost = '127.0.0.1';
@ -63,7 +63,7 @@ sub new {
my $class = shift; my $class = shift;
my $self = SqlConnector->new(@_); my $self = NGCP::BulkProcessor::SqlConnector->new(@_);
$self->{host} = undef; $self->{host} = undef;
$self->{port} = undef; $self->{port} = undef;
@ -533,4 +533,4 @@ sub db_finish {
} }
1; 1;

@ -1,14 +1,14 @@
package SqlConnectors::SQLServerDB; package NGCP::BulkProcessor::SqlConnectors::SQLServerDB;
use strict; use strict;
## no critic ## no critic
use File::Basename; #use File::Basename;
use Cwd; #use Cwd;
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../'); #use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../');
use Globals qw($LongReadLen_limit); use NGCP::BulkProcessor::Globals qw($LongReadLen_limit);
use Logging qw( use NGCP::BulkProcessor::Logging qw(
getlogger getlogger
dbinfo dbinfo
dbdebug dbdebug
@ -18,7 +18,7 @@ use Logging qw(
primarykeycreated primarykeycreated
tabletruncated tabletruncated
tabledropped); tabledropped);
use LogError qw( use NGCP::BulkProcessor::LogError qw(
dberror dberror
fieldnamesdiffer); fieldnamesdiffer);
@ -28,12 +28,12 @@ use DBD::ODBC 1.50;
#https://blog.afoolishmanifesto.com/posts/install-and-configure-the-ms-odbc-driver-on-debian/ #https://blog.afoolishmanifesto.com/posts/install-and-configure-the-ms-odbc-driver-on-debian/
#http://community.spiceworks.com/how_to/show/78224-install-the-ms-sql-odbc-driver-on-debian-7 #http://community.spiceworks.com/how_to/show/78224-install-the-ms-sql-odbc-driver-on-debian-7
use Array qw(arrayeq itemcount contains setcontains removeduplicates mergearrays); use NGCP::BulkProcessor::Array qw(arrayeq itemcount contains setcontains removeduplicates mergearrays);
use SqlConnector; use NGCP::BulkProcessor::SqlConnector;
require Exporter; require Exporter;
our @ISA = qw(Exporter SqlConnector); our @ISA = qw(Exporter NGCP::BulkProcessor::SqlConnector);
our @EXPORT_OK = qw(get_tableidentifier); our @EXPORT_OK = qw(get_tableidentifier);
my $defaulthost = '127.0.0.1'; my $defaulthost = '127.0.0.1';
@ -64,7 +64,7 @@ sub new {
my $class = shift; my $class = shift;
my $self = SqlConnector->new(@_); my $self = NGCP::BulkProcessor::SqlConnector->new(@_);
$self->{host} = undef; $self->{host} = undef;
$self->{port} = undef; $self->{port} = undef;
@ -524,4 +524,4 @@ sub db_finish {
} }
1; 1;

@ -1,16 +1,16 @@
package SqlConnectors::SQLiteDB; package NGCP::BulkProcessor::SqlConnectors::SQLiteDB;
use strict; use strict;
## no critic ## no critic
use File::Basename; #use File::Basename;
use Cwd; #use Cwd;
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../'); #use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../');
use Globals qw( use NGCP::BulkProcessor::Globals qw(
$local_db_path $local_db_path
$LongReadLen_limit); $LongReadLen_limit);
use Logging qw( use NGCP::BulkProcessor::Logging qw(
getlogger getlogger
dbinfo dbinfo
dbdebug dbdebug
@ -19,7 +19,7 @@ use Logging qw(
indexcreated indexcreated
tabletruncated tabletruncated
tabledropped); tabledropped);
use LogError qw( use NGCP::BulkProcessor::LogError qw(
dberror dberror
fieldnamesdiffer fieldnamesdiffer
dbwarn dbwarn
@ -28,19 +28,19 @@ use LogError qw(
use DBI 1.608 qw(:sql_types); use DBI 1.608 qw(:sql_types);
use DBD::SQLite 1.29; use DBD::SQLite 1.29;
use Array qw(arrayeq contains setcontains); use NGCP::BulkProcessor::Array qw(arrayeq contains setcontains);
use Utils qw( use NGCP::BulkProcessor::Utils qw(
tempfilename tempfilename
timestampdigits timestampdigits
timestamp); timestamp);
use SqlConnectors::SQLiteVarianceAggregate; use NGCP::BulkProcessor::SqlConnectors::SQLiteVarianceAggregate;
use SqlConnector; use NGCP::BulkProcessor::SqlConnector;
require Exporter; require Exporter;
our @ISA = qw(Exporter SqlConnector); our @ISA = qw(Exporter NGCP::BulkProcessor::SqlConnector);
our @EXPORT_OK = qw($staticdbfilemode our @EXPORT_OK = qw($staticdbfilemode
$timestampdbfilemode $timestampdbfilemode
$temporarydbfilemode $temporarydbfilemode
@ -87,7 +87,7 @@ sub new {
my $class = shift; my $class = shift;
my $self = SqlConnector->new(@_); my $self = NGCP::BulkProcessor::SqlConnector->new(@_);
$self->{filemode} = undef; $self->{filemode} = undef;
$self->{dbfilename} = undef; $self->{dbfilename} = undef;

@ -1,67 +1,67 @@
# helper module to implement variance aggregate function with SQLite # helper module to implement variance aggregate function with SQLite
# adamk@cpan.org # adamk@cpan.org
# 2009 # 2009
# used only for testing custom functions ... # used only for testing custom functions ...
package SqlConnectors::SQLiteVarianceAggregate; package NGCP::BulkProcessor::SqlConnectors::SQLiteVarianceAggregate;
use strict; use strict;
## no critic ## no critic
use File::Basename; #use File::Basename;
use Cwd; #use Cwd;
use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../'); #use lib Cwd::abs_path(File::Basename::dirname(__FILE__) . '/../');
#sub new { bless [], shift; } #sub new { bless [], shift; }
# #
#sub step { #sub step {
# my ( $self, $value ) = @_; # my ( $self, $value ) = @_;
# #
# push @$self, $value; # push @$self, $value;
#} #}
# #
#sub finalize { #sub finalize {
# my $self = $_[0]; # my $self = $_[0];
# #
# my $n = @$self; # my $n = @$self;
# #
# # Variance is NULL unless there is more than one row # # Variance is NULL unless there is more than one row
# return undef unless $n || $n == 1; # return undef unless $n || $n == 1;
# #
# my $mu = 0; # my $mu = 0;
# foreach my $v ( @$self ) { # foreach my $v ( @$self ) {
# $mu += $v; # $mu += $v;
# } # }
# $mu /= $n; # $mu /= $n;
# #
# my $sigma = 0; # my $sigma = 0;
# foreach my $v ( @$self ) { # foreach my $v ( @$self ) {
# #$sigma += ($x - $mu)**2; # #$sigma += ($x - $mu)**2;
# $sigma += ($v - $mu)**2; # $sigma += ($v - $mu)**2;
# } # }
# $sigma = $sigma / ($n - 1); # $sigma = $sigma / ($n - 1);
# #
# return $sigma; # return $sigma;
#} #}
my $mu = 0; my $mu = 0;
my $count = 0; my $count = 0;
my $S = 0; my $S = 0;
sub new { bless [], shift; } sub new { bless [], shift; }
sub step { sub step {
my ( $self, $value ) = @_; my ( $self, $value ) = @_;
$count++; $count++;
my $delta = $value - $mu; my $delta = $value - $mu;
$mu += $delta / $count; $mu += $delta / $count;
$S += $delta * ($value - $mu); $S += $delta * ($value - $mu);
} }
sub finalize { sub finalize {
my $self = $_[0]; my $self = $_[0];
return $S / ($count - 1); return $S / ($count - 1);
} }
1; 1;

@ -1,21 +1,23 @@
# record base object package NGCP::BulkProcessor::SqlRecord;
package SqlRecord;
use strict; use strict;
## no critic ## no critic
#use Thread qw(async yield);
#use Thread::Queue;
use threads qw(yield); use threads qw(yield);
use threads::shared; use threads::shared;
use Thread::Queue; use Thread::Queue;
#use Thread::Semaphore; #use Thread::Semaphore;
#use POSIX qw(ceil);
use Time::HiRes qw(sleep); use Time::HiRes qw(sleep);
use Logging qw( use NGCP::BulkProcessor::Globals qw(
$enablemultithreading
$cpucount
$cells_transfer_memory_limit
$transfer_defer_indexes
);
use NGCP::BulkProcessor::Logging qw(
getlogger getlogger
fieldnamesaquired fieldnamesaquired
primarykeycolsaquired primarykeycolsaquired
@ -46,7 +48,7 @@ use Logging qw(
tablethreadingdebug tablethreadingdebug
); );
use LogError qw( use NGCP::BulkProcessor::LogError qw(
fieldnamesdiffer fieldnamesdiffer
transferzerorowcount transferzerorowcount
processzerorowcount processzerorowcount
@ -54,22 +56,10 @@ use LogError qw(
tabletransferfailed tabletransferfailed
tableprocessingfailed tableprocessingfailed
); );
#use LogWarn qw(calendarwarn);
use Table qw(get_rowhash);
use Array qw(setcontains contains);
use Utils qw(round threadid);
#use SQLiteDB qw(sqlitetablename);
#use ConnectorPool qw(destroy_dbs_thread);
#use LoadConfig; use NGCP::BulkProcessor::Table qw(get_rowhash);
use Globals qw( use NGCP::BulkProcessor::Array qw(setcontains contains);
$enablemultithreading use NGCP::BulkProcessor::Utils qw(round threadid);
$cpucount
$cells_transfer_memory_limit
$transfer_defer_indexes);
#use Terminate qw(setsigkill);
require Exporter; require Exporter;
our @ISA = qw(Exporter); our @ISA = qw(Exporter);
@ -387,7 +377,7 @@ sub delete_records {
(defined $keyfields and (defined $keyfields and
ref $keyfields eq 'ARRAY') and ref $keyfields eq 'ARRAY') and
(defined $vals_table and (defined $vals_table and
ref $vals_table eq 'Table')) { ref $vals_table eq 'NGCP::BulkProcessor::Table')) {
my @fields = @$keyfields; my @fields = @$keyfields;
my $field_cnt = scalar @fields; my $field_cnt = scalar @fields;
@ -993,7 +983,7 @@ sub transfer_table {
sub process_table { sub process_table {
my ($get_db,$tablename,$process_code,$init_process_context_code,$multithreading,$selectcount,$select,@values) = @_; my ($get_db,$tablename,$process_code,$init_process_context_code,$uninit_process_context_code,$multithreading,$selectcount,$select,@values) = @_;
if (ref $get_db eq 'CODE') { if (ref $get_db eq 'CODE') {
@ -1086,6 +1076,7 @@ sub process_table {
#processorerrorstate_ref => \$processorerrorstate, #processorerrorstate_ref => \$processorerrorstate,
process_code => $process_code, process_code => $process_code,
init_process_context_code => $init_process_context_code, init_process_context_code => $init_process_context_code,
uninit_process_context_code => $uninit_process_context_code,
blocksize => $blocksize, blocksize => $blocksize,
rowcount => $rowcount, rowcount => $rowcount,
#logger => $logger, #logger => $logger,
@ -1179,6 +1170,9 @@ sub process_table {
} }
$db->db_finish(); $db->db_finish();
if ('CODE' eq ref $uninit_process_context_code) {
&$uninit_process_context_code($context);
}
}; };
if ($@) { if ($@) {
@ -1481,6 +1475,9 @@ sub _process {
sleep($thread_sleep_secs); #2015-01 sleep($thread_sleep_secs); #2015-01
} }
} }
if ('CODE' eq ref $context->{uninit_process_context_code}) {
&{$context->{uninit_process_context_code}}($context);
}
}; };
#if (defined $writer_db) { #if (defined $writer_db) {
# $writer_db->db_disconnect(); # $writer_db->db_disconnect();

@ -1,6 +1,4 @@
# table module: a 2D array object = array of arrays = fetchall_arrayref result package NGCP::BulkProcessor::Table;
package Table;
use strict; use strict;
## no critic ## no critic
@ -233,4 +231,4 @@ sub tostring {
} }
1; 1;

@ -1,4 +1,4 @@
package Utils; package NGCP::BulkProcessor::Utils;
use strict; use strict;
## no critic ## no critic
@ -8,7 +8,6 @@ use threads;
#use POSIX qw(strtod); #use POSIX qw(strtod);
use POSIX qw(strtod locale_h); use POSIX qw(strtod locale_h);
setlocale(LC_NUMERIC, 'C'); setlocale(LC_NUMERIC, 'C');
#use Logging qw(fileerror);
use Data::UUID; use Data::UUID;
@ -321,7 +320,7 @@ sub tempfilename {
sub file_md5 { sub file_md5 {
my ($filepath,$fileerrorcode,$logger) = @_; my ($filepath,$fileerrorcode,$logger) = @_;
#use Logging qw(fileerror);
local *MD5FILE; local *MD5FILE;
if (not open (MD5FILE, '<' . $filepath)) { if (not open (MD5FILE, '<' . $filepath)) {
Loading…
Cancel
Save