X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=lib%2FMojoFacets%2FData.pm;h=a2d150bf06189e214dc4af2f22bc393e9f05c98e;hb=358b8708f3e09459becdad4524910ab273a47281;hp=ceb0d8ed87beaa69f70a7003abbaed671279ea00;hpb=b638f9e7fa8f61046a23b238eb6ac1816e93a725;p=MojoFacets.git diff --git a/lib/MojoFacets/Data.pm b/lib/MojoFacets/Data.pm index ceb0d8e..a2d150b 100644 --- a/lib/MojoFacets/Data.pm +++ b/lib/MojoFacets/Data.pm @@ -13,15 +13,43 @@ use File::Find; use Storable; use Time::HiRes qw(time); use File::Path qw(mkpath); -use Text::Unaccent::PurePerl; +use Text::Unaccent; use Digest::MD5; use Statistics::Descriptive; -use MojoFacets::Import::File; -use MojoFacets::Import::HTMLTable; -use MojoFacets::Import::CSV; -use MojoFacets::Import::CouchDB; -use MojoFacets::Import::SQL; +our $imports; +foreach my $module ( glob('lib/MojoFacets/Import/*.pm') ) { + $module =~ s{lib/(\w+)/(\w+)/(.*)\.pm}{$1::$2::$3}; + eval "use $module"; + die "$module: $!" if $!; + my ( $ext, $priority ) = $module->ext; + $imports->{$priority || 'file'}->{$ext} = $module; + warn "# import $ext $module\n"; +} + +warn "# import loaded ",dump( $imports ); + +sub import_module { + my $full_path = shift; + +# warn "# import_module $full_path\n"; + + return if $full_path =~ m/\.columns$/; + + foreach my $ext ( keys %{ $imports->{file} } ) { + if ( -f $full_path && $full_path =~ m/$ext/i ) { + return $imports->{file}->{$ext}; + last; + } + } + + foreach my $ext ( keys %{ $imports->{directory} } ) { + if ( -f $full_path && $full_path =~ m/$ext/i ) { + return $imports->{directory}->{$ext}; + last; + } + } +} our $loaded; our $filters; @@ -34,17 +62,12 @@ sub index { my @files; my $changes; + find( sub { my $file = $File::Find::name; - if ( -f $file && $file =~ m/\.(js(on)?|txt)$/ ) { - $file =~ s/$data_dir\/*//; - push @files, $file; - } elsif ( -f $file && $file =~ m/([^\/]+)\.changes\/(\d+\.\d+.+)/ ) { + if ( -f $file && $file =~ m/([^\/]+)\.changes\/(\d+\.\d+.+)/ ) { push @{ $changes->{$1} }, $2 - } elsif ( -d $file && $file =~ m/\.html$/ ) { - $file =~ s/$data_dir\/*//; - push @files, $file; - } elsif ( -f $file && $file =~ m/\.(csv|storable|couchdb|sql)$/i ) { + } elsif ( import_module( $file ) ) { $file =~ s/$data_dir\/*//; push @files, $file; } else { @@ -196,37 +219,8 @@ sub _load_path { } my $data; - if ( -f $full_path ) { - if ( $full_path =~ m/.storable$/ ) { # check storable first to catch files copied from /tmp/ - $data->{generated}++; - warn "open $full_path ", -s $full_path, " bytes"; - open(my $pipe, "<", $full_path) || die $!; - while ( my $o = eval { Storable::fd_retrieve $pipe } ) { - if ( exists $o->{item} ) { - # stream of storable objects - push @{ $data->{items} }, $o->{item}; - } elsif ( exists $o->{data}->{items} ) { - # /tmp/mojofacets.*.storable - $data->{items} = $o->{data}->{items}; - $data->{header} = $o->{header}; - delete $data->{generated}; - } else { - warn "SKIP ",dump($o); - } - } - close($pipe); - warn "loaded ", $#{ $data->{items} } + 1, " items from $full_path\n"; - } elsif ( $full_path =~ m/.csv/i ) { - $data = MojoFacets::Import::CSV->new( full_path => $full_path )->data; - } elsif ( $full_path =~ m/.sql/i ) { - $data = MojoFacets::Import::SQL->new( full_path => $full_path )->data; - } elsif ( $full_path =~ m/.couchdb/i ) { - $data = MojoFacets::Import::CouchDB->new( full_path => $full_path )->data; - } else { - $data = MojoFacets::Import::File->new( full_path => $full_path, path => $path )->data; - } - } elsif ( -d $full_path && $full_path =~ m/.html/ ) { - $data = MojoFacets::Import::HTMLTable->new( dir => $full_path )->data; + if ( my $module = import_module( $full_path ) ) { + $data = $module->new( full_path => $full_path )->data; } else { die "can't load $full_path"; } @@ -267,8 +261,6 @@ sub _load_path { sub load { my $self = shift; - my $path = $self->param('path') || return $self->redirect_to( '/data/index' ); - my @paths = $self->param('paths'); warn "# paths ", dump @paths; @@ -280,6 +272,8 @@ sub load { $self->_load_path( $_ ) foreach @paths; + my $path = $self->param('path') || $self->session('path') || $paths[0] || $self->redirect_to('/data/index'); + warn "# path $path\n"; $self->_load_path( $path ); @@ -364,7 +358,7 @@ sub _permanent_path { sub __unac { my $n = shift; - $n = unac_string($n); + $n = unac_string('utf-8',$n); $n =~ s/\W+/_/g; return $n; } @@ -491,8 +485,11 @@ sub _param_scalar { if ( ! defined $scalar ) { $scalar = $default; - die "no default for $name" unless defined $scalar; - $self->session($name => $scalar); + if ( defined $scalar ) { + $self->session($name => $scalar); + } else { + warn "no default for $name"; + } } warn "# _param_scalar $name ",dump $scalar; @@ -813,6 +810,9 @@ sub items { $code =~ s{\r}{}gs; $code =~ s{\n+$}{\n}s; + # XXX convert @row->{foo} into @{$row->{foo}} + $code =~ s|\@(row->{[^}]+})|\@{\$$1}|gs; + my $commit = $self->param('commit'); my $test = $self->param('test'); @@ -834,6 +834,8 @@ sub items { my $code_path = $self->app->home->rel_dir('public') . "/code"; if ( $commit ) { + __path_modified( $path, 'commit' ); + warn "# commit on ", $#$filtered + 1, " items:\n$code\n"; ( $key, $value, $out ) = ( 'key', 'value' ); foreach ( 0 .. $#$filtered ) { @@ -1329,6 +1331,14 @@ sub __loaded_paths { keys %$loaded; } +sub reload { + my $self = shift; + $self->stash( reload => 1 ); + $self->remove; +# $self->_load_path( $self->param('path') ); + $self->redirect_to('/data/load?path=' . $self->param('path') ); +} + sub remove { my $self = shift; my $path = $self->param('path'); @@ -1342,6 +1352,7 @@ sub remove { } else { warn "WARNING: $path unlink ignored"; } + return if $self->stash('reload'); return $self->redirect_to( '/data/load' ); }