Merge branch 'master' into eval-code
authorDobrica Pavlinusic <dpavlin@rot13.org>
Thu, 17 Jun 2010 14:27:51 +0000 (16:27 +0200)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Thu, 17 Jun 2010 14:27:51 +0000 (16:27 +0200)
1  2 
lib/MojoFacets/Data.pm

diff --combined lib/MojoFacets/Data.pm
@@@ -253,7 -253,7 +253,7 @@@ sub _loaded 
        my $path = $self->session('path') || $self->param('path');
        $self->redirect_to('/data/index') unless $path;
  
-       if ( $loaded->{$path}->{modified} > 1 ) {
+       if ( defined $loaded->{$path}->{modified} && $loaded->{$path}->{modified} > 1 ) {
                my $caller = (caller(1))[3];
                if ( $caller =~ m/::edit/ ) {
                        warn "rebuild stats for $path ignored caller $caller\n";
        if ( ! defined $loaded->{$path}->{$name} ) {
                warn "$path $name isn't loaded\n";
                $self->_load_path( $path );
-               $self->redirect_to('/data/index')
-                       unless defined $loaded->{$path}->{$name};
                if ( ! defined $loaded->{$path}->{stats} ) {
                        warn "rebuild stats for $path\n";
                        $loaded->{$path}->{stats} = __stats( $loaded->{$path}->{data}->{items} );
                }
+               if ( ! defined $loaded->{$path}->{$name} ) {
+                       warn "MISSING $name for $path\n";
+                       $self->redirect_to('/data/index')
+               }
        }
  
        $self->session( 'modified' => $loaded->{$path}->{modified} );
@@@ -370,7 -372,7 +372,7 @@@ sub _param_scalar 
                $self->session($name => $scalar);
        }
  
 -      warn "# _perm_scalar $name ",dump $scalar;
 +      warn "# _param_scalar $name ",dump $scalar;
        return $scalar;
  }
  
@@@ -537,7 -539,6 +539,6 @@@ sub items 
        }
  
        my $path = $self->session('path');
-       $self->redirect_to('/data/index') unless defined $loaded->{ $path };
  
        my @columns = $self->_param_array('columns');
        $self->redirect_to('/data/columns') unless @columns;
  
        warn "all_filters $all_filters produced ", $#$filtered + 1, " items\n" if $filtered;
  
 -      my $sorted_items;
        my $data = $self->_loaded('data');
 +
 +      my $code = $self->_param_scalar('code','');
 +      $code =~ s{\n+$}{}s;
 +
 +      my $commit = $self->param('commit');
 +      my $test = $self->param('test');
 +
 +      if ( $code && ( $test || $commit ) ) {
 +              # XXX find columns used in code snippet and show them to user
 +              foreach my $column ( $code =~ m/\$rec->{(.+?)}/g ) {
 +                      if ( $column =~ s/^(['"])// ) {
 +                              $column =~ s/$1$//;
 +                      }
 +                      next if grep { /$column/ } @columns;
 +                      unshift @columns, $column;
 +                      if ( $commit ) {
 +                              $self->session('columns', [ @columns ]);
 +                              $loaded->{$path}->{columns} = [ @columns ];
 +                      }
 +              }
 +      }
 +
 +      if ( $commit ) {
 +              warn "# commit on ", $#$filtered + 1, " items:\n$code\n";
 +              foreach ( 0 .. $#$filtered ) {
 +                      my $i = $filtered->[$_];
 +                      my $rec = $data->{items}->[$i];
 +                      eval $code;
 +              }
 +      }
 +
 +      my $sorted_items;
        my $from_end = $sort eq 'd' ? $#$filtered : 0;
        foreach ( 0 .. $limit ) {
                my $i = $_ + $offset;
                last unless defined $filtered->[$i];
                $i = $from_end - $i if $from_end;
                my $id = $filtered->[$i];
 -              push @$sorted_items,
 -              my $item = $data->{items}->[ $id ];
 -              $item->{_row_id} ||= $id;
 +              my $rec = $data->{items}->[ $id ];
 +              $rec->{_row_id} ||= $id;
 +              if ( $code && $test ) {
 +                      $rec = Storable::dclone $rec;
 +                      eval $code;
 +                      if ( $@ ) {
 +                              warn "ERROR evaling\n$code\n$@";
 +                              $self->stash('eval_error', $@) if $@;
 +                      } else {
 +                              warn "EVAL ",dump($rec);
 +                      }
 +              }
 +              push @$sorted_items, $rec;
        }
  
        warn "# sorted_items ", $#$sorted_items + 1, " offset $offset limit $limit order $sort";
                rows => $#$filtered + 1,
                numeric => { map { $_, $self->_is_numeric($_) } @columns },
                filters => $self->_current_filters,
 +              code => $code,
        );
  
  }