X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;ds=sidebyside;f=SL%2FController%2FCsvImport%2FBase.pm;h=e9049899b0a468f1821fcbc3ebcfd6d7976e50db;hb=e0f5deeae4cdcf3faf3bc68a202f20ec6cd9af2e;hp=8544cf79d0a9a8dede36f5bca6cbb90dc092ba50;hpb=0ec7590940218fbeaf500753efcffd1bba53124e;p=kivitendo-erp.git diff --git a/SL/Controller/CsvImport/Base.pm b/SL/Controller/CsvImport/Base.pm index 8544cf79d..e9049899b 100644 --- a/SL/Controller/CsvImport/Base.pm +++ b/SL/Controller/CsvImport/Base.pm @@ -3,10 +3,12 @@ package SL::Controller::CsvImport::Base; use strict; use English qw(-no_match_vars); +use List::Util qw(min); use List::MoreUtils qw(pairwise any); use SL::Helper::Csv; +use SL::DB; use SL::DB::BankAccount; use SL::DB::Customer; use SL::DB::Language; @@ -34,7 +36,7 @@ sub run { my $profile = $self->profile; $self->csv(SL::Helper::Csv->new(file => $self->file->file_name, encoding => $self->controller->profile->get('charset'), - profile => [{ profile => $profile, class => $self->class }], + profile => [{ profile => $profile, class => $self->class, mapping => $self->controller->mappings_for_profile }], ignore_unknown_columns => 1, strict_profile => 1, case_insensitive_header => 1, @@ -54,9 +56,9 @@ sub run { return if ( !$self->csv->header || $self->csv->errors ); - my $headers = { headers => [ grep { $profile->{$_} } @{ $self->csv->header } ] }; - $headers->{methods} = [ map { $profile->{$_} } @{ $headers->{headers} } ]; - $headers->{used} = { map { ($_ => 1) } @{ $headers->{headers} } }; + my $headers = { headers => [ grep { $self->csv->dispatcher->is_known($_, 0) } @{ $self->csv->header } ] }; + $headers->{methods} = [ map { $_->{path} } @{ $self->csv->specs->[0] } ]; + $headers->{used} = { map { ($_ => 1) } @{ $headers->{headers} } }; $self->controller->headers($headers); $self->controller->raw_data_headers({ used => { }, headers => [ ] }); $self->controller->info_headers({ used => { }, headers => [ ] }); @@ -337,6 +339,10 @@ sub check_objects { sub check_duplicates { } +sub check_auth { + $::auth->assert('config'); +} + sub check_std_duplicates { my $self = shift; @@ -459,32 +465,34 @@ sub save_objects { $self->controller->track_progress(phase => 'saving data', progress => 0); # scale from 45..95%; - my $dbh = $data->[0]{object}->db; - - $dbh->begin_work; - foreach my $entry_index (0 .. $#$data) { - my $entry = $data->[$entry_index]; - next if @{ $entry->{errors} }; - - my $object = $entry->{object_to_save} || $entry->{object}; - - my $ret; - if (!eval { $ret = $object->save(cascade => !!$self->save_with_cascade()); 1 }) { - push @{ $entry->{errors} }, $::locale->text('Error when saving: #1', $EVAL_ERROR); - } elsif ( !$ret ) { - push @{ $entry->{errors} }, $::locale->text('Error when saving: #1', $object->db->error); - } else { - $self->_save_history($object); - $self->controller->num_imported($self->controller->num_imported + 1); - } - } continue { - if ($entry_index % 100 == 0) { - $dbh->commit; - $self->controller->track_progress(progress => $entry_index/scalar(@$data) * 100); # scale from 45..95%; - $dbh->begin_work; - } + my $dbh = $data->[0]{object}->db->dbh; + + my $last_index = $#$data; + my $chunk_size = 100; # one transaction and progress update every 100 objects + + for my $chunk (0 .. $last_index / $chunk_size) { + $self->controller->track_progress(progress => ($chunk_size * $chunk)/scalar(@$data) * 100); # scale from 45..95%; + SL::DB->client->with_transaction(sub { + foreach my $entry_index ($chunk_size * $chunk .. min( $last_index, $chunk_size * ($chunk + 1) - 1 )) { + my $entry = $data->[$entry_index]; + next if @{ $entry->{errors} }; + + my $object = $entry->{object_to_save} || $entry->{object}; + + my $ret; + if (!eval { $ret = $object->save(cascade => !!$self->save_with_cascade()); 1 }) { + push @{ $entry->{errors} }, $::locale->text('Error when saving: #1', $EVAL_ERROR); + } elsif ( !$ret ) { + push @{ $entry->{errors} }, $::locale->text('Error when saving: #1', $object->db->error); + } else { + $self->_save_history($object); + $self->controller->num_imported($self->controller->num_imported + 1); + } + } + 1; + }) or do { die SL::DB->client->error }; } - $dbh->commit; + $self->controller->track_progress(progress => 100); } sub field_lengths {