- Timestamp:
- 09/14/09 14:58:39 (4 years ago)
- Location:
- lang/perl/DBIx-CouchLike/trunk
- Files:
-
- 1 added
- 3 modified
-
Changes (modified) (1 diff)
-
META.yml (modified) (1 diff)
-
lib/DBIx/CouchLike.pm (modified) (10 diffs)
-
t/16_view_with.t (added)
Legend:
- Unmodified
- Added
- Removed
-
lang/perl/DBIx-CouchLike/trunk/Changes
r35318 r35368 1 1 Revision history for Perl extension DBIx::CouchLike 2 3 0.12 Mon Sep 14 14:57:37 2009 4 - added post_with_views(), put_with_views(). 2 5 3 6 0.10 Fri Sep 11 15:35:59 2009 -
lang/perl/DBIx-CouchLike/trunk/META.yml
r35319 r35368 1 1 --- 2 abstract: ~2 abstract: 'DBI based CouchDB like document database library' 3 3 author: 4 4 - 'FUJIWARA <fujiwara.shunichiro gmail.com>' -
lang/perl/DBIx-CouchLike/trunk/lib/DBIx/CouchLike.pm
r35319 r35368 9 9 use DBIx::CouchLike::Iterator; 10 10 11 our $VERSION = '0.1 0';11 our $VERSION = '0.12'; 12 12 our $RD; 13 13 __PACKAGE__->mk_accessors(qw/ dbh table utf8 _json /); … … 138 138 139 139 sub post_multi { 140 my $self = shift; 141 $self->_post_multi([], @_); 142 } 143 144 sub _post_multi { 140 145 my $self = shift; 146 my $views = shift; 141 147 my @value_ref = @_; 142 148 my $sth = $self->prepare_sql(q{INSERT INTO _DATA_ (id, value) VALUES(?, ?)}); … … 149 155 push @id, $id; 150 156 } 151 $self->update_views( @value_ref );157 $self->update_views( $views, @value_ref ); 152 158 return wantarray ? @id : $id[0]; 153 159 } … … 164 170 sub put_multi { 165 171 my $self = shift; 172 $self->_put_multi([], @_); 173 } 174 175 sub put_with_views { 176 my $self = shift; 177 my @views = map { "_design/$_" } @_; 178 sub { 179 $self->_put_multi(\@views, @_); 180 }; 181 } 182 183 sub _put_multi { 184 my $self = shift; 185 my $views = shift; 166 186 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=?}); 168 188 169 189 my @post; … … 186 206 my @new_id; 187 207 @new_id = $self->post_multi(@post) if @post; 188 $self->update_views( @put);208 $self->update_views( $views, @put ); 189 209 return wantarray ? (@id, @new_id) : $id[0] || $new_id[0]; 190 210 } … … 351 371 } 352 372 373 sub post_with_views { 374 my $self = shift; 375 my @views = map { "_design/$_" } @_; 376 sub { 377 $self->_post_multi(\@views, @_); 378 }; 379 } 380 353 381 sub _start_with { 354 382 my $self = shift; … … 439 467 440 468 sub 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; 443 473 444 474 my @data_val; … … 456 486 457 487 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 } 462 507 463 508 my $index_sth = $self->prepare_sql( … … 465 510 ); 466 511 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 } 472 526 473 527 DESIGN: … … 613 667 $result_2 = $itr->next; 614 668 669 # post / put with specified views 670 $couch->put_with_views("find")->($obj); 671 $couch->post_with_views("foo", "bar")->($obj1, $obj2); 672 615 673 =head1 DESCRIPTION 616 674
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)