r67981 - in /trunk/libredis-perl: MANIFEST META.yml Makefile.PL debian/changelog debian/compat debian/control lib/Redis.pm lib/Redis/ scripts/ t/00-load.t t/pod-coverage.t

eloy at users.alioth.debian.org eloy at users.alioth.debian.org
Fri Jan 28 10:28:38 UTC 2011


Author: eloy
Date: Fri Jan 28 10:28:31 2011
New Revision: 67981

URL: http://svn.debian.org/wsvn/pkg-perl/?sc=1&rev=67981
Log:
new upstram version

Added:
    trunk/libredis-perl/lib/Redis/
      - copied from r67980, branches/upstream/libredis-perl/current/lib/Redis/
    trunk/libredis-perl/scripts/
      - copied from r67980, branches/upstream/libredis-perl/current/scripts/
Modified:
    trunk/libredis-perl/MANIFEST
    trunk/libredis-perl/META.yml
    trunk/libredis-perl/Makefile.PL
    trunk/libredis-perl/debian/changelog
    trunk/libredis-perl/debian/compat
    trunk/libredis-perl/debian/control
    trunk/libredis-perl/lib/Redis.pm
    trunk/libredis-perl/t/00-load.t
    trunk/libredis-perl/t/pod-coverage.t

Modified: trunk/libredis-perl/MANIFEST
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libredis-perl/MANIFEST?rev=67981&op=diff
==============================================================================
--- trunk/libredis-perl/MANIFEST (original)
+++ trunk/libredis-perl/MANIFEST Fri Jan 28 10:28:31 2011
@@ -3,6 +3,9 @@
 Makefile.PL
 README
 lib/Redis.pm
+lib/Redis/List.pm
+lib/Redis/Hash.pm
+scripts/redis-benchmark.pl
 t/00-load.t
 t/pod-coverage.t
 t/pod.t

Modified: trunk/libredis-perl/META.yml
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libredis-perl/META.yml?rev=67981&op=diff
==============================================================================
--- trunk/libredis-perl/META.yml (original)
+++ trunk/libredis-perl/META.yml Fri Jan 28 10:28:31 2011
@@ -15,7 +15,9 @@
     Data::Dumper:      0
     Encode:            0
     IO::Socket::INET:  0
-    Test::More:        0
+    Test::Deep:        0
+    Test::Exception:   0
+    Test::More:        0.92
 no_index:
     directory:
         - t

Modified: trunk/libredis-perl/Makefile.PL
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libredis-perl/Makefile.PL?rev=67981&op=diff
==============================================================================
--- trunk/libredis-perl/Makefile.PL (original)
+++ trunk/libredis-perl/Makefile.PL Fri Jan 28 10:28:31 2011
@@ -9,7 +9,9 @@
     ABSTRACT_FROM       => 'lib/Redis.pm',
     PL_FILES            => {},
     PREREQ_PM => {
-        'Test::More' => 0,
+        'Test::More' => 0.92,
+        'Test::Exception' => 0,
+        'Test::Deep' => 0,
 		'IO::Socket::INET' => 0,
 		'Data::Dumper' => 0,
 		'Carp' => 0,

Modified: trunk/libredis-perl/debian/changelog
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libredis-perl/debian/changelog?rev=67981&op=diff
==============================================================================
--- trunk/libredis-perl/debian/changelog (original)
+++ trunk/libredis-perl/debian/changelog Fri Jan 28 10:28:31 2011
@@ -1,8 +1,10 @@
-libredis-perl (2:1.2001-2) UNRELEASED; urgency=low
+libredis-perl (2:1.2001+git20110127-1) unstable; urgency=low
 
-  * debian/control: Update my email address.
+  * New upstream release bringing Redis 2.0 support from git 20110127.91693e7f
+  * debian/compat: updated to 8
+  * debian/control: Standards-Version updated to 3.9.1, debhelper > 8
 
- -- Tim Retout <diocles at debian.org>  Sun, 24 Oct 2010 21:53:03 +0100
+ -- Jorge Salamero Sanz <bencer at debian.org>  Thu, 27 Jan 2011 18:05:41 +0100
 
 libredis-perl (2:1.2001-1) unstable; urgency=low
 

Modified: trunk/libredis-perl/debian/compat
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libredis-perl/debian/compat?rev=67981&op=diff
==============================================================================
--- trunk/libredis-perl/debian/compat (original)
+++ trunk/libredis-perl/debian/compat Fri Jan 28 10:28:31 2011
@@ -1,1 +1,1 @@
-7
+8

Modified: trunk/libredis-perl/debian/control
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libredis-perl/debian/control?rev=67981&op=diff
==============================================================================
--- trunk/libredis-perl/debian/control (original)
+++ trunk/libredis-perl/debian/control Fri Jan 28 10:28:31 2011
@@ -1,12 +1,12 @@
 Source: libredis-perl
 Section: perl
 Priority: optional
-Build-Depends: debhelper (>= 7)
+Build-Depends: debhelper (>= 8)
 Build-Depends-Indep: perl, libtest-pod-perl, libtest-pod-coverage-perl
 Maintainer: Debian Perl Group <pkg-perl-maintainers at lists.alioth.debian.org>
-Uploaders: Tim Retout <diocles at debian.org>, 
+Uploaders: Tim Retout <tim at retout.co.uk>, 
  Krzysztof Krzyżaniak (eloy) <eloy at debian.org>
-Standards-Version: 3.8.4
+Standards-Version: 3.9.1
 Homepage: http://search.cpan.org/dist/Redis/
 Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/libredis-perl/
 Vcs-Browser: http://svn.debian.org/viewsvn/pkg-perl/trunk/libredis-perl/

Modified: trunk/libredis-perl/lib/Redis.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libredis-perl/lib/Redis.pm?rev=67981&op=diff
==============================================================================
--- trunk/libredis-perl/lib/Redis.pm (original)
+++ trunk/libredis-perl/lib/Redis.pm Fri Jan 28 10:28:31 2011
@@ -4,6 +4,8 @@
 use strict;
 
 use IO::Socket::INET;
+use IO::Select;
+use Fcntl qw( O_NONBLOCK F_SETFL );
 use Data::Dumper;
 use Carp qw/confess/;
 use Encode;
@@ -42,145 +44,321 @@
 =cut
 
 sub new {
-	my $class = shift;
-	my $self = {@_};
-	$self->{debug} ||= $ENV{REDIS_DEBUG};
-
-	$self->{sock} = IO::Socket::INET->new(
-		PeerAddr => $self->{server} || $ENV{REDIS_SERVER} || '127.0.0.1:6379',
-		Proto => 'tcp',
-	) || die $!;
-
-	bless($self, $class);
-	$self;
-}
-
-my $bulk_command = {
-	set => 1,	setnx => 1,
-	rpush => 1,	lpush => 1,
-	lset => 1,	lrem => 1,
-	sadd => 1,	srem => 1,
-	sismember => 1,
-	echo => 1,
-	getset => 1,
-	smove => 1,
-	zadd => 1,
-	zrem => 1,
-	zscore => 1,
-	zincrby => 1,
-	append => 1,
-};
-
-# we don't want DESTROY to fallback into AUTOLOAD
-sub DESTROY {}
-
+  my $class = shift;
+  my $self  = {@_};
+
+  $self->{debug} ||= $ENV{REDIS_DEBUG};
+  $self->{encoding} ||= 'utf8';    ## default to lax utf8
+
+  $self->{server} ||= $ENV{REDIS_SERVER} || '127.0.0.1:6379';
+  $self->{sock} = IO::Socket::INET->new(
+    PeerAddr => $self->{server},
+    Proto    => 'tcp',
+  ) || confess("Could not connect to Redis server at $self->{server}: $!");
+
+  $self->{read_size} = 8192;
+  $self->{rbuf}      = '';
+
+  $self->{is_subscriber} = 0;
+  $self->{subscribers}   = {};
+
+  return bless($self, $class);
+}
+
+sub is_subscriber { $_[0]{is_subscriber} }
+
+
+### we don't want DESTROY to fallback into AUTOLOAD
+sub DESTROY { }
+
+
+### Deal with common, general case, Redis commands
 our $AUTOLOAD;
+
 sub AUTOLOAD {
-	my $self = shift;
-
-	use bytes;
-
-	my $sock = $self->{sock} || die "no server connected";
-
-	my $command = $AUTOLOAD;
-	$command =~ s/.*://;
-
-	warn "## $command ",Dumper(@_) if $self->{debug};
-
-	my $send;
-
-	if ( defined $bulk_command->{$command} ) {
-		my $value = pop;
-		$value = '' if ! defined $value;
-		$send
-			= uc($command)
-			. ' '
-			. join(' ', @_)
-			. ' ' 
-			. length( $value )
-			. "\r\n$value\r\n"
-			;
-	} else {
-		$send
-			= uc($command)
-			. ' '
-			. join(' ', @_)
-			. "\r\n"
-			;
-	}
-
-	warn ">> $send" if $self->{debug};
-	print $sock $send;
-
-	if ( $command eq 'quit' ) {
-		close( $sock ) || die "can't close socket: $!";
-		return 1;
-	}
-
-	my $result = <$sock> || die "can't read socket: $!";
-	Encode::_utf8_on($result);
-	warn "<< $result" if $self->{debug};
-	my $type = substr($result,0,1);
-	$result = substr($result,1,-2);
-
-	if ( $command eq 'info' ) {
-		my $hash;
-		foreach my $l ( split(/\r\n/, $self->__read_bulk($result) ) ) {
-			my ($n,$v) = split(/:/, $l, 2);
-			$hash->{$n} = $v;
-		}
-		return $hash;
-	} elsif ( $command eq 'keys' ) {
-		my $keys = $self->__read_bulk($result);
-		return split(/\s/, $keys) if $keys;
-		return;
-	}
-
-	if ( $type eq '-' ) {
-		confess "[$command] $result";
-	} elsif ( $type eq '+' ) {
-		return $result;
-	} elsif ( $type eq '$' ) {
-		return $self->__read_bulk($result);
-	} elsif ( $type eq '*' ) {
-		return $self->__read_multi_bulk($result);
-	} elsif ( $type eq ':' ) {
-		return $result; # FIXME check if int?
-	} else {
-		confess "unknown type: $type", $self->__read_line();
-	}
-}
-
-sub __read_bulk {
-	my ($self,$len) = @_;
-	return undef if $len < 0;
-
-	my $v;
-	if ( $len > 0 ) {
-		read($self->{sock}, $v, $len) || die $!;
-		Encode::_utf8_on($v);
-		warn "<< ",Dumper($v),$/ if $self->{debug};
-	}
-	my $crlf;
-	read($self->{sock}, $crlf, 2); # skip cr/lf
-	return $v;
-}
-
-sub __read_multi_bulk {
-	my ($self,$size) = @_;
-	return undef if $size < 0;
-	my $sock = $self->{sock};
-
-	$size--;
-
-	my @list = ( 0 .. $size );
-	foreach ( 0 .. $size ) {
-		$list[ $_ ] = $self->__read_bulk( substr(<$sock>,1,-2) );
-	}
-
-	warn "## list = ", Dumper( @list ) if $self->{debug};
-	return @list;
-}
+  my $self = shift;
+  my $sock = $self->{sock} || confess("Not connected to any server");
+  my $enc  = $self->{encoding};
+  my $deb  = $self->{debug};
+
+  my $command = $AUTOLOAD;
+  $command =~ s/.*://;
+  $self->__is_valid_command($command);
+
+  ## PubSub commands use a different answer handling
+  if (my ($pr, $unsub) = $command =~ /^(p)?(un)?subscribe$/i) {
+    $pr = '' unless $pr;
+
+    my $cb = pop;
+    confess("Missing required callback in call to $command(), ")
+      unless ref($cb) eq 'CODE';
+
+    my @subs = @_;
+    @subs = $self->__process_unsubscribe_requests($cb, $pr, @subs)
+      if $unsub;
+    return unless @subs;
+
+    $self->__send_command($command, @subs);
+
+    my %cbs = map { ("${pr}message:$_" => $cb) } @subs;
+    return $self->__process_subscription_changes($command, \%cbs);
+  }
+
+  $self->__send_command($command, @_);
+  return $self->__read_response($command);
+}
+
+
+### Commands with extra logic
+sub quit {
+  my ($self) = @_;
+
+  $self->__send_command('QUIT');
+
+  delete $self->{rbuf};
+  close(delete $self->{sock}) || confess("Can't close socket: $!");
+
+  return 1;
+}
+
+sub info {
+  my ($self) = @_;
+  $self->__is_valid_command('INFO');
+
+  $self->__send_command('INFO');
+
+  my $info = $self->__read_response('INFO');
+
+  return {map { split(/:/, $_, 2) } split(/\r\n/, $info)};
+}
+
+sub keys {
+  my $self = shift;
+  $self->__is_valid_command('KEYS');
+
+  $self->__send_command('KEYS', @_);
+
+  my @keys = $self->__read_response('KEYS', \my $type);
+  ## Support redis > 1.26
+  return @keys if $type eq '*';
+
+  ## Support redis <= 1.2.6
+  return split(/\s/, $keys[0]) if $keys[0];
+  return;
+}
+
+
+### PubSub
+sub wait_for_messages {
+  my ($self, $timeout) = @_;
+
+  my $s = IO::Select->new;
+  $s->add($self->{sock});
+
+  my $count = 0;
+  while ($s->can_read($timeout)) {
+    while ($self->__can_read_sock) {
+      my @m = $self->__read_response('WAIT_FOR_MESSAGES');
+      $self->__process_pubsub_msg(\@m);
+      $count++;
+    }
+  }
+
+  return $count;
+}
+
+sub __process_unsubscribe_requests {
+  my ($self, $cb, $pr, @unsubs) = @_;
+  my $subs = $self->{subscribers};
+
+  my @subs_to_unsubscribe;
+  for my $sub (@unsubs) {
+    my $key = "${pr}message:$sub";
+    my $cbs = $subs->{$key} = [grep { $_ ne $cb } @{$subs->{$key}}];
+    next if @$cbs;
+
+    delete $subs->{$key};
+    push @subs_to_unsubscribe, $sub;
+  }
+
+  return @subs_to_unsubscribe;
+}
+
+sub __process_subscription_changes {
+  my ($self, $cmd, $expected) = @_;
+  my $subs = $self->{subscribers};
+
+  while (%$expected) {
+    my @m = $self->__read_response($cmd);
+
+    ## Deal with pending PUBLISH'ed messages
+    if ($m[0] =~ /^p?message$/) {
+      $self->__process_pubsub_msg(\@m);
+      next;
+    }
+
+    my ($key, $unsub) = $m[0] =~ m/^(p)?(un)?subscribe$/;
+    $key .= "message:$m[1]";
+    my $cb = delete $expected->{$key};
+
+    push @{$subs->{$key}}, $cb unless $unsub;
+
+    $self->{is_subscriber} = $m[2];
+  }
+}
+
+sub __process_pubsub_msg {
+  my ($self, $m) = @_;
+  my $subs = $self->{subscribers};
+
+  my $sub   = $m->[1];
+  my $cbid  = "$m->[0]:$sub";
+  my $data  = pop @$m;
+  my $topic = $m->[2] || $sub;
+
+  if (!exists $subs->{$cbid}) {
+    warn "Message for topic '$topic' ($cbid) without expected callback, ";
+    return;
+  }
+
+  $_->($data, $topic, $sub) for @{$subs->{$cbid}};
+
+  return 1;
+
+}
+
+
+### Mode validation
+sub __is_valid_command {
+  my ($self, $cmd) = @_;
+
+  return unless $self->{is_subscriber};
+  return if $cmd =~ /^P?(UN)?SUBSCRIBE$/i;
+  confess("Cannot use command '$cmd' while in SUBSCRIBE mode, ");
+}
+
+
+### Socket operations
+sub __send_command {
+  my $self = shift;
+  my $cmd  = uc(shift);
+  my $enc  = $self->{encoding};
+  my $deb  = $self->{debug};
+
+  warn "[SEND] $cmd ", Dumper([@_]) if $deb;
+
+  ## Encode command using multi-bulk format
+  my $n_elems = scalar(@_) + 1;
+  my $buf     = "\*$n_elems\r\n";
+  for my $elem ($cmd, @_) {
+    my $bin = $enc ? encode($enc, $elem) : $elem;
+    $buf .= defined($bin) ? '$' . length($bin) . "\r\n$bin\r\n" : "\$-1\r\n";
+  }
+
+  ## Send command, take care for partial writes
+  warn "[SEND RAW] $buf" if $deb;
+  my $sock = $self->{sock} || confess("Not connected to any server");
+  while ($buf) {
+    my $len = syswrite $sock, $buf, length $buf;
+    confess("Could not write to Redis server: $!")
+      unless $len;
+    substr $buf, 0, $len, "";
+  }
+
+  return;
+}
+
+sub __read_response {
+  my ($self, $command, $type_r) = @_;
+
+  my ($type, $result) = $self->__read_sock;
+  $$type_r = $type if $type_r;
+
+  if ($type eq '-') {
+    confess "[$command] $result, ";
+  }
+  elsif ($type eq '+') {
+    return $result;
+  }
+  elsif ($type eq '$') {
+    return if $result < 0;
+    return $self->__read_sock($result);
+  }
+  elsif ($type eq '*') {
+    my @list;
+    while ($result--) {
+      push @list, scalar($self->__read_response($command));
+    }
+    return @list if wantarray;
+    return \@list;
+  }
+  elsif ($type eq ':') {
+    return $result;
+  }
+  else {
+    confess "unknown answer type: $type ($result), ";
+  }
+}
+
+sub __read_sock {
+  my ($self, $len) = @_;
+  my $sock = $self->{sock} || confess("Not connected to any server");
+  my $enc  = $self->{encoding};
+  my $deb  = $self->{debug};
+  my $rbuf = \($self->{rbuf});
+
+  my ($data, $type) = ('', '');
+  my $read_size = $self->{read_size};
+  $read_size = $len + 2 if defined $len && $len + 2 > $read_size;
+
+  while (1) {
+    ## Read NN bytes, strip \r\n at the end
+    if (defined $len) {
+      if (length($$rbuf) >= $len + 2) {
+        $data = substr(substr($$rbuf, 0, $len + 2, ''), 0, -2);
+        last;
+      }
+    }
+    ## No len, means line more, read until \r\n
+    elsif ($$rbuf =~ s/^(.)([^\015\012]*)\015\012//) {
+      ($type, $data) = ($1, $2);
+      last;
+    }
+
+    my $bytes = sysread $sock, $$rbuf, $read_size, length $$rbuf;
+    confess("Error while reading from Redis server: $!")
+      unless defined $bytes;
+    confess("Redis server closed connection") unless $bytes;
+  }
+
+  $data = decode($enc, $data) if $enc;
+  warn "[RECV] '$type$data'" if $self->{debug};
+
+  return ($type, $data) if $type;
+  return $data;
+}
+
+sub __can_read_sock {
+  my ($self) = @_;
+  my $sock   = $self->{sock};
+  my $rbuf   = \($self->{rbuf});
+
+  return 1 if $$rbuf;
+  __fh_nonblocking($sock, 1);
+  my $bytes = sysread $sock, $$rbuf, $self->{read_size}, length $$rbuf;
+  __fh_nonblocking($sock, 0);
+  return 1 if $bytes;
+  return 0;
+}
+
+
+### Copied from AnyEvent::Util
+BEGIN {
+  *__fh_nonblocking = ($^O eq 'MSWin32')
+    ? sub($$) { ioctl $_[0], 0x8004667e, pack "L", $_[1]; }    # FIONBIO
+    : sub($$) { fcntl $_[0], F_SETFL, $_[1] ? O_NONBLOCK : 0; };
+}
+
 
 1;
 

Modified: trunk/libredis-perl/t/00-load.t
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libredis-perl/t/00-load.t?rev=67981&op=diff
==============================================================================
--- trunk/libredis-perl/t/00-load.t (original)
+++ trunk/libredis-perl/t/00-load.t Fri Jan 28 10:28:31 2011
@@ -3,7 +3,7 @@
 use Test::More tests => 1;
 
 BEGIN {
-	use_ok( 'Redis' );
+  use_ok('Redis');
 }
 
-diag( "Testing Redis $Redis::VERSION, Perl $], $^X" );
+diag("Testing Redis $Redis::VERSION, Perl $], $^X");

Modified: trunk/libredis-perl/t/pod-coverage.t
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libredis-perl/t/pod-coverage.t?rev=67981&op=diff
==============================================================================
--- trunk/libredis-perl/t/pod-coverage.t (original)
+++ trunk/libredis-perl/t/pod-coverage.t Fri Jan 28 10:28:31 2011
@@ -2,17 +2,22 @@
 use warnings;
 use Test::More;
 
+plan skip_all => 
+  "Test::Pod::Coverage tests only run if \$RELEASE_TESTING is enabled"
+  unless $ENV{RELEASE_TESTING};
+
 # Ensure a recent version of Test::Pod::Coverage
 my $min_tpc = 1.08;
 eval "use Test::Pod::Coverage $min_tpc";
-plan skip_all => "Test::Pod::Coverage $min_tpc required for testing POD coverage"
-    if $@;
+plan skip_all =>
+  "Test::Pod::Coverage $min_tpc required for testing POD coverage"
+  if $@;
 
 # Test::Pod::Coverage doesn't require a minimum Pod::Coverage version,
 # but older versions don't recognize some common documentation styles
 my $min_pc = 0.18;
 eval "use Pod::Coverage $min_pc";
 plan skip_all => "Pod::Coverage $min_pc required for testing POD coverage"
-    if $@;
+  if $@;
 
 all_pod_coverage_ok();




More information about the Pkg-perl-cvs-commits mailing list