App-Memcached-Tool
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/App/Memcached/Tool/DataSource.pm view on Meta::CPAN
package App::Memcached::Tool::DataSource;
use strict;
use warnings;
use 5.008_001;
use Carp;
use IO::Socket;
use App::Memcached::Tool::Util qw(is_unixsocket debug);
sub new {
my $class = shift;
my %args = @_;
bless \%args, $class;
}
sub connect {
my $class = shift;
my $addr = shift;
my %opts = @_;
my $socket = sub {
return IO::Socket::UNIX->new(Peer => $addr) if is_unixsocket($addr);
return IO::Socket::INET->new(
PeerAddr => $addr,
Proto => 'tcp',
Timeout => $opts{timeout} || 5,
);
}->();
confess "Can't connect to $addr" unless $socket;
return $class->new(socket => $socket);
}
sub disconnect {
my $self = shift;
$self->{socket}->close or confess "Failed to close connection!";
undef $self->{socket};
}
sub get {
my $self = shift;
my @keys = @_;
my $key_str = join(q{ }, @keys);
$self->{socket}->write("get $key_str\r\n");
my @results;
while (1) {
my $response = $self->{socket}->getline;
next if ($response =~ m/^[\r\n]+$/);
if ($response =~ m/^VALUE (\S+) (\d+) (\d+)(?: (\d+))?/) {
my %data = (
key => $1,
flags => $2,
length => $3,
cas => $4,
);
$self->{socket}->read($response, $data{length});
$data{value} = $response;
push @results, \%data;
} elsif ($response =~ m/^END/) {
last;
} else {
warn "Unknown response '$response'";
}
}
return \@results;
}
sub query {
my $self = shift;
my $query = shift;
$self->{socket}->write("$query\r\n");
my @response;
while ($_ = $self->{socket}->getline) {
last if m/^END/;
confess $_ if m/^(CLIENT|SERVER_)?ERROR/;
$_ =~ s/[\r\n]+$//;
push @response, $_;
}
return \@response;
view all matches for this distributionview release on metacpan - search on metacpan
( run in 1.114 second using v1.00-cache-2.02-grep-82fe00e-cpan-2c419f77a38b )