1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
package Cassandra::Client::Config;
our $AUTHORITY = 'cpan:TVDW';
$Cassandra::Client::Config::VERSION = '0.21';
use 5.010;
use strict;
use warnings;
use Ref::Util qw/is_plain_arrayref is_plain_coderef is_blessed_ref/;
use Cassandra::Client::Policy::Auth::Password;
sub new {
my ($class, $config)= @_;
my $self= bless {
anyevent => 0,
contact_points => undef,
port => 9042,
cql_version => undef,
keyspace => undef,
compression => undef,
default_consistency => undef,
default_idempotency => 0,
max_page_size => 5000,
max_connections => 2,
timer_granularity => 0.1,
request_timeout => 11,
warmup => 0,
max_concurrent_queries => 1000,
tls => 0,
protocol_version => 4,
throttler => undef,
command_queue => undef,
retry_policy => undef,
load_balancing_policy => undef,
authentication => undef,
stats_hook => undef,
}, $class;
if (my $cp= $config->{contact_points}) {
if (is_plain_arrayref($cp)) {
@{$self->{contact_points}=[]}= @$cp;
} else { die "contact_points must be an arrayref"; }
} else { die "contact_points not specified"; }
# Booleans
for (qw/anyevent warmup tls default_idempotency/) {
if (exists($config->{$_})) {
$self->{$_}= !!$config->{$_};
}
}
# Numbers, ignore undef
for (qw/port timer_granularity request_timeout max_connections max_concurrent_queries/) {
if (defined($config->{$_})) {
$self->{$_}= 0+ $config->{$_};
}
}
# Numbers, undef actually means undef
for (qw/max_page_size/) {
if (exists($config->{$_})) {
$self->{$_}= defined($config->{$_}) ? (0+ $config->{$_}) : undef;
}
}
# Strings
for (qw/cql_version keyspace compression default_consistency/) {
if (exists($config->{$_})) {
$self->{$_}= defined($config->{$_}) ? "$config->{$_}" : undef;
}
}
# Coderefs
for (qw/stats_hook/) {
if (defined($config->{$_})) {
die "$_ must be a CODE reference" unless is_plain_coderef($config->{$_});
$self->{$_}= $config->{$_};
}
}
# Policies
for (qw/throttler retry_policy command_queue load_balancing_policy authentication/) {
if (exists($config->{$_})) {
die "$_ must be a blessed reference implementing the correct API"
unless is_blessed_ref($config->{$_});
$self->{$_}= $config->{$_};
}
}
if (exists($config->{username}) || exists($config->{password})) {
$self->{authentication}= Cassandra::Client::Policy::Auth::Password->new(
username => $config->{username},
password => $config->{password},
);
}
if (exists $config->{protocol_version}) {
if ($config->{protocol_version} == 3 || $config->{protocol_version} == 4) {
$self->{protocol_version}= 0+ $config->{protocol_version};
} else {
die "Invalid protocol_version: must be one of [3, 4]";
}
}
return $self;
}
1;
__END__
=pod
=head1 NAME
Cassandra::Client::Config
=head1 VERSION
version 0.21
=head1 AUTHOR
Tom van der Woerdt <tvdw@cpan.org>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2023 by Tom van der Woerdt.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
|