Changeset 35368 for lang/perl

Show
Ignore:
Timestamp:
09/14/09 14:58:39 (4 years ago)
Author:
fujiwara
Message:

added (post|put)_view_views()

Location:
lang/perl/DBIx-CouchLike/trunk
Files:
1 added
3 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/DBIx-CouchLike/trunk/Changes

    r35318 r35368  
    11Revision history for Perl extension DBIx::CouchLike 
     2 
     30.12    Mon Sep 14 14:57:37 2009 
     4        - added post_with_views(), put_with_views(). 
    25 
    360.10    Fri Sep 11 15:35:59 2009 
  • lang/perl/DBIx-CouchLike/trunk/META.yml

    r35319 r35368  
    11--- 
    2 abstract: ~ 
     2abstract: 'DBI based CouchDB like document database library' 
    33author: 
    44  - 'FUJIWARA <fujiwara.shunichiro gmail.com>' 
  • lang/perl/DBIx-CouchLike/trunk/lib/DBIx/CouchLike.pm

    r35319 r35368  
    99use DBIx::CouchLike::Iterator; 
    1010 
    11 our $VERSION = '0.10'; 
     11our $VERSION = '0.12'; 
    1212our $RD; 
    1313__PACKAGE__->mk_accessors(qw/ dbh table utf8 _json /); 
     
    138138 
    139139sub post_multi { 
     140    my $self = shift; 
     141    $self->_post_multi([], @_); 
     142} 
     143 
     144sub _post_multi { 
    140145    my $self      = shift; 
     146    my $views     = shift; 
    141147    my @value_ref = @_; 
    142148    my $sth = $self->prepare_sql(q{INSERT INTO _DATA_ (id, value) VALUES(?, ?)}); 
     
    149155        push @id, $id; 
    150156    } 
    151     $self->update_views( @value_ref ); 
     157    $self->update_views( $views, @value_ref ); 
    152158    return wantarray ? @id : $id[0]; 
    153159} 
     
    164170sub put_multi { 
    165171    my $self = shift; 
     172    $self->_put_multi([], @_); 
     173} 
     174 
     175sub put_with_views { 
     176    my $self  = shift; 
     177    my @views = map { "_design/$_" } @_; 
     178    sub { 
     179        $self->_put_multi(\@views, @_); 
     180    }; 
     181} 
     182 
     183sub _put_multi { 
     184    my $self      = shift; 
     185    my $views     = shift; 
    166186    my @value_ref = @_; 
    167     my $sth  = $self->prepare_sql(q{UPDATE _DATA_ SET value=? WHERE id=?}); 
     187    my $sth       = $self->prepare_sql(q{UPDATE _DATA_ SET value=? WHERE id=?}); 
    168188 
    169189    my @post; 
     
    186206    my @new_id; 
    187207    @new_id = $self->post_multi(@post) if @post; 
    188     $self->update_views(@put); 
     208    $self->update_views( $views, @put ); 
    189209    return wantarray ? (@id, @new_id) : $id[0] || $new_id[0]; 
    190210} 
     
    351371} 
    352372 
     373sub post_with_views { 
     374    my $self  = shift; 
     375    my @views = map { "_design/$_" } @_; 
     376    sub { 
     377        $self->_post_multi(\@views, @_); 
     378    }; 
     379} 
     380 
    353381sub _start_with { 
    354382    my $self  = shift; 
     
    439467 
    440468sub update_views { 
    441     my $self     = shift; 
    442     my $dbh      = $self->dbh; 
     469    my $self  = shift; 
     470    my $dbh   = $self->dbh; 
     471    my $views = shift || []; 
     472    my @views = @$views; 
    443473 
    444474    my @data_val; 
     
    456486 
    457487    my $pf = join(",", map {"?"} @id); 
    458     my $del_sth = $self->prepare_sql( 
    459         qq{DELETE FROM _MAP_ WHERE id IN ($pf)} 
    460     ); 
    461     $del_sth->execute(@id); 
     488    my $df = @views ? join(",", map {"?"} @views) : ""; 
     489 
     490    if (@views) { 
     491        my $del_sql = qq{DELETE FROM _MAP_ WHERE id IN ($pf)}; 
     492        my @value; 
     493        my @cond; 
     494        for my $v (@views) { 
     495            my ($part, @v) = $self->_start_with( design_id => $v ); 
     496            push @cond,  $part; 
     497            push @value, @v; 
     498        } 
     499        $del_sql .= " AND (" . join(" OR ", @cond). ")"; 
     500        $self->prepare_sql($del_sql) 
     501            ->execute(@id, @value); 
     502    } 
     503    else { 
     504        $self->prepare_sql(qq{DELETE FROM _MAP_ WHERE id IN ($pf)}) 
     505            ->execute(@id); 
     506    } 
    462507 
    463508    my $index_sth = $self->prepare_sql( 
     
    465510    ); 
    466511 
    467     my ($part, @value) = $self->_start_with( id => '_design/' ); 
    468     my $sth = $self->prepare_sql( 
    469         q{SELECT id, value FROM _DATA_ WHERE } . $part 
    470     ); 
    471     $sth->execute(@value); 
     512    my $sth; 
     513    if (@views) { 
     514        $sth = $self->prepare_sql( 
     515            qq{SELECT id, value FROM _DATA_ WHERE id IN($df)} 
     516        ); 
     517        $sth->execute(@views); 
     518    } 
     519    else { 
     520        my ($part, @value) = $self->_start_with( id => '_design/' ); 
     521        $sth = $self->prepare_sql( 
     522            q{SELECT id, value FROM _DATA_ WHERE } . $part 
     523        ); 
     524        $sth->execute(@value); 
     525    } 
    472526 
    473527 DESIGN: 
     
    613667  $result_2 = $itr->next; 
    614668 
     669  # post / put with specified views 
     670  $couch->put_with_views("find")->($obj); 
     671  $couch->post_with_views("foo", "bar")->($obj1, $obj2); 
     672 
    615673=head1 DESCRIPTION 
    616674