X-Git-Url: http://git.rot13.org/?p=perl-Redis.git;a=blobdiff_plain;f=lib%2FRedis.pm;h=b3edb6ca454a331951f94dc3af1d8e36759fea6e;hp=1df21f41663604d62ce81707a51e652d23b12e93;hb=27b1d5b5fae2c6f2bd2a193f626bfbd8103d24e6;hpb=6a1de5c2d4c3301e258abc98b7cf412d9dd89f14 diff --git a/lib/Redis.pm b/lib/Redis.pm index 1df21f4..b3edb6c 100644 --- a/lib/Redis.pm +++ b/lib/Redis.pm @@ -63,8 +63,10 @@ sub _sock_read_bulk { warn "## bulk len: ",dump($len); return undef if $len eq "nil\r\n"; my $v; - read($sock, $v, $len) || die $!; - warn "## bulk v: ",dump($v); + if ( $len > 0 ) { + read($sock, $v, $len) || die $!; + warn "## bulk v: ",dump($v); + } my $crlf; read($sock, $crlf, 2); # skip cr/lf return $v; @@ -77,8 +79,9 @@ sub _sock_result_bulk { _sock_read_bulk(); } -sub _sock_ok { +sub __sock_ok { my $ok = <$sock>; + return undef if $ok eq "nil\r\n"; confess dump($ok) unless $ok eq "+OK\r\n"; } @@ -93,15 +96,28 @@ sub _sock_send_ok { my $self = shift; warn "## _sock_send_ok ",dump( @_ ); print $sock join(' ',@_) . "\r\n"; - _sock_ok(); + __sock_ok(); +} + +sub __sock_send_bulk_raw { + my $self = shift; + warn "## _sock_send_bulk ",dump( @_ ); + my $value = pop; + $value = '' unless defined $value; # FIXME errr? nil? + print $sock join(' ',@_) . ' ' . length($value) . "\r\n$value\r\n" } sub _sock_send_bulk { - my ( $self, $command, $key, $value ) = @_; - print $sock "$command $key " . length($value) . "\r\n$value\r\n"; - _sock_ok(); + __sock_send_bulk_raw( @_ ); + __sock_ok(); } +sub _sock_send_bulk_number { + __sock_send_bulk_raw( @_ ); + my $v = _sock_result(); + confess $v unless $v =~ m{^\-?\d+$}; + return $v; +} =head1 Connection Handling @@ -315,6 +331,96 @@ sub lrange { return @list; } +=head2 ltrim + + my $ok = $r->ltrim( $key, $start, $end ); + +=cut + +sub ltrim { + my ( $self, $key, $start, $end ) = @_; + $self->_sock_send_ok( 'LTRIM', $key, $start, $end ); +} + +=head2 lindex + + $r->lindex( $key, $index ); + +=cut + +sub lindex { + my ( $self, $key, $index ) = @_; + $self->_sock_result_bulk( 'LINDEX', $key, $index ); +} + +=head2 lset + + $r->lset( $key, $index, $value ); + +=cut + +sub lset { + my ( $self, $key, $index, $value ) = @_; + $self->_sock_send_bulk( 'LSET', $key, $index, $value ); +} + +=head2 lrem + + my $modified_count = $r->lrem( $key, $count, $value ); + +=cut + +sub lrem { + my ( $self, $key, $count, $value ) = @_; + $self->_sock_send_bulk_number( 'LREM', $key, $count, $value ); +} + +=head2 lpop + + my $value = $r->lpop( $key ); + +=cut + +sub lpop { + my ( $self, $key ) = @_; + $self->_sock_result_bulk( 'LPOP', $key ); +} + +=head2 rpop + + my $value = $r->rpop( $key ); + +=cut + +sub rpop { + my ( $self, $key ) = @_; + $self->_sock_result_bulk( 'RPOP', $key ); +} + +=head1 Commands operating on sets + +=head2 sadd + + $r->sadd( $key, $member ); + +=cut + +sub sadd { + my ( $self, $key, $member ) = @_; + $self->_sock_send_bulk_number( 'SADD', $key, $member ); +} + +=head2 srem + + $r->srem( $key, $member ); + +=cut + +sub srem { + my ( $self, $key, $member ) = @_; + $self->_sock_send_bulk_number( 'SREM', $key, $member ); +} + =head1 AUTHOR Dobrica Pavlinusic, C<< >>