From: Dobrica Pavlinusic Date: Tue, 14 Dec 2010 21:24:25 +0000 (+0100) Subject: CouchDB _all_docs importer X-Git-Url: http://git.rot13.org/?p=MojoFacets.git;a=commitdiff_plain;h=d0dfb5d4d1d21f2cb55aafa96cb02d8dff40badc CouchDB _all_docs importer --- diff --git a/lib/MojoFacets/Data.pm b/lib/MojoFacets/Data.pm index 478ebaa..d5b4cf5 100644 --- a/lib/MojoFacets/Data.pm +++ b/lib/MojoFacets/Data.pm @@ -19,6 +19,7 @@ use Digest::MD5; use MojoFacets::Import::File; use MojoFacets::Import::HTMLTable; use MojoFacets::Import::CSV; +use MojoFacets::Import::CouchDB; our $loaded; our $filters; @@ -41,10 +42,7 @@ sub index { } elsif ( -d $file && $file =~ m/\.html$/ ) { $file =~ s/$data_dir\/*//; push @files, $file; - } elsif ( -f $file && $file =~ m/\.csv$/i ) { - $file =~ s/$data_dir\/*//; - push @files, $file; - } elsif ( -f $file && $file =~ m/\.storable/i ) { + } elsif ( -f $file && $file =~ m/\.(csv|storabe|couchdb)$/i ) { $file =~ s/$data_dir\/*//; push @files, $file; } else { @@ -190,6 +188,8 @@ sub _load_path { if ( -f $full_path ) { if ( $full_path =~ m/.csv/i ) { $data = MojoFacets::Import::CSV->new( full_path => $full_path )->data; + } elsif ( $full_path =~ m/.couchdb/i ) { + $data = MojoFacets::Import::CouchDB->new( full_path => $full_path )->data; } elsif ( $full_path =~ m/.storable/ ) { warn "open $full_path ", -s $full_path, " bytes"; open(my $pipe, "<", $full_path) || die $!; diff --git a/lib/MojoFacets/Import/CouchDB.pm b/lib/MojoFacets/Import/CouchDB.pm new file mode 100644 index 0000000..670152a --- /dev/null +++ b/lib/MojoFacets/Import/CouchDB.pm @@ -0,0 +1,42 @@ +package MojoFacets::Import::CouchDB; + +use warnings; +use strict; + +use base 'Mojo::Base'; + +use File::Slurp; +use Data::Dump qw(dump); +use JSON; +use Mojo::Client; + +__PACKAGE__->attr('path'); +__PACKAGE__->attr('full_path'); + +sub data { + my $self = shift; + + my $path = $self->path; + + # we could use Mojo::JSON here, but it's too slow +# $data = from_json read_file $path; + my $url = read_file $self->full_path; + $url =~ s{/\s*$}{}s; + + warn "# CouchDB URL: $url"; + + my $json = Mojo::Client->new->get( "$url/_all_docs?include_docs=true" )->res->json; + + my $data; + + if ( ref $json->{rows} eq 'ARRAY' ) { + foreach my $doc ( @{$json->{rows}} ) { + push @{ $data->{items} }, $doc->{doc}; + } + } + + return $data; + +} + +1