Protocol-CassandraCQL
view release on metacpan or search on metacpan
lib/Protocol/CassandraCQL/Frame.pm view on Meta::CPAN
=head2 $frame->pack_string_list( $v )
=head2 $v = $frame->unpack_string_list
Add or remove a list of strings from or to an ARRAYref
=cut
sub pack_string_list { my ( $self, $v ) = @_;
$self->pack_short( scalar @$v );
$self->pack_string($_) for @$v;
$self }
sub unpack_string_list { my ( $self ) = @_;
my $n = $self->unpack_short;
[ map { $self->unpack_string } 1 .. $n ] }
=head2 $frame->pack_bytes( $v )
=head2 $v = $frame->unpack_bytes
Add or remove opaque bytes or C<undef>.
=cut
sub pack_bytes { my ( $self, $v ) = @_;
if( defined $v ) { $self->pack_int( length $v ); $$self .= $v }
else { $self->pack_int( -1 ) }
$self }
sub unpack_bytes { my ( $self ) = @_;
my $l = $self->unpack_int;
$l > 0 ? substr $$self, 0, $l, "" : undef }
=head2 $frame->pack_short_bytes( $v )
=head2 $v = $frame->unpack_short_bytes
Add or remove opaque short bytes.
=cut
sub pack_short_bytes { my ( $self, $v ) = @_;
$self->pack_short( length $v );
$$self .= $v;
$self }
sub unpack_short_bytes { my ( $self ) = @_;
my $l = $self->unpack_short;
substr $$self, 0, $l, "" }
=head2 $frame->pack_inet( $v )
=head2 $v = $frame->unpack_inet
Add or remove an IPv4 or IPv6 address from or to a packed sockaddr string
(such as returned from C<pack_sockaddr_in> or C<pack_sockaddr_in6>.
=cut
sub pack_inet { my ( $self, $v ) = @_;
my $family = Socket::sockaddr_family($v);
if ( $family == AF_INET ) { $$self .= "\x04"; $self->_pack_inet4( $v ) }
elsif( $family == AF_INET6 ) { $$self .= "\x10"; $self->_pack_inet6( $v ) }
else { croak "Expected AF_INET or AF_INET6 address" }
$self }
sub unpack_inet { my ( $self ) = @_;
my $addrlen = unpack "C", substr $$self, 0, 1, "";
if ( $addrlen == 4 ) { $self->_unpack_inet4 }
elsif( $addrlen == 16 ) { $self->_unpack_inet6 }
else { croak "Expected address length 4 or 16" } }
# AF_INET
sub _pack_inet4 { my ( $self, $v ) = @_;
my ( $port, $addr ) = Socket::unpack_sockaddr_in( $v );
$$self .= $addr; $self->pack_int( $port ) }
sub _unpack_inet4 { my ( $self ) = @_;
my $addr = substr $$self, 0, 4, "";
Socket::pack_sockaddr_in( $self->unpack_int, $addr ) }
# AF_INET6
sub _pack_inet6 { my ( $self, $v ) = @_;
my ( $port, $addr ) = Socket::unpack_sockaddr_in6( $v );
$$self .= $addr; $self->pack_int( $port ) }
sub _unpack_inet6 { my ( $self ) = @_;
my $addr = substr $$self, 0, 16, "";
Socket::pack_sockaddr_in6( $self->unpack_int, $addr ) }
=head2 $frame->pack_string_map( $v )
=head2 $v = $frame->unpack_string_map
Add or remove a string map from or to a HASH of strings.
=cut
# Don't strictly need to sort the keys but it's nice for unit testing
sub pack_string_map { my ( $self, $v ) = @_;
$self->pack_short( scalar keys %$v );
$self->pack_string( $_ ), $self->pack_string( $v->{$_} ) for sort keys %$v;
$self }
sub unpack_string_map { my ( $self ) = @_;
my $n = $self->unpack_short;
+{ map { $self->unpack_string => $self->unpack_string } 1 .. $n } }
=head2 $frame->pack_string_multimap( $v )
=head2 $v = $frame->unpack_string_multimap
Add or remove a string multimap from or to a HASH of ARRAYs of strings.
=cut
sub pack_string_multimap { my ( $self, $v ) = @_;
$self->pack_short( scalar keys %$v );
$self->pack_string( $_ ), $self->pack_string_list( $v->{$_} ) for sort keys %$v;
$self }
sub unpack_string_multimap { my ( $self ) = @_;
my $n = $self->unpack_short;
+{ map { $self->unpack_string => $self->unpack_string_list } 1 .. $n } }
=head1 SPONSORS
This code was paid for by
=over 2
=item *
Perceptyx L<http://www.perceptyx.com/>
=item *
Shadowcat Systems L<http://www.shadow.cat>
=back
=head1 AUTHOR
Paul Evans <leonerd@leonerd.org.uk>
=cut
0x55AA;
( run in 0.706 second using v1.01-cache-2.11-cpan-39bf76dae61 )