NAME `Net::Async::CassandraCQL' - use Cassandra databases with IO::Async using CQL SYNOPSIS use IO::Async::Loop; use Net::Async::CassandraCQL; use Protocol::CassandraCQL qw( CONSISTENCY_QUORUM ); my $loop = IO::Async::Loop->new; my $cass = Net::Async::CassandraCQL->new( host => "localhost", ); $loop->add( $cass ); $cass->connect->then( sub { $cass->query( "USE my-keyspace;" ); })->get; my @f; foreach my $number ( 1 .. 100 ) { push @f, $cass->query( "INSERT INTO numbers (v) = $number;", CONSISTENCY_QUORUM ); } Future->needs_all( @f )->get; my $get_stmt = $cass->prepare( "SELECT v FROM numbers;" )->get; my ( undef, $result ) = $get_stmt->execute( [], CONSISTENCY_QUORUM )->get; foreach my $idx ( 0 .. $result->rows - 1 ) { say "We have a number " . $result->row_hash($idx)->{v}; } DESCRIPTION This module allows use of the `CQL' interface of a Cassandra database. It fully supports asynchronous operation via IO::Async, allowing both direct queries and prepared statements to be managed. It is based on Protocol::CassandraCQL, which more completely documents the behaviours, and limits of its ability to communicate with Cassandra. PARAMETERS The following named parameters may be passed to `new' or `configure': host => STRING The hostname of the Cassandra node to connect to service => STRING Optional. The service name or port number to connect to. METHODS $f = $cass->connect( %args ) Connects to the Cassandra node an send the `OPCODE_STARTUP' message. The returned Future will yield nothing on success. Takes the following named arguments: host => STRING service => STRING Optional. Overrides the configured values. A host name is required, either as a named argument or as a configured value on the object. If the service name is missing, the default CQL port will be used instead. $f = $cass->send_message( $opcode, $frame ) Sends a message with the given opcode and Protocol::CassandraCQL::Frame for the message body. The returned Future will yield the response opcode and frame. ( $reply_opcode, $reply_frame ) = $f->get This is a low-level method; applications should instead use one of the wrapper methods below. $f = $cass->startup Sends a `OPCODE_STARTUP' message. On success, the returned Future yields nothing. Normally this is not required as the `connect' method performs it implicitly. $f = $cass->options Sends a `OPCODE_OPTIONS' message. On success, the returned Future yields a HASH reference mapping option names to ARRAY references containing valid values. $f = $cass->query( $cql, $consistency ) Sends a `OPCODE_QUERY' message. On success, the values returned from the Future will depend on the type of response. ( $type, $result ) = $f->get For type `keyspace', `$result' is a string giving the name of the new keyspace (returned from `USE' queries). For type `schema_change', `$result' is a 3-element ARRAY reference containing the type of change, the keyspace and the table name (returned from `CREATE', `ALTER' and `DROP' queries). For type `rows', `$result' is an instance of Protocol::CassandraCQL::Result. For void-returning queries such as `INSERT', the future returns nothing. $f = $cass->prepare( $cql ) Sends a `OPCODE_PREPARE' message. On success, the returned Future yields an instance of a prepared query object (see below). ( $query ) = $f->get $f = $cass->execute( $id, $data, $consistency ) Sends a `OPCODE_EXECUTE' message to execute a previously-prepared statement. On success, the returned Future will yield results of the same form as the `query' method. `$data' should contain a list of encoded byte-string values. PREPARED QUERIES Prepared query objects are returned by `prepare', and have the following methods, in addition to those of its parent class, Protocol::CassandraCQL::ColumnMeta. $id = $query->id Returns the query ID. $f = $query->execute( $data, $consistency ) Executes the query on the Cassandra connection object that created it, returning a future yielding the result the same way as the `query' or `execute' methods. The contents of the `$data' reference will be encoded according to the types given in the underlying column metadata. `$data' may be given as a positional ARRAY reference, or a named HASH reference where the keys give column names. TODO * Handle OPCODE_AUTHENTICATE and OPCODE_REGISTER * Support frame compression * Move Protocol::CassandraCQL to its own distribution * Allow storing multiple Cassandra node hostnames and perform some kind of balancing or failover of connections. SPONSORS This code was paid for by * Perceptyx http://www.perceptyx.com/ * Shadowcat Systems http://www.shadow.cat AUTHOR Paul Evans