use strict;
+use English qw(-no_match_vars);
use List::MoreUtils qw(pairwise any);
use SL::Helper::Csv;
sub run {
my ($self, %params) = @_;
- $self->test_run($params{test_run});
+ $self->test_run($params{test});
$self->controller->track_progress(phase => 'parsing csv', progress => 0);
bool => 'bool_value' );
my @cvars;
+ my %changed_cvars;
foreach my $config (@{ $self->all_cvar_configs }) {
next unless exists $entry->{raw_data}->{ "cvar_" . $config->name };
my $value = $entry->{raw_data}->{ "cvar_" . $config->name };
my $column = $type_to_column{ $config->type } || die "Program logic error: unknown custom variable storage type";
- push @cvars, SL::DB::CustomVariable->new(config_id => $config->id, $column => $value, sub_module => '');
+ my $new_cvar = SL::DB::CustomVariable->new(config_id => $config->id, $column => $value, sub_module => '');
+
+ push @cvars, $new_cvar;
+ $changed_cvars{$config->name} = $new_cvar;
}
- $entry->{object}->custom_variables(\@cvars);
+ # merge existing with new cvars. swap every existing with the imported one, push the rest
+ if (@cvars) {
+ my @orig_cvars = ($entry->{object_to_save} || $entry->{object})->custom_variables;
+ for (@orig_cvars) {
+ $_ = $changed_cvars{ $_->config->name } if $changed_cvars{ $_->config->name };
+ delete $changed_cvars{ $_->config->name };
+ }
+ push @orig_cvars, values %changed_cvars;
+
+ $entry->{object}->custom_variables(\@orig_cvars);
+ }
}
sub init_profile {
my $ret;
if (!eval { $ret = $object->save(cascade => !!$self->save_with_cascade()); 1 }) {
- push @{ $entry->{errors} }, $::locale->text('Error when saving: #1', $@);
+ push @{ $entry->{errors} }, $::locale->text('Error when saving: #1', $EVAL_ERROR);
} elsif ( !$ret ) {
- push @{ $entry->{errors} }, $::locale->text('Error when saving: #1', $entry->{object}->db->error);
+ 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);
}
sub field_lengths {
- return ();
+ my ($self) = @_;
+
+ return map { $_->name => $_->length } grep { $_->type eq 'varchar' } @{$self->class->meta->columns};
}
sub fix_field_lengths {