63 |
warn "## bulk len: ",dump($len); |
warn "## bulk len: ",dump($len); |
64 |
return undef if $len eq "nil\r\n"; |
return undef if $len eq "nil\r\n"; |
65 |
my $v; |
my $v; |
66 |
read($sock, $v, $len) || die $!; |
if ( $len > 0 ) { |
67 |
warn "## bulk v: ",dump($v); |
read($sock, $v, $len) || die $!; |
68 |
|
warn "## bulk v: ",dump($v); |
69 |
|
} |
70 |
my $crlf; |
my $crlf; |
71 |
read($sock, $crlf, 2); # skip cr/lf |
read($sock, $crlf, 2); # skip cr/lf |
72 |
return $v; |
return $v; |
79 |
_sock_read_bulk(); |
_sock_read_bulk(); |
80 |
} |
} |
81 |
|
|
82 |
sub _sock_ok { |
sub __sock_ok { |
83 |
my $ok = <$sock>; |
my $ok = <$sock>; |
84 |
|
return undef if $ok eq "nil\r\n"; |
85 |
confess dump($ok) unless $ok eq "+OK\r\n"; |
confess dump($ok) unless $ok eq "+OK\r\n"; |
86 |
} |
} |
87 |
|
|
96 |
my $self = shift; |
my $self = shift; |
97 |
warn "## _sock_send_ok ",dump( @_ ); |
warn "## _sock_send_ok ",dump( @_ ); |
98 |
print $sock join(' ',@_) . "\r\n"; |
print $sock join(' ',@_) . "\r\n"; |
99 |
_sock_ok(); |
__sock_ok(); |
100 |
|
} |
101 |
|
|
102 |
|
sub __sock_send_bulk_raw { |
103 |
|
my $self = shift; |
104 |
|
warn "## _sock_send_bulk ",dump( @_ ); |
105 |
|
my $value = pop; |
106 |
|
$value = '' unless defined $value; # FIXME errr? nil? |
107 |
|
print $sock join(' ',@_) . ' ' . length($value) . "\r\n$value\r\n" |
108 |
} |
} |
109 |
|
|
110 |
sub _sock_send_bulk { |
sub _sock_send_bulk { |
111 |
my ( $self, $command, $key, $value ) = @_; |
__sock_send_bulk_raw( @_ ); |
112 |
print $sock "$command $key " . length($value) . "\r\n$value\r\n"; |
__sock_ok(); |
|
_sock_ok(); |
|
113 |
} |
} |
114 |
|
|
115 |
|
sub _sock_send_bulk_number { |
116 |
|
__sock_send_bulk_raw( @_ ); |
117 |
|
my $v = _sock_result(); |
118 |
|
confess $v unless $v =~ m{^\-?\d+$}; |
119 |
|
return $v; |
120 |
|
} |
121 |
|
|
122 |
=head1 Connection Handling |
=head1 Connection Handling |
123 |
|
|
331 |
return @list; |
return @list; |
332 |
} |
} |
333 |
|
|
334 |
|
=head2 ltrim |
335 |
|
|
336 |
|
my $ok = $r->ltrim( $key, $start, $end ); |
337 |
|
|
338 |
|
=cut |
339 |
|
|
340 |
|
sub ltrim { |
341 |
|
my ( $self, $key, $start, $end ) = @_; |
342 |
|
$self->_sock_send_ok( 'LTRIM', $key, $start, $end ); |
343 |
|
} |
344 |
|
|
345 |
|
=head2 lindex |
346 |
|
|
347 |
|
$r->lindex( $key, $index ); |
348 |
|
|
349 |
|
=cut |
350 |
|
|
351 |
|
sub lindex { |
352 |
|
my ( $self, $key, $index ) = @_; |
353 |
|
$self->_sock_result_bulk( 'LINDEX', $key, $index ); |
354 |
|
} |
355 |
|
|
356 |
|
=head2 lset |
357 |
|
|
358 |
|
$r->lset( $key, $index, $value ); |
359 |
|
|
360 |
|
=cut |
361 |
|
|
362 |
|
sub lset { |
363 |
|
my ( $self, $key, $index, $value ) = @_; |
364 |
|
$self->_sock_send_bulk( 'LSET', $key, $index, $value ); |
365 |
|
} |
366 |
|
|
367 |
|
=head2 lrem |
368 |
|
|
369 |
|
my $modified_count = $r->lrem( $key, $count, $value ); |
370 |
|
|
371 |
|
=cut |
372 |
|
|
373 |
|
sub lrem { |
374 |
|
my ( $self, $key, $count, $value ) = @_; |
375 |
|
$self->_sock_send_bulk_number( 'LREM', $key, $count, $value ); |
376 |
|
} |
377 |
|
|
378 |
|
=head2 lpop |
379 |
|
|
380 |
|
my $value = $r->lpop( $key ); |
381 |
|
|
382 |
|
=cut |
383 |
|
|
384 |
|
sub lpop { |
385 |
|
my ( $self, $key ) = @_; |
386 |
|
$self->_sock_result_bulk( 'LPOP', $key ); |
387 |
|
} |
388 |
|
|
389 |
|
=head2 rpop |
390 |
|
|
391 |
|
my $value = $r->rpop( $key ); |
392 |
|
|
393 |
|
=cut |
394 |
|
|
395 |
|
sub rpop { |
396 |
|
my ( $self, $key ) = @_; |
397 |
|
$self->_sock_result_bulk( 'RPOP', $key ); |
398 |
|
} |
399 |
|
|
400 |
|
=head1 Commands operating on sets |
401 |
|
|
402 |
|
=head2 sadd |
403 |
|
|
404 |
|
$r->sadd( $key, $member ); |
405 |
|
|
406 |
|
=cut |
407 |
|
|
408 |
|
sub sadd { |
409 |
|
my ( $self, $key, $member ) = @_; |
410 |
|
$self->_sock_send_bulk_number( 'SADD', $key, $member ); |
411 |
|
} |
412 |
|
|
413 |
|
=head2 srem |
414 |
|
|
415 |
|
$r->srem( $key, $member ); |
416 |
|
|
417 |
|
=cut |
418 |
|
|
419 |
|
sub srem { |
420 |
|
my ( $self, $key, $member ) = @_; |
421 |
|
$self->_sock_send_bulk_number( 'SREM', $key, $member ); |
422 |
|
} |
423 |
|
|
424 |
|
=head2 scard |
425 |
|
|
426 |
|
my $elements = $r->scard( $key ); |
427 |
|
|
428 |
|
=cut |
429 |
|
|
430 |
|
sub scard { |
431 |
|
my ( $self, $key ) = @_; |
432 |
|
$self->_sock_send( 'SCARD', $key ); |
433 |
|
} |
434 |
|
|
435 |
|
=head2 sismember |
436 |
|
|
437 |
|
$r->sismember( $key, $member ); |
438 |
|
|
439 |
|
=cut |
440 |
|
|
441 |
|
sub sismember { |
442 |
|
my ( $self, $key, $member ) = @_; |
443 |
|
$self->_sock_send_bulk_number( 'SISMEMBER', $key, $member ); |
444 |
|
} |
445 |
|
|
446 |
=head1 AUTHOR |
=head1 AUTHOR |
447 |
|
|
448 |
Dobrica Pavlinusic, C<< <dpavlin at rot13.org> >> |
Dobrica Pavlinusic, C<< <dpavlin at rot13.org> >> |