+ foreach ( keys %$update ) {
+ $commit_changed->{$_}++;
+ $row->{$_} = $update->{$_};
+ }
+ }
+ if ( my $description = $self->param('code_description') ) {
+ my $depends = $self->param('code_depends') || die "no code_depends?";
+ my $path = "$code_path/$depends.$description.pl";
+ if ( -e $path && ! $self->param('overwrite') ) {
+ warn "# code $path not saved\n";
+ } else {
+ write_file( $path, { binmode => ':utf8' }, $code );
+ warn "code $path ", -s $path, " bytes saved\n";
+ }
+ }
+ $code = '';
+ if ( $out ) {
+ my $commit_dataset = join('.'
+ , $self->param('code_depends')
+ , $self->param('code_description')
+ , time()
+ );
+ my $key = $self->param('code_depends');
+ $key =~ s/,.+$//;
+ $key ||= 'key';
+ my $items;
+ foreach my $n ( keys %$out ) {
+ my $i = { $key => [ $n ] };
+ my $ref = ref $out->{$n};
+ if ( $ref eq 'HASH' ) {
+ $i->{$_} = [ $out->{$n}->{$_} ] foreach keys %{ $out->{$n} };
+ } elsif ( $ref eq 'ARRAY' ) {
+ $i->{$_} = $out->{$n};
+ } elsif ( ! $ref ) {
+ $i->{value} = [ $out->{$n} ];
+ } else {
+ $i->{_error} = [ dump($out->{$n}) ];
+ }
+ push @$items, $i;
+ };
+ undef $out;
+ my $stats = __stats( $items );
+ my @columns = grep { ! m/^\Q$key\E$/ } sort keys %$stats;
+ unshift @columns, $key;
+
+ $loaded->{$commit_dataset} = {
+ header => [ @columns ],
+ columns => [ @columns ],
+ mtime => time(),
+ data => { items => $items },
+ stats => $stats,
+ generated => 1,
+ };
+ warn "# loaded out ", dump( $loaded->{$commit_dataset} );
+ $self->session('path', $commit_dataset);
+ $self->session('columns', [ @columns ]);
+ $self->session('order', $key);
+ $self->redirect_to('/data/items');
+ return; # FIXME needed to correctly show columns