# HG changeset patch # User Shoshi TAMAKI # Date 1275829238 -32400 # Node ID a2f0a2c135cf7e69ad478dd1e4653805ebcad974 hg init diff -r 000000000000 -r a2f0a2c135cf Algorithm/Diff.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Algorithm/Diff.pm Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,584 @@ +package Algorithm::Diff; +use strict; +use vars qw($VERSION @EXPORT_OK @ISA @EXPORT); +use integer; # see below in _replaceNextLargerWith() for mod to make + # if you don't use this +require Exporter; +@ISA = qw(Exporter); +@EXPORT = qw(); +@EXPORT_OK = qw(LCS diff traverse_sequences); +$VERSION = sprintf('%d.%02d', (q$Revision: 1.1.2.1 $ =~ /\d+/g)); + +# McIlroy-Hunt diff algorithm +# Adapted from the Smalltalk code of Mario I. Wolczko, +# by Ned Konz, perl@bike-nomad.com + +=head1 NAME + +Algorithm::Diff - Compute `intelligent' differences between two files / lists + +=head1 SYNOPSIS + + use Algorithm::Diff qw(diff LCS traverse_sequences); + + @lcs = LCS( \@seq1, \@seq2 ); + + @lcs = LCS( \@seq1, \@seq2, $key_generation_function ); + + $lcsref = LCS( \@seq1, \@seq2 ); + + $lcsref = LCS( \@seq1, \@seq2, $key_generation_function ); + + @diffs = diff( \@seq1, \@seq2 ); + + @diffs = diff( \@seq1, \@seq2, $key_generation_function ); + + traverse_sequences( \@seq1, \@seq2, + { MATCH => $callback, + DISCARD_A => $callback, + DISCARD_B => $callback, + } ); + + traverse_sequences( \@seq1, \@seq2, + { MATCH => $callback, + DISCARD_A => $callback, + DISCARD_B => $callback, + }, + $key_generation_function ); + +=head1 INTRODUCTION + +(by Mark-Jason Dominus) + +I once read an article written by the authors of C; they said +that they hard worked very hard on the algorithm until they found the +right one. + +I think what they ended up using (and I hope someone will correct me, +because I am not very confident about this) was the `longest common +subsequence' method. in the LCS problem, you have two sequences of +items: + + a b c d f g h j q z + + a b c d e f g i j k r x y z + +and you want to find the longest sequence of items that is present in +both original sequences in the same order. That is, you want to find +a new sequence I which can be obtained from the first sequence by +deleting some items, and from the secend sequence by deleting other +items. You also want I to be as long as possible. In this case +I is + + a b c d f g j z + +From there it's only a small step to get diff-like output: + + e h i k q r x y + + - + + - + + + + +This module solves the LCS problem. It also includes a canned +function to generate C-like output. + +It might seem from the example above that the LCS of two sequences is +always pretty obvious, but that's not always the case, especially when +the two sequences have many repeated elements. For example, consider + + a x b y c z p d q + a b c a x b y c z + +A naive approach might start by matching up the C and C that +appear at the beginning of each sequence, like this: + + a x b y c z p d q + a b c a b y c z + +This finds the common subsequence C. But actually, the LCS +is C: + + a x b y c z p d q + a b c a x b y c z + +=head1 USAGE + +This module provides three exportable functions, which we'll deal with in +ascending order of difficulty: C, C, and +C. + +=head2 C + +Given references to two lists of items, LCS returns an array containing their +longest common subsequence. In scalar context, it returns a reference to +such a list. + + @lcs = LCS( \@seq1, \@seq2 ); + $lcsref = LCS( \@seq1, \@seq2 ); + +C may be passed an optional third parameter; this is a CODE +reference to a key generation function. See L. + + @lcs = LCS( \@seq1, \@seq2, $keyGen ); + $lcsref = LCS( \@seq1, \@seq2, $keyGen ); + +Additional parameters, if any, will be passed to the key generation +routine. + +=head2 C + + @diffs = diff( \@seq1, \@seq2 ); + $diffs_ref = diff( \@seq1, \@seq2 ); + +C computes the smallest set of additions and deletions necessary +to turn the first sequence into the second, and returns a description +of these changes. The description is a list of I; each hunk +represents a contiguous section of items which should be added, +deleted, or replaced. The return value of C is a list of +hunks, or, in scalar context, a reference to such a list. + +Here is an example: The diff of the following two sequences: + + a b c e h j l m n p + b c d e f j k l m r s t + +Result: + + [ + [ [ '-', 0, 'a' ] ], + + [ [ '+', 2, 'd' ] ], + + [ [ '-', 4, 'h' ] , + [ '+', 4, 'f' ] ], + + [ [ '+', 6, 'k' ] ], + + [ [ '-', 8, 'n' ], + [ '-', 9, 'p' ], + [ '+', 9, 'r' ], + [ '+', 10, 's' ], + [ '+', 11, 't' ], + ] + ] + +There are five hunks here. The first hunk says that the C at +position 0 of the first sequence should be deleted (C<->). The second +hunk says that the C at position 2 of the second sequence should +be inserted (C<+>). The third hunk says that the C at position 4 +of the first sequence should be removed and replaced with the C +from position 4 of the second sequence. The other two hunks similarly. + +C may be passed an optional third parameter; this is a CODE +reference to a key generation function. See L. + +Additional parameters, if any, will be passed to the key generation +routine. + +=head2 C + +C is the most general facility provided by this +module; C and C are implemented as calls to it. + +Imagine that there are two arrows. Arrow A points to an element of +sequence A, and arrow B points to an element of the sequence B. +Initially, the arrows point to the first elements of the respective +sequences. C will advance the arrows through the +sequences one element at a time, calling an appropriate user-specified +callback function before each advance. It willadvance the arrows in +such a way that if there are equal elements C<$A[$i]> and C<$B[$j]> +which are equal and which are part of the LCS, there will be some +moment during the execution of C when arrow A is +pointing to C<$A[$i]> and arrow B is pointing to C<$B[$j]>. When this +happens, C will call the C callback +function and then it will advance both arrows. + +Otherwise, one of the arrows is pointing to an element of its sequence +that is not part of the LCS. C will advance that +arrow and will call the C or the C callback, +depending on which arrow it advanced. If both arrows point to +elements that are not part of the LCS, then C will +advance one of them and call the appropriate callback, but it is not +specified which it will call. + +The arguments to C are the two sequences to +traverse, and a callback which specifies the callback functions, like +this: + + traverse_sequences( \@seq1, \@seq2, + { MATCH => $callback_1, + DISCARD_A => $callback_2, + DISCARD_B => $callback_3, + } ); + +Callbacks are invoked with at least the indices of the two arrows as +their arguments. They are not expected to return any values. If a +callback is omitted from the table, it is not called. + +If arrow A reaches the end of its sequence, before arrow B does, +C will call the C callback when it +advances arrow B, if there is such a function; if not it will call +C instead. Similarly if arrow B finishes first. +C returns when both arrows are at the ends of +their respective sequences. It returns true on success and false on +failure. At present there is no way to fail. + +C may be passed an optional fourth parameter; this +is a CODE reference to a key generation function. See L. + +Additional parameters, if any, will be passed to the key generation +function. + +=head1 KEY GENERATION FUNCTIONS + +C, C, and C accept an optional last parameter. +This is a CODE reference to a key generating (hashing) function that should +return a string that uniquely identifies a given element. +It should be the case that if two elements are to be considered equal, +their keys should be the same (and the other way around). +If no key generation function is provided, the key will be the +element as a string. + +By default, comparisons will use "eq" and elements will be turned into keys +using the default stringizing operator '""'. + +Where this is important is when you're comparing something other than +strings. If it is the case that you have multiple different objects +that should be considered to be equal, you should supply a key +generation function. Otherwise, you have to make sure that your arrays +contain unique references. + +For instance, consider this example: + + package Person; + + sub new + { + my $package = shift; + return bless { name => '', ssn => '', @_ }, $package; + } + + sub clone + { + my $old = shift; + my $new = bless { %$old }, ref($old); + } + + sub hash + { + return shift()->{'ssn'}; + } + + my $person1 = Person->new( name => 'Joe', ssn => '123-45-6789' ); + my $person2 = Person->new( name => 'Mary', ssn => '123-47-0000' ); + my $person3 = Person->new( name => 'Pete', ssn => '999-45-2222' ); + my $person4 = Person->new( name => 'Peggy', ssn => '123-45-9999' ); + my $person5 = Person->new( name => 'Frank', ssn => '000-45-9999' ); + +If you did this: + + my $array1 = [ $person1, $person2, $person4 ]; + my $array2 = [ $person1, $person3, $person4, $person5 ]; + Algorithm::Diff::diff( $array1, $array2 ); + +everything would work out OK (each of the objects would be converted +into a string like "Person=HASH(0x82425b0)" for comparison). + +But if you did this: + + my $array1 = [ $person1, $person2, $person4 ]; + my $array2 = [ $person1, $person3, $person4->clone(), $person5 ]; + Algorithm::Diff::diff( $array1, $array2 ); + +$person4 and $person4->clone() (which have the same name and SSN) +would be seen as different objects. If you wanted them to be considered +equivalent, you would have to pass in a key generation function: + + my $array1 = [ $person1, $person2, $person4 ]; + my $array2 = [ $person1, $person3, $person4->clone(), $person5 ]; + Algorithm::Diff::diff( $array1, $array2, \&Person::hash ); + +This would use the 'ssn' field in each Person as a comparison key, and +so would consider $person4 and $person4->clone() as equal. + +You may also pass additional parameters to the key generation function +if you wish. + +=head1 AUTHOR + +This version by Ned Konz, perl@bike-nomad.com + +=head1 CREDITS + +Versions through 0.59 (and much of this documentation) were written by: + +Mark-Jason Dominus, mjd-perl-diff@plover.com + +This version borrows the documentation and names of the routines +from Mark-Jason's, but has all new code in Diff.pm. + +This code was adapted from the Smalltalk code of +Mario Wolczko , which is available at +ftp://st.cs.uiuc.edu/pub/Smalltalk/MANCHESTER/manchester/4.0/diff.st + +The algorithm is that described in +I, +CACM, vol.20, no.5, pp.350-353, May 1977, with a few +minor improvements to improve the speed. + +=cut + +# Create a hash that maps each element of $aCollection to the set of positions +# it occupies in $aCollection, restricted to the elements within the range of +# indexes specified by $start and $end. +# The fourth parameter is a subroutine reference that will be called to +# generate a string to use as a key. +# Additional parameters, if any, will be passed to this subroutine. +# +# my $hashRef = _withPositionsOfInInterval( \@array, $start, $end, $keyGen ); + +sub _withPositionsOfInInterval +{ + my $aCollection = shift; # array ref + my $start = shift; + my $end = shift; + my $keyGen = shift; + my %d; + my $index; + for ( $index = $start; $index <= $end; $index++ ) + { + my $element = $aCollection->[ $index ]; + my $key = &$keyGen( $element, @_ ); + if ( exists( $d{ $key } ) ) + { + push( @{ $d{ $key } }, $index ); + } + else + { + $d{ $key } = [ $index ]; + } + } + return wantarray ? %d: \%d; +} + +# Find the place at which aValue would normally be inserted into the array. If +# that place is already occupied by aValue, do nothing, and return undef. If +# the place does not exist (i.e., it is off the end of the array), add it to +# the end, otherwise replace the element at that point with aValue. +# It is assumed that the array's values are numeric. +# This is where the bulk (75%) of the time is spent in this module, so try to +# make it fast! + +sub _replaceNextLargerWith +{ + my ( $array, $aValue, $high ) = @_; + $high ||= $#$array; + + # off the end? + if ( $high == -1 || $aValue > $array->[ -1 ] ) + { + push( @$array, $aValue ); + return $high + 1; + } + + # binary search for insertion point... + my $low = 0; + my $index; + my $found; + while ( $low <= $high ) + { + $index = ( $high + $low ) / 2; +# $index = int(( $high + $low ) / 2); # without 'use integer' + $found = $array->[ $index ]; + + if ( $aValue == $found ) + { + return undef; + } + elsif ( $aValue > $found ) + { + $low = $index + 1; + } + else + { + $high = $index - 1; + } + } + + # now insertion point is in $low. + $array->[ $low ] = $aValue; # overwrite next larger + return $low; +} + +# This method computes the longest common subsequence in $a and $b. + +# Result is array or ref, whose contents is such that +# $a->[ $i ] = $b->[ $result[ $i ] ] +# foreach $i in ( 0..scalar( @result ) if $result[ $i ] is defined. + +# An additional argument may be passed; this is a hash or key generating +# function that should return a string that uniquely identifies the given +# element. It should be the case that if the key is the same, the elements +# will compare the same. If this parameter is undef or missing, the key +# will be the element as a string. + +# By default, comparisons will use "eq" and elements will be turned into keys +# using the default stringizing operator '""'. + +# Additional parameters, if any, will be passed to the key generation routine. + +sub _longestCommonSubsequence +{ + my $a = shift; # array ref + my $b = shift; # array ref + my $keyGen = shift; # code ref + my $compare; # code ref + + # set up code refs + # Note that these are optimized. + if ( !defined( $keyGen ) ) # optimize for strings + { + $keyGen = sub { $_[0] }; + $compare = sub { my ($a, $b) = @_; $a eq $b }; + } + else + { + $compare = sub { + my $a = shift; my $b = shift; + &$keyGen( $a, @_ ) eq &$keyGen( $b, @_ ) + }; + } + + my ($aStart, $aFinish, $bStart, $bFinish, $matchVector) = (0, $#$a, 0, $#$b, []); + + # First we prune off any common elements at the beginning + while ( $aStart <= $aFinish + and $bStart <= $bFinish + and &$compare( $a->[ $aStart ], $b->[ $bStart ], @_ ) ) + { + $matchVector->[ $aStart++ ] = $bStart++; + } + + # now the end + while ( $aStart <= $aFinish + and $bStart <= $bFinish + and &$compare( $a->[ $aFinish ], $b->[ $bFinish ], @_ ) ) + { + $matchVector->[ $aFinish-- ] = $bFinish--; + } + + # Now compute the equivalence classes of positions of elements + my $bMatches = _withPositionsOfInInterval( $b, $bStart, $bFinish, $keyGen, @_ ); + my $thresh = []; + my $links = []; + + my ( $i, $ai, $j, $k ); + for ( $i = $aStart; $i <= $aFinish; $i++ ) + { + $ai = &$keyGen( $a->[ $i ] ); + if ( exists( $bMatches->{ $ai } ) ) + { + $k = 0; + for $j ( reverse( @{ $bMatches->{ $ai } } ) ) + { + # optimization: most of the time this will be true + if ( $k + and $thresh->[ $k ] > $j + and $thresh->[ $k - 1 ] < $j ) + { + $thresh->[ $k ] = $j; + } + else + { + $k = _replaceNextLargerWith( $thresh, $j, $k ); + } + + # oddly, it's faster to always test this (CPU cache?). + if ( defined( $k ) ) + { + $links->[ $k ] = + [ ( $k ? $links->[ $k - 1 ] : undef ), $i, $j ]; + } + } + } + } + + if ( @$thresh ) + { + for ( my $link = $links->[ $#$thresh ]; $link; $link = $link->[ 0 ] ) + { + $matchVector->[ $link->[ 1 ] ] = $link->[ 2 ]; + } + } + + return wantarray ? @$matchVector : $matchVector; +} + +sub traverse_sequences +{ + my $a = shift; # array ref + my $b = shift; # array ref + my $callbacks = shift || { }; + my $keyGen = shift; + my $matchCallback = $callbacks->{'MATCH'} || sub { }; + my $discardACallback = $callbacks->{'DISCARD_A'} || sub { }; + my $discardBCallback = $callbacks->{'DISCARD_B'} || sub { }; + my $matchVector = _longestCommonSubsequence( $a, $b, $keyGen, @_ ); + # Process all the lines in match vector + my $lastA = $#$a; + my $lastB = $#$b; + my $bi = 0; + my $ai; + for ( $ai = 0; $ai <= $#$matchVector; $ai++ ) + { + my $bLine = $matchVector->[ $ai ]; + if ( defined( $bLine ) ) + { + &$discardBCallback( $ai, $bi++, @_ ) while $bi < $bLine; + &$matchCallback( $ai, $bi++, @_ ); + } + else + { + &$discardACallback( $ai, $bi, @_ ); + } + } + + &$discardACallback( $ai++, $bi, @_ ) while ( $ai <= $lastA ); + &$discardBCallback( $ai, $bi++, @_ ) while ( $bi <= $lastB ); + return 1; +} + +sub LCS +{ + my $a = shift; # array ref + my $matchVector = _longestCommonSubsequence( $a, @_ ); + my @retval; + my $i; + for ( $i = 0; $i <= $#$matchVector; $i++ ) + { + if ( defined( $matchVector->[ $i ] ) ) + { + push( @retval, $a->[ $i ] ); + } + } + return wantarray ? @retval : \@retval; +} + +sub diff +{ + my $a = shift; # array ref + my $b = shift; # array ref + my $retval = []; + my $hunk = []; + my $discard = sub { push( @$hunk, [ '-', $_[ 0 ], $a->[ $_[ 0 ] ] ] ) }; + my $add = sub { push( @$hunk, [ '+', $_[ 1 ], $b->[ $_[ 1 ] ] ] ) }; + my $match = sub { push( @$retval, $hunk ) if scalar(@$hunk); $hunk = [] }; + traverse_sequences( $a, $b, + { MATCH => $match, DISCARD_A => $discard, DISCARD_B => $add }, + @_ ); + &$match(); + return wantarray ? @$retval : $retval; +} + +1; diff -r 000000000000 -r a2f0a2c135cf Cassandra/CassHash.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Cassandra/CassHash.pm Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,161 @@ +#this perl module for using Cassandra DB on YukiWiki +package Cassandra::CassHash; + +use strict; +use warnings; + +use lib './Cassandra/lib'; +use Cassandra::Cassandra; +use Cassandra::Constants; +use Cassandra::Types; + +use Thrift; +use Thrift::BinaryProtocol; +use Thrift::Socket; +use Thrift::BufferedTransport; + + +use Data::Dumper; + +sub TIEHASH +{ + my ($_pkg,$_host,$_port,$_ksp,$_cf,$_row) = @_; + + my $self = { + _socket => undef, + _transport => undef, + _protocol => undef, + _client => undef, + _keyspace => undef, + _columnfamily => undef, + _row => undef, + _column_list => undef + }; + + $self->{_socket} = new Thrift::Socket($_host,$_port); + $self->{_transport} = new Thrift::BufferedTransport($self->{_socket},1024,1024); + $self->{_protocol} = new Thrift::BinaryProtocol($self->{_transport}); + $self->{_client} = new Cassandra::CassandraClient($self->{_protocol}); + $self->{_keyspace} = $_ksp; + $self->{_columnfamily} = $_cf; + $self->{_row} = $_row; + + $self->{_transport}->open(); + + return bless $self,$_pkg; +} + +sub FETCH +{ + my $self = shift; + my $column = shift; + my $client = $self->{_client}; + my $column_path = new Cassandra::ColumnPath(); + $column_path->{column_family} = $self->{_columnfamily}; + $column_path->{super_column} = undef; + $column_path->{column} = $column; + + my $value; + eval{ + $value = $client->get($self->{_keyspace},$self->{_row},$column_path,Cassandra::ConsistencyLevel::ONE); + }; + if($@){ + return undef; + } + + return $value->{column}->{value}; +} + +sub EXIST +{ + my $self = shift; + my $column = shift; + my $client = $self->{_client}; + my $column_path = new Cassandra::ColumnPath(); + $column_path->{column_family} = $self->{_columnfamily}; + $column_path->{super_column} = undef; + $column_path->{column} = $column; + + my $value; + eval{ + $value = $client->get($self->{_keyspace},$self->{_row},$column_path,Cassandra::ConsistencyLevel::ONE); + }; + if($@){ + return 0; + } + + return 1; +} + +sub STORE +{ + my ($_self,$_column,$_value) = @_; + + my $column_path = new Cassandra::ColumnPath(); + $column_path->{column_family} = $_self->{_columnfamily}; + $column_path->{super_column} = undef; + $column_path->{column} = $_column; + + my $client = $_self->{_client}; + + $client->insert($_self->{_keyspace},$_self->{_row},$column_path,$_value,time,Cassandra::ConsistencyLevel::ONE); + + return $_value; +} + +sub DELETE +{ + my ($_self,$_column) = @_; + my $client = $_self->{_client}; + + my $column_path = new Cassandra::ColumnPath(); + $column_path->{column_family} = $_self->{_columnfamily}; + $column_path->{super_column} = undef; + $column_path->{column} = $_column; + + $client->remove($_self->{_keyspace},$_self->{_row},$column_path,time,Cassandra::ConsistencyLevel::ONE); + + return undef; +} + +sub FIRSTKEY +{ + my ($_self) = @_; + + my $client = $_self->{_client}; + + my $column_parent = new Cassandra::ColumnParent(); + $column_parent->{column_family} = $_self->{_columnfamily}; + $column_parent->{super_column} = undef; + + my $slice_range = new Cassandra::SliceRange(); + $slice_range->{start} = ""; + $slice_range->{finish} = ""; + + my $predicate = new Cassandra::SlicePredicate(); + my @list = $predicate->{column_names}; + $predicate->{slice_range} = $slice_range; + + my @result = $client->get_slice($_self->{_keyspace},$_self->{_row},$column_parent,$predicate,Cassandra::ConsistencyLevel::ONE); + @{$_self->{_column_list}} = @{$result[0]}; + + my $first_column = shift @{$_self->{_column_list}}; + + return $first_column->{column}->{name}; +} + +sub NEXTKEY +{ + my $_self = shift; + my $next_item = shift @{$_self->{_column_list}}; + return $next_item->{column}->{name}; +} + +sub DESTROY +{ + my $self = shift; + $self->{_transport}->close(); + return 1; +} + +1; diff -r 000000000000 -r a2f0a2c135cf Cassandra/lib/Cassandra/Cassandra.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Cassandra/lib/Cassandra/Cassandra.pm Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,6014 @@ +# +# Autogenerated by Thrift +# +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING +# +require 5.6.0; +use strict; +use warnings; +use Thrift; + +use Cassandra::Types; + +# HELPER FUNCTIONS AND STRUCTURES + +package Cassandra::Cassandra_login_args; +use base qw(Class::Accessor); +Cassandra::Cassandra_login_args->mk_accessors( qw( keyspace auth_request ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{keyspace} = undef; + $self->{auth_request} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{keyspace}) { + $self->{keyspace} = $vals->{keyspace}; + } + if (defined $vals->{auth_request}) { + $self->{auth_request} = $vals->{auth_request}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_login_args'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{keyspace}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRUCT) { + $self->{auth_request} = new Cassandra::AuthenticationRequest(); + $xfer += $self->{auth_request}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_login_args'); + if (defined $self->{keyspace}) { + $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1); + $xfer += $output->writeString($self->{keyspace}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{auth_request}) { + $xfer += $output->writeFieldBegin('auth_request', TType::STRUCT, 2); + $xfer += $self->{auth_request}->write($output); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_login_result; +use base qw(Class::Accessor); +Cassandra::Cassandra_login_result->mk_accessors( qw( ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{authnx} = undef; + $self->{authzx} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{authnx}) { + $self->{authnx} = $vals->{authnx}; + } + if (defined $vals->{authzx}) { + $self->{authzx} = $vals->{authzx}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_login_result'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRUCT) { + $self->{authnx} = new Cassandra::AuthenticationException(); + $xfer += $self->{authnx}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRUCT) { + $self->{authzx} = new Cassandra::AuthorizationException(); + $xfer += $self->{authzx}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_login_result'); + if (defined $self->{authnx}) { + $xfer += $output->writeFieldBegin('authnx', TType::STRUCT, 1); + $xfer += $self->{authnx}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{authzx}) { + $xfer += $output->writeFieldBegin('authzx', TType::STRUCT, 2); + $xfer += $self->{authzx}->write($output); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_get_args; +use base qw(Class::Accessor); +Cassandra::Cassandra_get_args->mk_accessors( qw( keyspace key column_path consistency_level ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{keyspace} = undef; + $self->{key} = undef; + $self->{column_path} = undef; + $self->{consistency_level} = 1; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{keyspace}) { + $self->{keyspace} = $vals->{keyspace}; + } + if (defined $vals->{key}) { + $self->{key} = $vals->{key}; + } + if (defined $vals->{column_path}) { + $self->{column_path} = $vals->{column_path}; + } + if (defined $vals->{consistency_level}) { + $self->{consistency_level} = $vals->{consistency_level}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_get_args'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{keyspace}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{key}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{column_path} = new Cassandra::ColumnPath(); + $xfer += $self->{column_path}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^4$/ && do{ if ($ftype == TType::I32) { + $xfer += $input->readI32(\$self->{consistency_level}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_get_args'); + if (defined $self->{keyspace}) { + $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1); + $xfer += $output->writeString($self->{keyspace}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{key}) { + $xfer += $output->writeFieldBegin('key', TType::STRING, 2); + $xfer += $output->writeString($self->{key}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{column_path}) { + $xfer += $output->writeFieldBegin('column_path', TType::STRUCT, 3); + $xfer += $self->{column_path}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{consistency_level}) { + $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 4); + $xfer += $output->writeI32($self->{consistency_level}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_get_result; +use base qw(Class::Accessor); +Cassandra::Cassandra_get_result->mk_accessors( qw( success ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{success} = undef; + $self->{ire} = undef; + $self->{nfe} = undef; + $self->{ue} = undef; + $self->{te} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{success}) { + $self->{success} = $vals->{success}; + } + if (defined $vals->{ire}) { + $self->{ire} = $vals->{ire}; + } + if (defined $vals->{nfe}) { + $self->{nfe} = $vals->{nfe}; + } + if (defined $vals->{ue}) { + $self->{ue} = $vals->{ue}; + } + if (defined $vals->{te}) { + $self->{te} = $vals->{te}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_get_result'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^0$/ && do{ if ($ftype == TType::STRUCT) { + $self->{success} = new Cassandra::ColumnOrSuperColumn(); + $xfer += $self->{success}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^1$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ire} = new Cassandra::InvalidRequestException(); + $xfer += $self->{ire}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRUCT) { + $self->{nfe} = new Cassandra::NotFoundException(); + $xfer += $self->{nfe}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ue} = new Cassandra::UnavailableException(); + $xfer += $self->{ue}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^4$/ && do{ if ($ftype == TType::STRUCT) { + $self->{te} = new Cassandra::TimedOutException(); + $xfer += $self->{te}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_get_result'); + if (defined $self->{success}) { + $xfer += $output->writeFieldBegin('success', TType::STRUCT, 0); + $xfer += $self->{success}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{ire}) { + $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1); + $xfer += $self->{ire}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{nfe}) { + $xfer += $output->writeFieldBegin('nfe', TType::STRUCT, 2); + $xfer += $self->{nfe}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{ue}) { + $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 3); + $xfer += $self->{ue}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{te}) { + $xfer += $output->writeFieldBegin('te', TType::STRUCT, 4); + $xfer += $self->{te}->write($output); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_get_slice_args; +use base qw(Class::Accessor); +Cassandra::Cassandra_get_slice_args->mk_accessors( qw( keyspace key column_parent predicate consistency_level ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{keyspace} = undef; + $self->{key} = undef; + $self->{column_parent} = undef; + $self->{predicate} = undef; + $self->{consistency_level} = 1; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{keyspace}) { + $self->{keyspace} = $vals->{keyspace}; + } + if (defined $vals->{key}) { + $self->{key} = $vals->{key}; + } + if (defined $vals->{column_parent}) { + $self->{column_parent} = $vals->{column_parent}; + } + if (defined $vals->{predicate}) { + $self->{predicate} = $vals->{predicate}; + } + if (defined $vals->{consistency_level}) { + $self->{consistency_level} = $vals->{consistency_level}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_get_slice_args'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{keyspace}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{key}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{column_parent} = new Cassandra::ColumnParent(); + $xfer += $self->{column_parent}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^4$/ && do{ if ($ftype == TType::STRUCT) { + $self->{predicate} = new Cassandra::SlicePredicate(); + $xfer += $self->{predicate}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^5$/ && do{ if ($ftype == TType::I32) { + $xfer += $input->readI32(\$self->{consistency_level}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_get_slice_args'); + if (defined $self->{keyspace}) { + $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1); + $xfer += $output->writeString($self->{keyspace}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{key}) { + $xfer += $output->writeFieldBegin('key', TType::STRING, 2); + $xfer += $output->writeString($self->{key}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{column_parent}) { + $xfer += $output->writeFieldBegin('column_parent', TType::STRUCT, 3); + $xfer += $self->{column_parent}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{predicate}) { + $xfer += $output->writeFieldBegin('predicate', TType::STRUCT, 4); + $xfer += $self->{predicate}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{consistency_level}) { + $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 5); + $xfer += $output->writeI32($self->{consistency_level}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_get_slice_result; +use base qw(Class::Accessor); +Cassandra::Cassandra_get_slice_result->mk_accessors( qw( success ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{success} = undef; + $self->{ire} = undef; + $self->{ue} = undef; + $self->{te} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{success}) { + $self->{success} = $vals->{success}; + } + if (defined $vals->{ire}) { + $self->{ire} = $vals->{ire}; + } + if (defined $vals->{ue}) { + $self->{ue} = $vals->{ue}; + } + if (defined $vals->{te}) { + $self->{te} = $vals->{te}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_get_slice_result'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^0$/ && do{ if ($ftype == TType::LIST) { + { + my $_size37 = 0; + $self->{success} = []; + my $_etype40 = 0; + $xfer += $input->readListBegin(\$_etype40, \$_size37); + for (my $_i41 = 0; $_i41 < $_size37; ++$_i41) + { + my $elem42 = undef; + $elem42 = new Cassandra::ColumnOrSuperColumn(); + $xfer += $elem42->read($input); + push(@{$self->{success}},$elem42); + } + $xfer += $input->readListEnd(); + } + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^1$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ire} = new Cassandra::InvalidRequestException(); + $xfer += $self->{ire}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ue} = new Cassandra::UnavailableException(); + $xfer += $self->{ue}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{te} = new Cassandra::TimedOutException(); + $xfer += $self->{te}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_get_slice_result'); + if (defined $self->{success}) { + $xfer += $output->writeFieldBegin('success', TType::LIST, 0); + { + $output->writeListBegin(TType::STRUCT, scalar(@{$self->{success}})); + { + foreach my $iter43 (@{$self->{success}}) + { + $xfer += ${iter43}->write($output); + } + } + $output->writeListEnd(); + } + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{ire}) { + $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1); + $xfer += $self->{ire}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{ue}) { + $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 2); + $xfer += $self->{ue}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{te}) { + $xfer += $output->writeFieldBegin('te', TType::STRUCT, 3); + $xfer += $self->{te}->write($output); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_multiget_args; +use base qw(Class::Accessor); +Cassandra::Cassandra_multiget_args->mk_accessors( qw( keyspace keys column_path consistency_level ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{keyspace} = undef; + $self->{keys} = undef; + $self->{column_path} = undef; + $self->{consistency_level} = 1; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{keyspace}) { + $self->{keyspace} = $vals->{keyspace}; + } + if (defined $vals->{keys}) { + $self->{keys} = $vals->{keys}; + } + if (defined $vals->{column_path}) { + $self->{column_path} = $vals->{column_path}; + } + if (defined $vals->{consistency_level}) { + $self->{consistency_level} = $vals->{consistency_level}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_multiget_args'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{keyspace}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::LIST) { + { + my $_size44 = 0; + $self->{keys} = []; + my $_etype47 = 0; + $xfer += $input->readListBegin(\$_etype47, \$_size44); + for (my $_i48 = 0; $_i48 < $_size44; ++$_i48) + { + my $elem49 = undef; + $xfer += $input->readString(\$elem49); + push(@{$self->{keys}},$elem49); + } + $xfer += $input->readListEnd(); + } + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{column_path} = new Cassandra::ColumnPath(); + $xfer += $self->{column_path}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^4$/ && do{ if ($ftype == TType::I32) { + $xfer += $input->readI32(\$self->{consistency_level}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_multiget_args'); + if (defined $self->{keyspace}) { + $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1); + $xfer += $output->writeString($self->{keyspace}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{keys}) { + $xfer += $output->writeFieldBegin('keys', TType::LIST, 2); + { + $output->writeListBegin(TType::STRING, scalar(@{$self->{keys}})); + { + foreach my $iter50 (@{$self->{keys}}) + { + $xfer += $output->writeString($iter50); + } + } + $output->writeListEnd(); + } + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{column_path}) { + $xfer += $output->writeFieldBegin('column_path', TType::STRUCT, 3); + $xfer += $self->{column_path}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{consistency_level}) { + $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 4); + $xfer += $output->writeI32($self->{consistency_level}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_multiget_result; +use base qw(Class::Accessor); +Cassandra::Cassandra_multiget_result->mk_accessors( qw( success ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{success} = undef; + $self->{ire} = undef; + $self->{ue} = undef; + $self->{te} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{success}) { + $self->{success} = $vals->{success}; + } + if (defined $vals->{ire}) { + $self->{ire} = $vals->{ire}; + } + if (defined $vals->{ue}) { + $self->{ue} = $vals->{ue}; + } + if (defined $vals->{te}) { + $self->{te} = $vals->{te}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_multiget_result'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^0$/ && do{ if ($ftype == TType::MAP) { + { + my $_size51 = 0; + $self->{success} = {}; + my $_ktype52 = 0; + my $_vtype53 = 0; + $xfer += $input->readMapBegin(\$_ktype52, \$_vtype53, \$_size51); + for (my $_i55 = 0; $_i55 < $_size51; ++$_i55) + { + my $key56 = ''; + my $val57 = new Cassandra::ColumnOrSuperColumn(); + $xfer += $input->readString(\$key56); + $val57 = new Cassandra::ColumnOrSuperColumn(); + $xfer += $val57->read($input); + $self->{success}->{$key56} = $val57; + } + $xfer += $input->readMapEnd(); + } + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^1$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ire} = new Cassandra::InvalidRequestException(); + $xfer += $self->{ire}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ue} = new Cassandra::UnavailableException(); + $xfer += $self->{ue}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{te} = new Cassandra::TimedOutException(); + $xfer += $self->{te}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_multiget_result'); + if (defined $self->{success}) { + $xfer += $output->writeFieldBegin('success', TType::MAP, 0); + { + $output->writeMapBegin(TType::STRING, TType::STRUCT, scalar(keys %{$self->{success}})); + { + while( my ($kiter58,$viter59) = each %{$self->{success}}) + { + $xfer += $output->writeString($kiter58); + $xfer += ${viter59}->write($output); + } + } + $output->writeMapEnd(); + } + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{ire}) { + $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1); + $xfer += $self->{ire}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{ue}) { + $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 2); + $xfer += $self->{ue}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{te}) { + $xfer += $output->writeFieldBegin('te', TType::STRUCT, 3); + $xfer += $self->{te}->write($output); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_multiget_slice_args; +use base qw(Class::Accessor); +Cassandra::Cassandra_multiget_slice_args->mk_accessors( qw( keyspace keys column_parent predicate consistency_level ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{keyspace} = undef; + $self->{keys} = undef; + $self->{column_parent} = undef; + $self->{predicate} = undef; + $self->{consistency_level} = 1; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{keyspace}) { + $self->{keyspace} = $vals->{keyspace}; + } + if (defined $vals->{keys}) { + $self->{keys} = $vals->{keys}; + } + if (defined $vals->{column_parent}) { + $self->{column_parent} = $vals->{column_parent}; + } + if (defined $vals->{predicate}) { + $self->{predicate} = $vals->{predicate}; + } + if (defined $vals->{consistency_level}) { + $self->{consistency_level} = $vals->{consistency_level}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_multiget_slice_args'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{keyspace}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::LIST) { + { + my $_size60 = 0; + $self->{keys} = []; + my $_etype63 = 0; + $xfer += $input->readListBegin(\$_etype63, \$_size60); + for (my $_i64 = 0; $_i64 < $_size60; ++$_i64) + { + my $elem65 = undef; + $xfer += $input->readString(\$elem65); + push(@{$self->{keys}},$elem65); + } + $xfer += $input->readListEnd(); + } + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{column_parent} = new Cassandra::ColumnParent(); + $xfer += $self->{column_parent}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^4$/ && do{ if ($ftype == TType::STRUCT) { + $self->{predicate} = new Cassandra::SlicePredicate(); + $xfer += $self->{predicate}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^5$/ && do{ if ($ftype == TType::I32) { + $xfer += $input->readI32(\$self->{consistency_level}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_multiget_slice_args'); + if (defined $self->{keyspace}) { + $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1); + $xfer += $output->writeString($self->{keyspace}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{keys}) { + $xfer += $output->writeFieldBegin('keys', TType::LIST, 2); + { + $output->writeListBegin(TType::STRING, scalar(@{$self->{keys}})); + { + foreach my $iter66 (@{$self->{keys}}) + { + $xfer += $output->writeString($iter66); + } + } + $output->writeListEnd(); + } + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{column_parent}) { + $xfer += $output->writeFieldBegin('column_parent', TType::STRUCT, 3); + $xfer += $self->{column_parent}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{predicate}) { + $xfer += $output->writeFieldBegin('predicate', TType::STRUCT, 4); + $xfer += $self->{predicate}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{consistency_level}) { + $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 5); + $xfer += $output->writeI32($self->{consistency_level}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_multiget_slice_result; +use base qw(Class::Accessor); +Cassandra::Cassandra_multiget_slice_result->mk_accessors( qw( success ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{success} = undef; + $self->{ire} = undef; + $self->{ue} = undef; + $self->{te} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{success}) { + $self->{success} = $vals->{success}; + } + if (defined $vals->{ire}) { + $self->{ire} = $vals->{ire}; + } + if (defined $vals->{ue}) { + $self->{ue} = $vals->{ue}; + } + if (defined $vals->{te}) { + $self->{te} = $vals->{te}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_multiget_slice_result'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^0$/ && do{ if ($ftype == TType::MAP) { + { + my $_size67 = 0; + $self->{success} = {}; + my $_ktype68 = 0; + my $_vtype69 = 0; + $xfer += $input->readMapBegin(\$_ktype68, \$_vtype69, \$_size67); + for (my $_i71 = 0; $_i71 < $_size67; ++$_i71) + { + my $key72 = ''; + my $val73 = []; + $xfer += $input->readString(\$key72); + { + my $_size74 = 0; + $val73 = []; + my $_etype77 = 0; + $xfer += $input->readListBegin(\$_etype77, \$_size74); + for (my $_i78 = 0; $_i78 < $_size74; ++$_i78) + { + my $elem79 = undef; + $elem79 = new Cassandra::ColumnOrSuperColumn(); + $xfer += $elem79->read($input); + push(@{$val73},$elem79); + } + $xfer += $input->readListEnd(); + } + $self->{success}->{$key72} = $val73; + } + $xfer += $input->readMapEnd(); + } + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^1$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ire} = new Cassandra::InvalidRequestException(); + $xfer += $self->{ire}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ue} = new Cassandra::UnavailableException(); + $xfer += $self->{ue}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{te} = new Cassandra::TimedOutException(); + $xfer += $self->{te}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_multiget_slice_result'); + if (defined $self->{success}) { + $xfer += $output->writeFieldBegin('success', TType::MAP, 0); + { + $output->writeMapBegin(TType::STRING, TType::LIST, scalar(keys %{$self->{success}})); + { + while( my ($kiter80,$viter81) = each %{$self->{success}}) + { + $xfer += $output->writeString($kiter80); + { + $output->writeListBegin(TType::STRUCT, scalar(@{${viter81}})); + { + foreach my $iter82 (@{${viter81}}) + { + $xfer += ${iter82}->write($output); + } + } + $output->writeListEnd(); + } + } + } + $output->writeMapEnd(); + } + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{ire}) { + $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1); + $xfer += $self->{ire}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{ue}) { + $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 2); + $xfer += $self->{ue}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{te}) { + $xfer += $output->writeFieldBegin('te', TType::STRUCT, 3); + $xfer += $self->{te}->write($output); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_get_count_args; +use base qw(Class::Accessor); +Cassandra::Cassandra_get_count_args->mk_accessors( qw( keyspace key column_parent consistency_level ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{keyspace} = undef; + $self->{key} = undef; + $self->{column_parent} = undef; + $self->{consistency_level} = 1; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{keyspace}) { + $self->{keyspace} = $vals->{keyspace}; + } + if (defined $vals->{key}) { + $self->{key} = $vals->{key}; + } + if (defined $vals->{column_parent}) { + $self->{column_parent} = $vals->{column_parent}; + } + if (defined $vals->{consistency_level}) { + $self->{consistency_level} = $vals->{consistency_level}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_get_count_args'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{keyspace}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{key}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{column_parent} = new Cassandra::ColumnParent(); + $xfer += $self->{column_parent}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^4$/ && do{ if ($ftype == TType::I32) { + $xfer += $input->readI32(\$self->{consistency_level}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_get_count_args'); + if (defined $self->{keyspace}) { + $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1); + $xfer += $output->writeString($self->{keyspace}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{key}) { + $xfer += $output->writeFieldBegin('key', TType::STRING, 2); + $xfer += $output->writeString($self->{key}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{column_parent}) { + $xfer += $output->writeFieldBegin('column_parent', TType::STRUCT, 3); + $xfer += $self->{column_parent}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{consistency_level}) { + $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 4); + $xfer += $output->writeI32($self->{consistency_level}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_get_count_result; +use base qw(Class::Accessor); +Cassandra::Cassandra_get_count_result->mk_accessors( qw( success ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{success} = undef; + $self->{ire} = undef; + $self->{ue} = undef; + $self->{te} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{success}) { + $self->{success} = $vals->{success}; + } + if (defined $vals->{ire}) { + $self->{ire} = $vals->{ire}; + } + if (defined $vals->{ue}) { + $self->{ue} = $vals->{ue}; + } + if (defined $vals->{te}) { + $self->{te} = $vals->{te}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_get_count_result'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^0$/ && do{ if ($ftype == TType::I32) { + $xfer += $input->readI32(\$self->{success}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^1$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ire} = new Cassandra::InvalidRequestException(); + $xfer += $self->{ire}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ue} = new Cassandra::UnavailableException(); + $xfer += $self->{ue}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{te} = new Cassandra::TimedOutException(); + $xfer += $self->{te}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_get_count_result'); + if (defined $self->{success}) { + $xfer += $output->writeFieldBegin('success', TType::I32, 0); + $xfer += $output->writeI32($self->{success}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{ire}) { + $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1); + $xfer += $self->{ire}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{ue}) { + $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 2); + $xfer += $self->{ue}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{te}) { + $xfer += $output->writeFieldBegin('te', TType::STRUCT, 3); + $xfer += $self->{te}->write($output); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_get_range_slice_args; +use base qw(Class::Accessor); +Cassandra::Cassandra_get_range_slice_args->mk_accessors( qw( keyspace column_parent predicate start_key finish_key row_count consistency_level ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{keyspace} = undef; + $self->{column_parent} = undef; + $self->{predicate} = undef; + $self->{start_key} = ""; + $self->{finish_key} = ""; + $self->{row_count} = 100; + $self->{consistency_level} = 1; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{keyspace}) { + $self->{keyspace} = $vals->{keyspace}; + } + if (defined $vals->{column_parent}) { + $self->{column_parent} = $vals->{column_parent}; + } + if (defined $vals->{predicate}) { + $self->{predicate} = $vals->{predicate}; + } + if (defined $vals->{start_key}) { + $self->{start_key} = $vals->{start_key}; + } + if (defined $vals->{finish_key}) { + $self->{finish_key} = $vals->{finish_key}; + } + if (defined $vals->{row_count}) { + $self->{row_count} = $vals->{row_count}; + } + if (defined $vals->{consistency_level}) { + $self->{consistency_level} = $vals->{consistency_level}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_get_range_slice_args'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{keyspace}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRUCT) { + $self->{column_parent} = new Cassandra::ColumnParent(); + $xfer += $self->{column_parent}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{predicate} = new Cassandra::SlicePredicate(); + $xfer += $self->{predicate}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^4$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{start_key}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^5$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{finish_key}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^6$/ && do{ if ($ftype == TType::I32) { + $xfer += $input->readI32(\$self->{row_count}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^7$/ && do{ if ($ftype == TType::I32) { + $xfer += $input->readI32(\$self->{consistency_level}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_get_range_slice_args'); + if (defined $self->{keyspace}) { + $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1); + $xfer += $output->writeString($self->{keyspace}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{column_parent}) { + $xfer += $output->writeFieldBegin('column_parent', TType::STRUCT, 2); + $xfer += $self->{column_parent}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{predicate}) { + $xfer += $output->writeFieldBegin('predicate', TType::STRUCT, 3); + $xfer += $self->{predicate}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{start_key}) { + $xfer += $output->writeFieldBegin('start_key', TType::STRING, 4); + $xfer += $output->writeString($self->{start_key}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{finish_key}) { + $xfer += $output->writeFieldBegin('finish_key', TType::STRING, 5); + $xfer += $output->writeString($self->{finish_key}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{row_count}) { + $xfer += $output->writeFieldBegin('row_count', TType::I32, 6); + $xfer += $output->writeI32($self->{row_count}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{consistency_level}) { + $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 7); + $xfer += $output->writeI32($self->{consistency_level}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_get_range_slice_result; +use base qw(Class::Accessor); +Cassandra::Cassandra_get_range_slice_result->mk_accessors( qw( success ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{success} = undef; + $self->{ire} = undef; + $self->{ue} = undef; + $self->{te} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{success}) { + $self->{success} = $vals->{success}; + } + if (defined $vals->{ire}) { + $self->{ire} = $vals->{ire}; + } + if (defined $vals->{ue}) { + $self->{ue} = $vals->{ue}; + } + if (defined $vals->{te}) { + $self->{te} = $vals->{te}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_get_range_slice_result'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^0$/ && do{ if ($ftype == TType::LIST) { + { + my $_size83 = 0; + $self->{success} = []; + my $_etype86 = 0; + $xfer += $input->readListBegin(\$_etype86, \$_size83); + for (my $_i87 = 0; $_i87 < $_size83; ++$_i87) + { + my $elem88 = undef; + $elem88 = new Cassandra::KeySlice(); + $xfer += $elem88->read($input); + push(@{$self->{success}},$elem88); + } + $xfer += $input->readListEnd(); + } + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^1$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ire} = new Cassandra::InvalidRequestException(); + $xfer += $self->{ire}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ue} = new Cassandra::UnavailableException(); + $xfer += $self->{ue}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{te} = new Cassandra::TimedOutException(); + $xfer += $self->{te}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_get_range_slice_result'); + if (defined $self->{success}) { + $xfer += $output->writeFieldBegin('success', TType::LIST, 0); + { + $output->writeListBegin(TType::STRUCT, scalar(@{$self->{success}})); + { + foreach my $iter89 (@{$self->{success}}) + { + $xfer += ${iter89}->write($output); + } + } + $output->writeListEnd(); + } + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{ire}) { + $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1); + $xfer += $self->{ire}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{ue}) { + $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 2); + $xfer += $self->{ue}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{te}) { + $xfer += $output->writeFieldBegin('te', TType::STRUCT, 3); + $xfer += $self->{te}->write($output); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_get_range_slices_args; +use base qw(Class::Accessor); +Cassandra::Cassandra_get_range_slices_args->mk_accessors( qw( keyspace column_parent predicate range consistency_level ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{keyspace} = undef; + $self->{column_parent} = undef; + $self->{predicate} = undef; + $self->{range} = undef; + $self->{consistency_level} = 1; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{keyspace}) { + $self->{keyspace} = $vals->{keyspace}; + } + if (defined $vals->{column_parent}) { + $self->{column_parent} = $vals->{column_parent}; + } + if (defined $vals->{predicate}) { + $self->{predicate} = $vals->{predicate}; + } + if (defined $vals->{range}) { + $self->{range} = $vals->{range}; + } + if (defined $vals->{consistency_level}) { + $self->{consistency_level} = $vals->{consistency_level}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_get_range_slices_args'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{keyspace}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRUCT) { + $self->{column_parent} = new Cassandra::ColumnParent(); + $xfer += $self->{column_parent}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{predicate} = new Cassandra::SlicePredicate(); + $xfer += $self->{predicate}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^4$/ && do{ if ($ftype == TType::STRUCT) { + $self->{range} = new Cassandra::KeyRange(); + $xfer += $self->{range}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^5$/ && do{ if ($ftype == TType::I32) { + $xfer += $input->readI32(\$self->{consistency_level}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_get_range_slices_args'); + if (defined $self->{keyspace}) { + $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1); + $xfer += $output->writeString($self->{keyspace}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{column_parent}) { + $xfer += $output->writeFieldBegin('column_parent', TType::STRUCT, 2); + $xfer += $self->{column_parent}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{predicate}) { + $xfer += $output->writeFieldBegin('predicate', TType::STRUCT, 3); + $xfer += $self->{predicate}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{range}) { + $xfer += $output->writeFieldBegin('range', TType::STRUCT, 4); + $xfer += $self->{range}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{consistency_level}) { + $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 5); + $xfer += $output->writeI32($self->{consistency_level}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_get_range_slices_result; +use base qw(Class::Accessor); +Cassandra::Cassandra_get_range_slices_result->mk_accessors( qw( success ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{success} = undef; + $self->{ire} = undef; + $self->{ue} = undef; + $self->{te} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{success}) { + $self->{success} = $vals->{success}; + } + if (defined $vals->{ire}) { + $self->{ire} = $vals->{ire}; + } + if (defined $vals->{ue}) { + $self->{ue} = $vals->{ue}; + } + if (defined $vals->{te}) { + $self->{te} = $vals->{te}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_get_range_slices_result'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^0$/ && do{ if ($ftype == TType::LIST) { + { + my $_size90 = 0; + $self->{success} = []; + my $_etype93 = 0; + $xfer += $input->readListBegin(\$_etype93, \$_size90); + for (my $_i94 = 0; $_i94 < $_size90; ++$_i94) + { + my $elem95 = undef; + $elem95 = new Cassandra::KeySlice(); + $xfer += $elem95->read($input); + push(@{$self->{success}},$elem95); + } + $xfer += $input->readListEnd(); + } + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^1$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ire} = new Cassandra::InvalidRequestException(); + $xfer += $self->{ire}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ue} = new Cassandra::UnavailableException(); + $xfer += $self->{ue}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{te} = new Cassandra::TimedOutException(); + $xfer += $self->{te}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_get_range_slices_result'); + if (defined $self->{success}) { + $xfer += $output->writeFieldBegin('success', TType::LIST, 0); + { + $output->writeListBegin(TType::STRUCT, scalar(@{$self->{success}})); + { + foreach my $iter96 (@{$self->{success}}) + { + $xfer += ${iter96}->write($output); + } + } + $output->writeListEnd(); + } + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{ire}) { + $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1); + $xfer += $self->{ire}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{ue}) { + $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 2); + $xfer += $self->{ue}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{te}) { + $xfer += $output->writeFieldBegin('te', TType::STRUCT, 3); + $xfer += $self->{te}->write($output); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_insert_args; +use base qw(Class::Accessor); +Cassandra::Cassandra_insert_args->mk_accessors( qw( keyspace key column_path value timestamp consistency_level ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{keyspace} = undef; + $self->{key} = undef; + $self->{column_path} = undef; + $self->{value} = undef; + $self->{timestamp} = undef; + $self->{consistency_level} = 1; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{keyspace}) { + $self->{keyspace} = $vals->{keyspace}; + } + if (defined $vals->{key}) { + $self->{key} = $vals->{key}; + } + if (defined $vals->{column_path}) { + $self->{column_path} = $vals->{column_path}; + } + if (defined $vals->{value}) { + $self->{value} = $vals->{value}; + } + if (defined $vals->{timestamp}) { + $self->{timestamp} = $vals->{timestamp}; + } + if (defined $vals->{consistency_level}) { + $self->{consistency_level} = $vals->{consistency_level}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_insert_args'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{keyspace}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{key}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{column_path} = new Cassandra::ColumnPath(); + $xfer += $self->{column_path}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^4$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{value}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^5$/ && do{ if ($ftype == TType::I64) { + $xfer += $input->readI64(\$self->{timestamp}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^6$/ && do{ if ($ftype == TType::I32) { + $xfer += $input->readI32(\$self->{consistency_level}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_insert_args'); + if (defined $self->{keyspace}) { + $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1); + $xfer += $output->writeString($self->{keyspace}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{key}) { + $xfer += $output->writeFieldBegin('key', TType::STRING, 2); + $xfer += $output->writeString($self->{key}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{column_path}) { + $xfer += $output->writeFieldBegin('column_path', TType::STRUCT, 3); + $xfer += $self->{column_path}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{value}) { + $xfer += $output->writeFieldBegin('value', TType::STRING, 4); + $xfer += $output->writeString($self->{value}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{timestamp}) { + $xfer += $output->writeFieldBegin('timestamp', TType::I64, 5); + $xfer += $output->writeI64($self->{timestamp}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{consistency_level}) { + $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 6); + $xfer += $output->writeI32($self->{consistency_level}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_insert_result; +use base qw(Class::Accessor); +Cassandra::Cassandra_insert_result->mk_accessors( qw( ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{ire} = undef; + $self->{ue} = undef; + $self->{te} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{ire}) { + $self->{ire} = $vals->{ire}; + } + if (defined $vals->{ue}) { + $self->{ue} = $vals->{ue}; + } + if (defined $vals->{te}) { + $self->{te} = $vals->{te}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_insert_result'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ire} = new Cassandra::InvalidRequestException(); + $xfer += $self->{ire}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ue} = new Cassandra::UnavailableException(); + $xfer += $self->{ue}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{te} = new Cassandra::TimedOutException(); + $xfer += $self->{te}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_insert_result'); + if (defined $self->{ire}) { + $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1); + $xfer += $self->{ire}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{ue}) { + $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 2); + $xfer += $self->{ue}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{te}) { + $xfer += $output->writeFieldBegin('te', TType::STRUCT, 3); + $xfer += $self->{te}->write($output); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_batch_insert_args; +use base qw(Class::Accessor); +Cassandra::Cassandra_batch_insert_args->mk_accessors( qw( keyspace key cfmap consistency_level ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{keyspace} = undef; + $self->{key} = undef; + $self->{cfmap} = undef; + $self->{consistency_level} = 1; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{keyspace}) { + $self->{keyspace} = $vals->{keyspace}; + } + if (defined $vals->{key}) { + $self->{key} = $vals->{key}; + } + if (defined $vals->{cfmap}) { + $self->{cfmap} = $vals->{cfmap}; + } + if (defined $vals->{consistency_level}) { + $self->{consistency_level} = $vals->{consistency_level}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_batch_insert_args'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{keyspace}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{key}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::MAP) { + { + my $_size97 = 0; + $self->{cfmap} = {}; + my $_ktype98 = 0; + my $_vtype99 = 0; + $xfer += $input->readMapBegin(\$_ktype98, \$_vtype99, \$_size97); + for (my $_i101 = 0; $_i101 < $_size97; ++$_i101) + { + my $key102 = ''; + my $val103 = []; + $xfer += $input->readString(\$key102); + { + my $_size104 = 0; + $val103 = []; + my $_etype107 = 0; + $xfer += $input->readListBegin(\$_etype107, \$_size104); + for (my $_i108 = 0; $_i108 < $_size104; ++$_i108) + { + my $elem109 = undef; + $elem109 = new Cassandra::ColumnOrSuperColumn(); + $xfer += $elem109->read($input); + push(@{$val103},$elem109); + } + $xfer += $input->readListEnd(); + } + $self->{cfmap}->{$key102} = $val103; + } + $xfer += $input->readMapEnd(); + } + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^4$/ && do{ if ($ftype == TType::I32) { + $xfer += $input->readI32(\$self->{consistency_level}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_batch_insert_args'); + if (defined $self->{keyspace}) { + $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1); + $xfer += $output->writeString($self->{keyspace}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{key}) { + $xfer += $output->writeFieldBegin('key', TType::STRING, 2); + $xfer += $output->writeString($self->{key}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{cfmap}) { + $xfer += $output->writeFieldBegin('cfmap', TType::MAP, 3); + { + $output->writeMapBegin(TType::STRING, TType::LIST, scalar(keys %{$self->{cfmap}})); + { + while( my ($kiter110,$viter111) = each %{$self->{cfmap}}) + { + $xfer += $output->writeString($kiter110); + { + $output->writeListBegin(TType::STRUCT, scalar(@{${viter111}})); + { + foreach my $iter112 (@{${viter111}}) + { + $xfer += ${iter112}->write($output); + } + } + $output->writeListEnd(); + } + } + } + $output->writeMapEnd(); + } + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{consistency_level}) { + $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 4); + $xfer += $output->writeI32($self->{consistency_level}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_batch_insert_result; +use base qw(Class::Accessor); +Cassandra::Cassandra_batch_insert_result->mk_accessors( qw( ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{ire} = undef; + $self->{ue} = undef; + $self->{te} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{ire}) { + $self->{ire} = $vals->{ire}; + } + if (defined $vals->{ue}) { + $self->{ue} = $vals->{ue}; + } + if (defined $vals->{te}) { + $self->{te} = $vals->{te}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_batch_insert_result'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ire} = new Cassandra::InvalidRequestException(); + $xfer += $self->{ire}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ue} = new Cassandra::UnavailableException(); + $xfer += $self->{ue}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{te} = new Cassandra::TimedOutException(); + $xfer += $self->{te}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_batch_insert_result'); + if (defined $self->{ire}) { + $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1); + $xfer += $self->{ire}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{ue}) { + $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 2); + $xfer += $self->{ue}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{te}) { + $xfer += $output->writeFieldBegin('te', TType::STRUCT, 3); + $xfer += $self->{te}->write($output); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_remove_args; +use base qw(Class::Accessor); +Cassandra::Cassandra_remove_args->mk_accessors( qw( keyspace key column_path timestamp consistency_level ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{keyspace} = undef; + $self->{key} = undef; + $self->{column_path} = undef; + $self->{timestamp} = undef; + $self->{consistency_level} = 1; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{keyspace}) { + $self->{keyspace} = $vals->{keyspace}; + } + if (defined $vals->{key}) { + $self->{key} = $vals->{key}; + } + if (defined $vals->{column_path}) { + $self->{column_path} = $vals->{column_path}; + } + if (defined $vals->{timestamp}) { + $self->{timestamp} = $vals->{timestamp}; + } + if (defined $vals->{consistency_level}) { + $self->{consistency_level} = $vals->{consistency_level}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_remove_args'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{keyspace}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{key}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{column_path} = new Cassandra::ColumnPath(); + $xfer += $self->{column_path}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^4$/ && do{ if ($ftype == TType::I64) { + $xfer += $input->readI64(\$self->{timestamp}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^5$/ && do{ if ($ftype == TType::I32) { + $xfer += $input->readI32(\$self->{consistency_level}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_remove_args'); + if (defined $self->{keyspace}) { + $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1); + $xfer += $output->writeString($self->{keyspace}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{key}) { + $xfer += $output->writeFieldBegin('key', TType::STRING, 2); + $xfer += $output->writeString($self->{key}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{column_path}) { + $xfer += $output->writeFieldBegin('column_path', TType::STRUCT, 3); + $xfer += $self->{column_path}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{timestamp}) { + $xfer += $output->writeFieldBegin('timestamp', TType::I64, 4); + $xfer += $output->writeI64($self->{timestamp}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{consistency_level}) { + $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 5); + $xfer += $output->writeI32($self->{consistency_level}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_remove_result; +use base qw(Class::Accessor); +Cassandra::Cassandra_remove_result->mk_accessors( qw( ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{ire} = undef; + $self->{ue} = undef; + $self->{te} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{ire}) { + $self->{ire} = $vals->{ire}; + } + if (defined $vals->{ue}) { + $self->{ue} = $vals->{ue}; + } + if (defined $vals->{te}) { + $self->{te} = $vals->{te}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_remove_result'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ire} = new Cassandra::InvalidRequestException(); + $xfer += $self->{ire}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ue} = new Cassandra::UnavailableException(); + $xfer += $self->{ue}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{te} = new Cassandra::TimedOutException(); + $xfer += $self->{te}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_remove_result'); + if (defined $self->{ire}) { + $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1); + $xfer += $self->{ire}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{ue}) { + $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 2); + $xfer += $self->{ue}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{te}) { + $xfer += $output->writeFieldBegin('te', TType::STRUCT, 3); + $xfer += $self->{te}->write($output); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_batch_mutate_args; +use base qw(Class::Accessor); +Cassandra::Cassandra_batch_mutate_args->mk_accessors( qw( keyspace mutation_map consistency_level ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{keyspace} = undef; + $self->{mutation_map} = undef; + $self->{consistency_level} = 1; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{keyspace}) { + $self->{keyspace} = $vals->{keyspace}; + } + if (defined $vals->{mutation_map}) { + $self->{mutation_map} = $vals->{mutation_map}; + } + if (defined $vals->{consistency_level}) { + $self->{consistency_level} = $vals->{consistency_level}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_batch_mutate_args'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{keyspace}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::MAP) { + { + my $_size113 = 0; + $self->{mutation_map} = {}; + my $_ktype114 = 0; + my $_vtype115 = 0; + $xfer += $input->readMapBegin(\$_ktype114, \$_vtype115, \$_size113); + for (my $_i117 = 0; $_i117 < $_size113; ++$_i117) + { + my $key118 = ''; + my $val119 = []; + $xfer += $input->readString(\$key118); + { + my $_size120 = 0; + $val119 = {}; + my $_ktype121 = 0; + my $_vtype122 = 0; + $xfer += $input->readMapBegin(\$_ktype121, \$_vtype122, \$_size120); + for (my $_i124 = 0; $_i124 < $_size120; ++$_i124) + { + my $key125 = ''; + my $val126 = []; + $xfer += $input->readString(\$key125); + { + my $_size127 = 0; + $val126 = []; + my $_etype130 = 0; + $xfer += $input->readListBegin(\$_etype130, \$_size127); + for (my $_i131 = 0; $_i131 < $_size127; ++$_i131) + { + my $elem132 = undef; + $elem132 = new Cassandra::Mutation(); + $xfer += $elem132->read($input); + push(@{$val126},$elem132); + } + $xfer += $input->readListEnd(); + } + $val119->{$key125} = $val126; + } + $xfer += $input->readMapEnd(); + } + $self->{mutation_map}->{$key118} = $val119; + } + $xfer += $input->readMapEnd(); + } + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::I32) { + $xfer += $input->readI32(\$self->{consistency_level}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_batch_mutate_args'); + if (defined $self->{keyspace}) { + $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1); + $xfer += $output->writeString($self->{keyspace}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{mutation_map}) { + $xfer += $output->writeFieldBegin('mutation_map', TType::MAP, 2); + { + $output->writeMapBegin(TType::STRING, TType::MAP, scalar(keys %{$self->{mutation_map}})); + { + while( my ($kiter133,$viter134) = each %{$self->{mutation_map}}) + { + $xfer += $output->writeString($kiter133); + { + $output->writeMapBegin(TType::STRING, TType::LIST, scalar(keys %{${viter134}})); + { + while( my ($kiter135,$viter136) = each %{${viter134}}) + { + $xfer += $output->writeString($kiter135); + { + $output->writeListBegin(TType::STRUCT, scalar(@{${viter136}})); + { + foreach my $iter137 (@{${viter136}}) + { + $xfer += ${iter137}->write($output); + } + } + $output->writeListEnd(); + } + } + } + $output->writeMapEnd(); + } + } + } + $output->writeMapEnd(); + } + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{consistency_level}) { + $xfer += $output->writeFieldBegin('consistency_level', TType::I32, 3); + $xfer += $output->writeI32($self->{consistency_level}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_batch_mutate_result; +use base qw(Class::Accessor); +Cassandra::Cassandra_batch_mutate_result->mk_accessors( qw( ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{ire} = undef; + $self->{ue} = undef; + $self->{te} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{ire}) { + $self->{ire} = $vals->{ire}; + } + if (defined $vals->{ue}) { + $self->{ue} = $vals->{ue}; + } + if (defined $vals->{te}) { + $self->{te} = $vals->{te}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_batch_mutate_result'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ire} = new Cassandra::InvalidRequestException(); + $xfer += $self->{ire}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRUCT) { + $self->{ue} = new Cassandra::UnavailableException(); + $xfer += $self->{ue}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{te} = new Cassandra::TimedOutException(); + $xfer += $self->{te}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_batch_mutate_result'); + if (defined $self->{ire}) { + $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1); + $xfer += $self->{ire}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{ue}) { + $xfer += $output->writeFieldBegin('ue', TType::STRUCT, 2); + $xfer += $self->{ue}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{te}) { + $xfer += $output->writeFieldBegin('te', TType::STRUCT, 3); + $xfer += $self->{te}->write($output); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_get_string_property_args; +use base qw(Class::Accessor); +Cassandra::Cassandra_get_string_property_args->mk_accessors( qw( property ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{property} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{property}) { + $self->{property} = $vals->{property}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_get_string_property_args'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{property}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_get_string_property_args'); + if (defined $self->{property}) { + $xfer += $output->writeFieldBegin('property', TType::STRING, 1); + $xfer += $output->writeString($self->{property}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_get_string_property_result; +use base qw(Class::Accessor); +Cassandra::Cassandra_get_string_property_result->mk_accessors( qw( success ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{success} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{success}) { + $self->{success} = $vals->{success}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_get_string_property_result'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^0$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{success}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_get_string_property_result'); + if (defined $self->{success}) { + $xfer += $output->writeFieldBegin('success', TType::STRING, 0); + $xfer += $output->writeString($self->{success}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_get_string_list_property_args; +use base qw(Class::Accessor); +Cassandra::Cassandra_get_string_list_property_args->mk_accessors( qw( property ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{property} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{property}) { + $self->{property} = $vals->{property}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_get_string_list_property_args'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{property}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_get_string_list_property_args'); + if (defined $self->{property}) { + $xfer += $output->writeFieldBegin('property', TType::STRING, 1); + $xfer += $output->writeString($self->{property}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_get_string_list_property_result; +use base qw(Class::Accessor); +Cassandra::Cassandra_get_string_list_property_result->mk_accessors( qw( success ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{success} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{success}) { + $self->{success} = $vals->{success}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_get_string_list_property_result'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^0$/ && do{ if ($ftype == TType::LIST) { + { + my $_size138 = 0; + $self->{success} = []; + my $_etype141 = 0; + $xfer += $input->readListBegin(\$_etype141, \$_size138); + for (my $_i142 = 0; $_i142 < $_size138; ++$_i142) + { + my $elem143 = undef; + $xfer += $input->readString(\$elem143); + push(@{$self->{success}},$elem143); + } + $xfer += $input->readListEnd(); + } + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_get_string_list_property_result'); + if (defined $self->{success}) { + $xfer += $output->writeFieldBegin('success', TType::LIST, 0); + { + $output->writeListBegin(TType::STRING, scalar(@{$self->{success}})); + { + foreach my $iter144 (@{$self->{success}}) + { + $xfer += $output->writeString($iter144); + } + } + $output->writeListEnd(); + } + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_describe_keyspaces_args; +use base qw(Class::Accessor); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_describe_keyspaces_args'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_describe_keyspaces_args'); + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_describe_keyspaces_result; +use base qw(Class::Accessor); +Cassandra::Cassandra_describe_keyspaces_result->mk_accessors( qw( success ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{success} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{success}) { + $self->{success} = $vals->{success}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_describe_keyspaces_result'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^0$/ && do{ if ($ftype == TType::SET) { + { + my $_size145 = 0; + $self->{success} = {}; + my $_etype148 = 0; + $xfer += $input->readSetBegin(\$_etype148, \$_size145); + for (my $_i149 = 0; $_i149 < $_size145; ++$_i149) + { + my $elem150 = undef; + $xfer += $input->readString(\$elem150); + $self->{success}->{$elem150} = 1; + } + $xfer += $input->readSetEnd(); + } + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_describe_keyspaces_result'); + if (defined $self->{success}) { + $xfer += $output->writeFieldBegin('success', TType::SET, 0); + { + $output->writeSetBegin(TType::STRING, scalar(@{$self->{success}})); + { + foreach my $iter151 (@{$self->{success}}) + { + $xfer += $output->writeString($iter151); + } + } + $output->writeSetEnd(); + } + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_describe_cluster_name_args; +use base qw(Class::Accessor); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_describe_cluster_name_args'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_describe_cluster_name_args'); + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_describe_cluster_name_result; +use base qw(Class::Accessor); +Cassandra::Cassandra_describe_cluster_name_result->mk_accessors( qw( success ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{success} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{success}) { + $self->{success} = $vals->{success}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_describe_cluster_name_result'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^0$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{success}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_describe_cluster_name_result'); + if (defined $self->{success}) { + $xfer += $output->writeFieldBegin('success', TType::STRING, 0); + $xfer += $output->writeString($self->{success}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_describe_version_args; +use base qw(Class::Accessor); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_describe_version_args'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_describe_version_args'); + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_describe_version_result; +use base qw(Class::Accessor); +Cassandra::Cassandra_describe_version_result->mk_accessors( qw( success ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{success} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{success}) { + $self->{success} = $vals->{success}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_describe_version_result'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^0$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{success}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_describe_version_result'); + if (defined $self->{success}) { + $xfer += $output->writeFieldBegin('success', TType::STRING, 0); + $xfer += $output->writeString($self->{success}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_describe_ring_args; +use base qw(Class::Accessor); +Cassandra::Cassandra_describe_ring_args->mk_accessors( qw( keyspace ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{keyspace} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{keyspace}) { + $self->{keyspace} = $vals->{keyspace}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_describe_ring_args'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{keyspace}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_describe_ring_args'); + if (defined $self->{keyspace}) { + $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1); + $xfer += $output->writeString($self->{keyspace}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_describe_ring_result; +use base qw(Class::Accessor); +Cassandra::Cassandra_describe_ring_result->mk_accessors( qw( success ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{success} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{success}) { + $self->{success} = $vals->{success}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_describe_ring_result'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^0$/ && do{ if ($ftype == TType::LIST) { + { + my $_size152 = 0; + $self->{success} = []; + my $_etype155 = 0; + $xfer += $input->readListBegin(\$_etype155, \$_size152); + for (my $_i156 = 0; $_i156 < $_size152; ++$_i156) + { + my $elem157 = undef; + $elem157 = new Cassandra::TokenRange(); + $xfer += $elem157->read($input); + push(@{$self->{success}},$elem157); + } + $xfer += $input->readListEnd(); + } + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_describe_ring_result'); + if (defined $self->{success}) { + $xfer += $output->writeFieldBegin('success', TType::LIST, 0); + { + $output->writeListBegin(TType::STRUCT, scalar(@{$self->{success}})); + { + foreach my $iter158 (@{$self->{success}}) + { + $xfer += ${iter158}->write($output); + } + } + $output->writeListEnd(); + } + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_describe_keyspace_args; +use base qw(Class::Accessor); +Cassandra::Cassandra_describe_keyspace_args->mk_accessors( qw( keyspace ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{keyspace} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{keyspace}) { + $self->{keyspace} = $vals->{keyspace}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_describe_keyspace_args'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{keyspace}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_describe_keyspace_args'); + if (defined $self->{keyspace}) { + $xfer += $output->writeFieldBegin('keyspace', TType::STRING, 1); + $xfer += $output->writeString($self->{keyspace}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_describe_keyspace_result; +use base qw(Class::Accessor); +Cassandra::Cassandra_describe_keyspace_result->mk_accessors( qw( success ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{success} = undef; + $self->{nfe} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{success}) { + $self->{success} = $vals->{success}; + } + if (defined $vals->{nfe}) { + $self->{nfe} = $vals->{nfe}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_describe_keyspace_result'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^0$/ && do{ if ($ftype == TType::MAP) { + { + my $_size159 = 0; + $self->{success} = {}; + my $_ktype160 = 0; + my $_vtype161 = 0; + $xfer += $input->readMapBegin(\$_ktype160, \$_vtype161, \$_size159); + for (my $_i163 = 0; $_i163 < $_size159; ++$_i163) + { + my $key164 = ''; + my $val165 = []; + $xfer += $input->readString(\$key164); + { + my $_size166 = 0; + $val165 = {}; + my $_ktype167 = 0; + my $_vtype168 = 0; + $xfer += $input->readMapBegin(\$_ktype167, \$_vtype168, \$_size166); + for (my $_i170 = 0; $_i170 < $_size166; ++$_i170) + { + my $key171 = ''; + my $val172 = ''; + $xfer += $input->readString(\$key171); + $xfer += $input->readString(\$val172); + $val165->{$key171} = $val172; + } + $xfer += $input->readMapEnd(); + } + $self->{success}->{$key164} = $val165; + } + $xfer += $input->readMapEnd(); + } + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^1$/ && do{ if ($ftype == TType::STRUCT) { + $self->{nfe} = new Cassandra::NotFoundException(); + $xfer += $self->{nfe}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_describe_keyspace_result'); + if (defined $self->{success}) { + $xfer += $output->writeFieldBegin('success', TType::MAP, 0); + { + $output->writeMapBegin(TType::STRING, TType::MAP, scalar(keys %{$self->{success}})); + { + while( my ($kiter173,$viter174) = each %{$self->{success}}) + { + $xfer += $output->writeString($kiter173); + { + $output->writeMapBegin(TType::STRING, TType::STRING, scalar(keys %{${viter174}})); + { + while( my ($kiter175,$viter176) = each %{${viter174}}) + { + $xfer += $output->writeString($kiter175); + $xfer += $output->writeString($viter176); + } + } + $output->writeMapEnd(); + } + } + } + $output->writeMapEnd(); + } + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{nfe}) { + $xfer += $output->writeFieldBegin('nfe', TType::STRUCT, 1); + $xfer += $self->{nfe}->write($output); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_describe_splits_args; +use base qw(Class::Accessor); +Cassandra::Cassandra_describe_splits_args->mk_accessors( qw( start_token end_token keys_per_split ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{start_token} = undef; + $self->{end_token} = undef; + $self->{keys_per_split} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{start_token}) { + $self->{start_token} = $vals->{start_token}; + } + if (defined $vals->{end_token}) { + $self->{end_token} = $vals->{end_token}; + } + if (defined $vals->{keys_per_split}) { + $self->{keys_per_split} = $vals->{keys_per_split}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_describe_splits_args'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{start_token}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{end_token}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::I32) { + $xfer += $input->readI32(\$self->{keys_per_split}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_describe_splits_args'); + if (defined $self->{start_token}) { + $xfer += $output->writeFieldBegin('start_token', TType::STRING, 1); + $xfer += $output->writeString($self->{start_token}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{end_token}) { + $xfer += $output->writeFieldBegin('end_token', TType::STRING, 2); + $xfer += $output->writeString($self->{end_token}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{keys_per_split}) { + $xfer += $output->writeFieldBegin('keys_per_split', TType::I32, 3); + $xfer += $output->writeI32($self->{keys_per_split}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Cassandra_describe_splits_result; +use base qw(Class::Accessor); +Cassandra::Cassandra_describe_splits_result->mk_accessors( qw( success ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{success} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{success}) { + $self->{success} = $vals->{success}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Cassandra_describe_splits_result'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^0$/ && do{ if ($ftype == TType::LIST) { + { + my $_size177 = 0; + $self->{success} = []; + my $_etype180 = 0; + $xfer += $input->readListBegin(\$_etype180, \$_size177); + for (my $_i181 = 0; $_i181 < $_size177; ++$_i181) + { + my $elem182 = undef; + $xfer += $input->readString(\$elem182); + push(@{$self->{success}},$elem182); + } + $xfer += $input->readListEnd(); + } + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Cassandra_describe_splits_result'); + if (defined $self->{success}) { + $xfer += $output->writeFieldBegin('success', TType::LIST, 0); + { + $output->writeListBegin(TType::STRING, scalar(@{$self->{success}})); + { + foreach my $iter183 (@{$self->{success}}) + { + $xfer += $output->writeString($iter183); + } + } + $output->writeListEnd(); + } + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::CassandraIf; + +use strict; + + +sub login{ + my $self = shift; + my $keyspace = shift; + my $auth_request = shift; + + die 'implement interface'; +} + +sub get{ + my $self = shift; + my $keyspace = shift; + my $key = shift; + my $column_path = shift; + my $consistency_level = shift; + + die 'implement interface'; +} + +sub get_slice{ + my $self = shift; + my $keyspace = shift; + my $key = shift; + my $column_parent = shift; + my $predicate = shift; + my $consistency_level = shift; + + die 'implement interface'; +} + +sub multiget{ + my $self = shift; + my $keyspace = shift; + my $keys = shift; + my $column_path = shift; + my $consistency_level = shift; + + die 'implement interface'; +} + +sub multiget_slice{ + my $self = shift; + my $keyspace = shift; + my $keys = shift; + my $column_parent = shift; + my $predicate = shift; + my $consistency_level = shift; + + die 'implement interface'; +} + +sub get_count{ + my $self = shift; + my $keyspace = shift; + my $key = shift; + my $column_parent = shift; + my $consistency_level = shift; + + die 'implement interface'; +} + +sub get_range_slice{ + my $self = shift; + my $keyspace = shift; + my $column_parent = shift; + my $predicate = shift; + my $start_key = shift; + my $finish_key = shift; + my $row_count = shift; + my $consistency_level = shift; + + die 'implement interface'; +} + +sub get_range_slices{ + my $self = shift; + my $keyspace = shift; + my $column_parent = shift; + my $predicate = shift; + my $range = shift; + my $consistency_level = shift; + + die 'implement interface'; +} + +sub insert{ + my $self = shift; + my $keyspace = shift; + my $key = shift; + my $column_path = shift; + my $value = shift; + my $timestamp = shift; + my $consistency_level = shift; + + die 'implement interface'; +} + +sub batch_insert{ + my $self = shift; + my $keyspace = shift; + my $key = shift; + my $cfmap = shift; + my $consistency_level = shift; + + die 'implement interface'; +} + +sub remove{ + my $self = shift; + my $keyspace = shift; + my $key = shift; + my $column_path = shift; + my $timestamp = shift; + my $consistency_level = shift; + + die 'implement interface'; +} + +sub batch_mutate{ + my $self = shift; + my $keyspace = shift; + my $mutation_map = shift; + my $consistency_level = shift; + + die 'implement interface'; +} + +sub get_string_property{ + my $self = shift; + my $property = shift; + + die 'implement interface'; +} + +sub get_string_list_property{ + my $self = shift; + my $property = shift; + + die 'implement interface'; +} + +sub describe_keyspaces{ + my $self = shift; + + die 'implement interface'; +} + +sub describe_cluster_name{ + my $self = shift; + + die 'implement interface'; +} + +sub describe_version{ + my $self = shift; + + die 'implement interface'; +} + +sub describe_ring{ + my $self = shift; + my $keyspace = shift; + + die 'implement interface'; +} + +sub describe_keyspace{ + my $self = shift; + my $keyspace = shift; + + die 'implement interface'; +} + +sub describe_splits{ + my $self = shift; + my $start_token = shift; + my $end_token = shift; + my $keys_per_split = shift; + + die 'implement interface'; +} + +package Cassandra::CassandraRest; + +use strict; + + +sub new { + my ($classname, $impl) = @_; + my $self ={ impl => $impl }; + + return bless($self,$classname); +} + +sub login{ + my ($self, $request) = @_; + + my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef; + my $auth_request = ($request->{'auth_request'}) ? $request->{'auth_request'} : undef; + return $self->{impl}->login($keyspace, $auth_request); +} + +sub get{ + my ($self, $request) = @_; + + my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef; + my $key = ($request->{'key'}) ? $request->{'key'} : undef; + my $column_path = ($request->{'column_path'}) ? $request->{'column_path'} : undef; + my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef; + return $self->{impl}->get($keyspace, $key, $column_path, $consistency_level); +} + +sub get_slice{ + my ($self, $request) = @_; + + my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef; + my $key = ($request->{'key'}) ? $request->{'key'} : undef; + my $column_parent = ($request->{'column_parent'}) ? $request->{'column_parent'} : undef; + my $predicate = ($request->{'predicate'}) ? $request->{'predicate'} : undef; + my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef; + return $self->{impl}->get_slice($keyspace, $key, $column_parent, $predicate, $consistency_level); +} + +sub multiget{ + my ($self, $request) = @_; + + my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef; + my $keys = ($request->{'keys'}) ? $request->{'keys'} : undef; + my $column_path = ($request->{'column_path'}) ? $request->{'column_path'} : undef; + my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef; + return $self->{impl}->multiget($keyspace, $keys, $column_path, $consistency_level); +} + +sub multiget_slice{ + my ($self, $request) = @_; + + my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef; + my $keys = ($request->{'keys'}) ? $request->{'keys'} : undef; + my $column_parent = ($request->{'column_parent'}) ? $request->{'column_parent'} : undef; + my $predicate = ($request->{'predicate'}) ? $request->{'predicate'} : undef; + my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef; + return $self->{impl}->multiget_slice($keyspace, $keys, $column_parent, $predicate, $consistency_level); +} + +sub get_count{ + my ($self, $request) = @_; + + my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef; + my $key = ($request->{'key'}) ? $request->{'key'} : undef; + my $column_parent = ($request->{'column_parent'}) ? $request->{'column_parent'} : undef; + my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef; + return $self->{impl}->get_count($keyspace, $key, $column_parent, $consistency_level); +} + +sub get_range_slice{ + my ($self, $request) = @_; + + my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef; + my $column_parent = ($request->{'column_parent'}) ? $request->{'column_parent'} : undef; + my $predicate = ($request->{'predicate'}) ? $request->{'predicate'} : undef; + my $start_key = ($request->{'start_key'}) ? $request->{'start_key'} : undef; + my $finish_key = ($request->{'finish_key'}) ? $request->{'finish_key'} : undef; + my $row_count = ($request->{'row_count'}) ? $request->{'row_count'} : undef; + my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef; + return $self->{impl}->get_range_slice($keyspace, $column_parent, $predicate, $start_key, $finish_key, $row_count, $consistency_level); +} + +sub get_range_slices{ + my ($self, $request) = @_; + + my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef; + my $column_parent = ($request->{'column_parent'}) ? $request->{'column_parent'} : undef; + my $predicate = ($request->{'predicate'}) ? $request->{'predicate'} : undef; + my $range = ($request->{'range'}) ? $request->{'range'} : undef; + my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef; + return $self->{impl}->get_range_slices($keyspace, $column_parent, $predicate, $range, $consistency_level); +} + +sub insert{ + my ($self, $request) = @_; + + my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef; + my $key = ($request->{'key'}) ? $request->{'key'} : undef; + my $column_path = ($request->{'column_path'}) ? $request->{'column_path'} : undef; + my $value = ($request->{'value'}) ? $request->{'value'} : undef; + my $timestamp = ($request->{'timestamp'}) ? $request->{'timestamp'} : undef; + my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef; + return $self->{impl}->insert($keyspace, $key, $column_path, $value, $timestamp, $consistency_level); +} + +sub batch_insert{ + my ($self, $request) = @_; + + my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef; + my $key = ($request->{'key'}) ? $request->{'key'} : undef; + my $cfmap = ($request->{'cfmap'}) ? $request->{'cfmap'} : undef; + my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef; + return $self->{impl}->batch_insert($keyspace, $key, $cfmap, $consistency_level); +} + +sub remove{ + my ($self, $request) = @_; + + my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef; + my $key = ($request->{'key'}) ? $request->{'key'} : undef; + my $column_path = ($request->{'column_path'}) ? $request->{'column_path'} : undef; + my $timestamp = ($request->{'timestamp'}) ? $request->{'timestamp'} : undef; + my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef; + return $self->{impl}->remove($keyspace, $key, $column_path, $timestamp, $consistency_level); +} + +sub batch_mutate{ + my ($self, $request) = @_; + + my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef; + my $mutation_map = ($request->{'mutation_map'}) ? $request->{'mutation_map'} : undef; + my $consistency_level = ($request->{'consistency_level'}) ? $request->{'consistency_level'} : undef; + return $self->{impl}->batch_mutate($keyspace, $mutation_map, $consistency_level); +} + +sub get_string_property{ + my ($self, $request) = @_; + + my $property = ($request->{'property'}) ? $request->{'property'} : undef; + return $self->{impl}->get_string_property($property); +} + +sub get_string_list_property{ + my ($self, $request) = @_; + + my $property = ($request->{'property'}) ? $request->{'property'} : undef; + return $self->{impl}->get_string_list_property($property); +} + +sub describe_keyspaces{ + my ($self, $request) = @_; + + return $self->{impl}->describe_keyspaces(); +} + +sub describe_cluster_name{ + my ($self, $request) = @_; + + return $self->{impl}->describe_cluster_name(); +} + +sub describe_version{ + my ($self, $request) = @_; + + return $self->{impl}->describe_version(); +} + +sub describe_ring{ + my ($self, $request) = @_; + + my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef; + return $self->{impl}->describe_ring($keyspace); +} + +sub describe_keyspace{ + my ($self, $request) = @_; + + my $keyspace = ($request->{'keyspace'}) ? $request->{'keyspace'} : undef; + return $self->{impl}->describe_keyspace($keyspace); +} + +sub describe_splits{ + my ($self, $request) = @_; + + my $start_token = ($request->{'start_token'}) ? $request->{'start_token'} : undef; + my $end_token = ($request->{'end_token'}) ? $request->{'end_token'} : undef; + my $keys_per_split = ($request->{'keys_per_split'}) ? $request->{'keys_per_split'} : undef; + return $self->{impl}->describe_splits($start_token, $end_token, $keys_per_split); +} + +package Cassandra::CassandraClient; + + +use base qw(Cassandra::CassandraIf); +sub new { + my ($classname, $input, $output) = @_; + my $self = {}; + $self->{input} = $input; + $self->{output} = defined $output ? $output : $input; + $self->{seqid} = 0; + return bless($self,$classname); +} + +sub login{ + my $self = shift; + my $keyspace = shift; + my $auth_request = shift; + + $self->send_login($keyspace, $auth_request); + $self->recv_login(); +} + +sub send_login{ + my $self = shift; + my $keyspace = shift; + my $auth_request = shift; + + $self->{output}->writeMessageBegin('login', TMessageType::CALL, $self->{seqid}); + my $args = new Cassandra::Cassandra_login_args(); + $args->{keyspace} = $keyspace; + $args->{auth_request} = $auth_request; + $args->write($self->{output}); + $self->{output}->writeMessageEnd(); + $self->{output}->getTransport()->flush(); +} + +sub recv_login{ + my $self = shift; + + my $rseqid = 0; + my $fname; + my $mtype = 0; + + $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid); + if ($mtype == TMessageType::EXCEPTION) { + my $x = new TApplicationException(); + $x->read($self->{input}); + $self->{input}->readMessageEnd(); + die $x; + } + my $result = new Cassandra::Cassandra_login_result(); + $result->read($self->{input}); + $self->{input}->readMessageEnd(); + + if (defined $result->{authnx}) { + die $result->{authnx}; + } + if (defined $result->{authzx}) { + die $result->{authzx}; + } + return; +} +sub get{ + my $self = shift; + my $keyspace = shift; + my $key = shift; + my $column_path = shift; + my $consistency_level = shift; + + $self->send_get($keyspace, $key, $column_path, $consistency_level); + return $self->recv_get(); +} + +sub send_get{ + my $self = shift; + my $keyspace = shift; + my $key = shift; + my $column_path = shift; + my $consistency_level = shift; + + $self->{output}->writeMessageBegin('get', TMessageType::CALL, $self->{seqid}); + my $args = new Cassandra::Cassandra_get_args(); + $args->{keyspace} = $keyspace; + $args->{key} = $key; + $args->{column_path} = $column_path; + $args->{consistency_level} = $consistency_level; + $args->write($self->{output}); + $self->{output}->writeMessageEnd(); + $self->{output}->getTransport()->flush(); +} + +sub recv_get{ + my $self = shift; + + my $rseqid = 0; + my $fname; + my $mtype = 0; + + $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid); + if ($mtype == TMessageType::EXCEPTION) { + my $x = new TApplicationException(); + $x->read($self->{input}); + $self->{input}->readMessageEnd(); + die $x; + } + my $result = new Cassandra::Cassandra_get_result(); + $result->read($self->{input}); + $self->{input}->readMessageEnd(); + + if (defined $result->{success} ) { + return $result->{success}; + } + if (defined $result->{ire}) { + die $result->{ire}; + } + if (defined $result->{nfe}) { + die $result->{nfe}; + } + if (defined $result->{ue}) { + die $result->{ue}; + } + if (defined $result->{te}) { + die $result->{te}; + } + die "get failed: unknown result"; +} +sub get_slice{ + my $self = shift; + my $keyspace = shift; + my $key = shift; + my $column_parent = shift; + my $predicate = shift; + my $consistency_level = shift; + + $self->send_get_slice($keyspace, $key, $column_parent, $predicate, $consistency_level); + return $self->recv_get_slice(); +} + +sub send_get_slice{ + my $self = shift; + my $keyspace = shift; + my $key = shift; + my $column_parent = shift; + my $predicate = shift; + my $consistency_level = shift; + + $self->{output}->writeMessageBegin('get_slice', TMessageType::CALL, $self->{seqid}); + my $args = new Cassandra::Cassandra_get_slice_args(); + $args->{keyspace} = $keyspace; + $args->{key} = $key; + $args->{column_parent} = $column_parent; + $args->{predicate} = $predicate; + $args->{consistency_level} = $consistency_level; + $args->write($self->{output}); + $self->{output}->writeMessageEnd(); + $self->{output}->getTransport()->flush(); +} + +sub recv_get_slice{ + my $self = shift; + + my $rseqid = 0; + my $fname; + my $mtype = 0; + + $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid); + if ($mtype == TMessageType::EXCEPTION) { + my $x = new TApplicationException(); + $x->read($self->{input}); + $self->{input}->readMessageEnd(); + die $x; + } + my $result = new Cassandra::Cassandra_get_slice_result(); + $result->read($self->{input}); + $self->{input}->readMessageEnd(); + + if (defined $result->{success} ) { + return $result->{success}; + } + if (defined $result->{ire}) { + die $result->{ire}; + } + if (defined $result->{ue}) { + die $result->{ue}; + } + if (defined $result->{te}) { + die $result->{te}; + } + die "get_slice failed: unknown result"; +} +sub multiget{ + my $self = shift; + my $keyspace = shift; + my $keys = shift; + my $column_path = shift; + my $consistency_level = shift; + + $self->send_multiget($keyspace, $keys, $column_path, $consistency_level); + return $self->recv_multiget(); +} + +sub send_multiget{ + my $self = shift; + my $keyspace = shift; + my $keys = shift; + my $column_path = shift; + my $consistency_level = shift; + + $self->{output}->writeMessageBegin('multiget', TMessageType::CALL, $self->{seqid}); + my $args = new Cassandra::Cassandra_multiget_args(); + $args->{keyspace} = $keyspace; + $args->{keys} = $keys; + $args->{column_path} = $column_path; + $args->{consistency_level} = $consistency_level; + $args->write($self->{output}); + $self->{output}->writeMessageEnd(); + $self->{output}->getTransport()->flush(); +} + +sub recv_multiget{ + my $self = shift; + + my $rseqid = 0; + my $fname; + my $mtype = 0; + + $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid); + if ($mtype == TMessageType::EXCEPTION) { + my $x = new TApplicationException(); + $x->read($self->{input}); + $self->{input}->readMessageEnd(); + die $x; + } + my $result = new Cassandra::Cassandra_multiget_result(); + $result->read($self->{input}); + $self->{input}->readMessageEnd(); + + if (defined $result->{success} ) { + return $result->{success}; + } + if (defined $result->{ire}) { + die $result->{ire}; + } + if (defined $result->{ue}) { + die $result->{ue}; + } + if (defined $result->{te}) { + die $result->{te}; + } + die "multiget failed: unknown result"; +} +sub multiget_slice{ + my $self = shift; + my $keyspace = shift; + my $keys = shift; + my $column_parent = shift; + my $predicate = shift; + my $consistency_level = shift; + + $self->send_multiget_slice($keyspace, $keys, $column_parent, $predicate, $consistency_level); + return $self->recv_multiget_slice(); +} + +sub send_multiget_slice{ + my $self = shift; + my $keyspace = shift; + my $keys = shift; + my $column_parent = shift; + my $predicate = shift; + my $consistency_level = shift; + + $self->{output}->writeMessageBegin('multiget_slice', TMessageType::CALL, $self->{seqid}); + my $args = new Cassandra::Cassandra_multiget_slice_args(); + $args->{keyspace} = $keyspace; + $args->{keys} = $keys; + $args->{column_parent} = $column_parent; + $args->{predicate} = $predicate; + $args->{consistency_level} = $consistency_level; + $args->write($self->{output}); + $self->{output}->writeMessageEnd(); + $self->{output}->getTransport()->flush(); +} + +sub recv_multiget_slice{ + my $self = shift; + + my $rseqid = 0; + my $fname; + my $mtype = 0; + + $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid); + if ($mtype == TMessageType::EXCEPTION) { + my $x = new TApplicationException(); + $x->read($self->{input}); + $self->{input}->readMessageEnd(); + die $x; + } + my $result = new Cassandra::Cassandra_multiget_slice_result(); + $result->read($self->{input}); + $self->{input}->readMessageEnd(); + + if (defined $result->{success} ) { + return $result->{success}; + } + if (defined $result->{ire}) { + die $result->{ire}; + } + if (defined $result->{ue}) { + die $result->{ue}; + } + if (defined $result->{te}) { + die $result->{te}; + } + die "multiget_slice failed: unknown result"; +} +sub get_count{ + my $self = shift; + my $keyspace = shift; + my $key = shift; + my $column_parent = shift; + my $consistency_level = shift; + + $self->send_get_count($keyspace, $key, $column_parent, $consistency_level); + return $self->recv_get_count(); +} + +sub send_get_count{ + my $self = shift; + my $keyspace = shift; + my $key = shift; + my $column_parent = shift; + my $consistency_level = shift; + + $self->{output}->writeMessageBegin('get_count', TMessageType::CALL, $self->{seqid}); + my $args = new Cassandra::Cassandra_get_count_args(); + $args->{keyspace} = $keyspace; + $args->{key} = $key; + $args->{column_parent} = $column_parent; + $args->{consistency_level} = $consistency_level; + $args->write($self->{output}); + $self->{output}->writeMessageEnd(); + $self->{output}->getTransport()->flush(); +} + +sub recv_get_count{ + my $self = shift; + + my $rseqid = 0; + my $fname; + my $mtype = 0; + + $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid); + if ($mtype == TMessageType::EXCEPTION) { + my $x = new TApplicationException(); + $x->read($self->{input}); + $self->{input}->readMessageEnd(); + die $x; + } + my $result = new Cassandra::Cassandra_get_count_result(); + $result->read($self->{input}); + $self->{input}->readMessageEnd(); + + if (defined $result->{success} ) { + return $result->{success}; + } + if (defined $result->{ire}) { + die $result->{ire}; + } + if (defined $result->{ue}) { + die $result->{ue}; + } + if (defined $result->{te}) { + die $result->{te}; + } + die "get_count failed: unknown result"; +} +sub get_range_slice{ + my $self = shift; + my $keyspace = shift; + my $column_parent = shift; + my $predicate = shift; + my $start_key = shift; + my $finish_key = shift; + my $row_count = shift; + my $consistency_level = shift; + + $self->send_get_range_slice($keyspace, $column_parent, $predicate, $start_key, $finish_key, $row_count, $consistency_level); + return $self->recv_get_range_slice(); +} + +sub send_get_range_slice{ + my $self = shift; + my $keyspace = shift; + my $column_parent = shift; + my $predicate = shift; + my $start_key = shift; + my $finish_key = shift; + my $row_count = shift; + my $consistency_level = shift; + + $self->{output}->writeMessageBegin('get_range_slice', TMessageType::CALL, $self->{seqid}); + my $args = new Cassandra::Cassandra_get_range_slice_args(); + $args->{keyspace} = $keyspace; + $args->{column_parent} = $column_parent; + $args->{predicate} = $predicate; + $args->{start_key} = $start_key; + $args->{finish_key} = $finish_key; + $args->{row_count} = $row_count; + $args->{consistency_level} = $consistency_level; + $args->write($self->{output}); + $self->{output}->writeMessageEnd(); + $self->{output}->getTransport()->flush(); +} + +sub recv_get_range_slice{ + my $self = shift; + + my $rseqid = 0; + my $fname; + my $mtype = 0; + + $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid); + if ($mtype == TMessageType::EXCEPTION) { + my $x = new TApplicationException(); + $x->read($self->{input}); + $self->{input}->readMessageEnd(); + die $x; + } + my $result = new Cassandra::Cassandra_get_range_slice_result(); + $result->read($self->{input}); + $self->{input}->readMessageEnd(); + + if (defined $result->{success} ) { + return $result->{success}; + } + if (defined $result->{ire}) { + die $result->{ire}; + } + if (defined $result->{ue}) { + die $result->{ue}; + } + if (defined $result->{te}) { + die $result->{te}; + } + die "get_range_slice failed: unknown result"; +} +sub get_range_slices{ + my $self = shift; + my $keyspace = shift; + my $column_parent = shift; + my $predicate = shift; + my $range = shift; + my $consistency_level = shift; + + $self->send_get_range_slices($keyspace, $column_parent, $predicate, $range, $consistency_level); + return $self->recv_get_range_slices(); +} + +sub send_get_range_slices{ + my $self = shift; + my $keyspace = shift; + my $column_parent = shift; + my $predicate = shift; + my $range = shift; + my $consistency_level = shift; + + $self->{output}->writeMessageBegin('get_range_slices', TMessageType::CALL, $self->{seqid}); + my $args = new Cassandra::Cassandra_get_range_slices_args(); + $args->{keyspace} = $keyspace; + $args->{column_parent} = $column_parent; + $args->{predicate} = $predicate; + $args->{range} = $range; + $args->{consistency_level} = $consistency_level; + $args->write($self->{output}); + $self->{output}->writeMessageEnd(); + $self->{output}->getTransport()->flush(); +} + +sub recv_get_range_slices{ + my $self = shift; + + my $rseqid = 0; + my $fname; + my $mtype = 0; + + $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid); + if ($mtype == TMessageType::EXCEPTION) { + my $x = new TApplicationException(); + $x->read($self->{input}); + $self->{input}->readMessageEnd(); + die $x; + } + my $result = new Cassandra::Cassandra_get_range_slices_result(); + $result->read($self->{input}); + $self->{input}->readMessageEnd(); + + if (defined $result->{success} ) { + return $result->{success}; + } + if (defined $result->{ire}) { + die $result->{ire}; + } + if (defined $result->{ue}) { + die $result->{ue}; + } + if (defined $result->{te}) { + die $result->{te}; + } + die "get_range_slices failed: unknown result"; +} +sub insert{ + my $self = shift; + my $keyspace = shift; + my $key = shift; + my $column_path = shift; + my $value = shift; + my $timestamp = shift; + my $consistency_level = shift; + + $self->send_insert($keyspace, $key, $column_path, $value, $timestamp, $consistency_level); + $self->recv_insert(); +} + +sub send_insert{ + my $self = shift; + my $keyspace = shift; + my $key = shift; + my $column_path = shift; + my $value = shift; + my $timestamp = shift; + my $consistency_level = shift; + + $self->{output}->writeMessageBegin('insert', TMessageType::CALL, $self->{seqid}); + my $args = new Cassandra::Cassandra_insert_args(); + $args->{keyspace} = $keyspace; + $args->{key} = $key; + $args->{column_path} = $column_path; + $args->{value} = $value; + $args->{timestamp} = $timestamp; + $args->{consistency_level} = $consistency_level; + $args->write($self->{output}); + $self->{output}->writeMessageEnd(); + $self->{output}->getTransport()->flush(); +} + +sub recv_insert{ + my $self = shift; + + my $rseqid = 0; + my $fname; + my $mtype = 0; + + $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid); + if ($mtype == TMessageType::EXCEPTION) { + my $x = new TApplicationException(); + $x->read($self->{input}); + $self->{input}->readMessageEnd(); + die $x; + } + my $result = new Cassandra::Cassandra_insert_result(); + $result->read($self->{input}); + $self->{input}->readMessageEnd(); + + if (defined $result->{ire}) { + die $result->{ire}; + } + if (defined $result->{ue}) { + die $result->{ue}; + } + if (defined $result->{te}) { + die $result->{te}; + } + return; +} +sub batch_insert{ + my $self = shift; + my $keyspace = shift; + my $key = shift; + my $cfmap = shift; + my $consistency_level = shift; + + $self->send_batch_insert($keyspace, $key, $cfmap, $consistency_level); + $self->recv_batch_insert(); +} + +sub send_batch_insert{ + my $self = shift; + my $keyspace = shift; + my $key = shift; + my $cfmap = shift; + my $consistency_level = shift; + + $self->{output}->writeMessageBegin('batch_insert', TMessageType::CALL, $self->{seqid}); + my $args = new Cassandra::Cassandra_batch_insert_args(); + $args->{keyspace} = $keyspace; + $args->{key} = $key; + $args->{cfmap} = $cfmap; + $args->{consistency_level} = $consistency_level; + $args->write($self->{output}); + $self->{output}->writeMessageEnd(); + $self->{output}->getTransport()->flush(); +} + +sub recv_batch_insert{ + my $self = shift; + + my $rseqid = 0; + my $fname; + my $mtype = 0; + + $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid); + if ($mtype == TMessageType::EXCEPTION) { + my $x = new TApplicationException(); + $x->read($self->{input}); + $self->{input}->readMessageEnd(); + die $x; + } + my $result = new Cassandra::Cassandra_batch_insert_result(); + $result->read($self->{input}); + $self->{input}->readMessageEnd(); + + if (defined $result->{ire}) { + die $result->{ire}; + } + if (defined $result->{ue}) { + die $result->{ue}; + } + if (defined $result->{te}) { + die $result->{te}; + } + return; +} +sub remove{ + my $self = shift; + my $keyspace = shift; + my $key = shift; + my $column_path = shift; + my $timestamp = shift; + my $consistency_level = shift; + + $self->send_remove($keyspace, $key, $column_path, $timestamp, $consistency_level); + $self->recv_remove(); +} + +sub send_remove{ + my $self = shift; + my $keyspace = shift; + my $key = shift; + my $column_path = shift; + my $timestamp = shift; + my $consistency_level = shift; + + $self->{output}->writeMessageBegin('remove', TMessageType::CALL, $self->{seqid}); + my $args = new Cassandra::Cassandra_remove_args(); + $args->{keyspace} = $keyspace; + $args->{key} = $key; + $args->{column_path} = $column_path; + $args->{timestamp} = $timestamp; + $args->{consistency_level} = $consistency_level; + $args->write($self->{output}); + $self->{output}->writeMessageEnd(); + $self->{output}->getTransport()->flush(); +} + +sub recv_remove{ + my $self = shift; + + my $rseqid = 0; + my $fname; + my $mtype = 0; + + $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid); + if ($mtype == TMessageType::EXCEPTION) { + my $x = new TApplicationException(); + $x->read($self->{input}); + $self->{input}->readMessageEnd(); + die $x; + } + my $result = new Cassandra::Cassandra_remove_result(); + $result->read($self->{input}); + $self->{input}->readMessageEnd(); + + if (defined $result->{ire}) { + die $result->{ire}; + } + if (defined $result->{ue}) { + die $result->{ue}; + } + if (defined $result->{te}) { + die $result->{te}; + } + return; +} +sub batch_mutate{ + my $self = shift; + my $keyspace = shift; + my $mutation_map = shift; + my $consistency_level = shift; + + $self->send_batch_mutate($keyspace, $mutation_map, $consistency_level); + $self->recv_batch_mutate(); +} + +sub send_batch_mutate{ + my $self = shift; + my $keyspace = shift; + my $mutation_map = shift; + my $consistency_level = shift; + + $self->{output}->writeMessageBegin('batch_mutate', TMessageType::CALL, $self->{seqid}); + my $args = new Cassandra::Cassandra_batch_mutate_args(); + $args->{keyspace} = $keyspace; + $args->{mutation_map} = $mutation_map; + $args->{consistency_level} = $consistency_level; + $args->write($self->{output}); + $self->{output}->writeMessageEnd(); + $self->{output}->getTransport()->flush(); +} + +sub recv_batch_mutate{ + my $self = shift; + + my $rseqid = 0; + my $fname; + my $mtype = 0; + + $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid); + if ($mtype == TMessageType::EXCEPTION) { + my $x = new TApplicationException(); + $x->read($self->{input}); + $self->{input}->readMessageEnd(); + die $x; + } + my $result = new Cassandra::Cassandra_batch_mutate_result(); + $result->read($self->{input}); + $self->{input}->readMessageEnd(); + + if (defined $result->{ire}) { + die $result->{ire}; + } + if (defined $result->{ue}) { + die $result->{ue}; + } + if (defined $result->{te}) { + die $result->{te}; + } + return; +} +sub get_string_property{ + my $self = shift; + my $property = shift; + + $self->send_get_string_property($property); + return $self->recv_get_string_property(); +} + +sub send_get_string_property{ + my $self = shift; + my $property = shift; + + $self->{output}->writeMessageBegin('get_string_property', TMessageType::CALL, $self->{seqid}); + my $args = new Cassandra::Cassandra_get_string_property_args(); + $args->{property} = $property; + $args->write($self->{output}); + $self->{output}->writeMessageEnd(); + $self->{output}->getTransport()->flush(); +} + +sub recv_get_string_property{ + my $self = shift; + + my $rseqid = 0; + my $fname; + my $mtype = 0; + + $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid); + if ($mtype == TMessageType::EXCEPTION) { + my $x = new TApplicationException(); + $x->read($self->{input}); + $self->{input}->readMessageEnd(); + die $x; + } + my $result = new Cassandra::Cassandra_get_string_property_result(); + $result->read($self->{input}); + $self->{input}->readMessageEnd(); + + if (defined $result->{success} ) { + return $result->{success}; + } + die "get_string_property failed: unknown result"; +} +sub get_string_list_property{ + my $self = shift; + my $property = shift; + + $self->send_get_string_list_property($property); + return $self->recv_get_string_list_property(); +} + +sub send_get_string_list_property{ + my $self = shift; + my $property = shift; + + $self->{output}->writeMessageBegin('get_string_list_property', TMessageType::CALL, $self->{seqid}); + my $args = new Cassandra::Cassandra_get_string_list_property_args(); + $args->{property} = $property; + $args->write($self->{output}); + $self->{output}->writeMessageEnd(); + $self->{output}->getTransport()->flush(); +} + +sub recv_get_string_list_property{ + my $self = shift; + + my $rseqid = 0; + my $fname; + my $mtype = 0; + + $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid); + if ($mtype == TMessageType::EXCEPTION) { + my $x = new TApplicationException(); + $x->read($self->{input}); + $self->{input}->readMessageEnd(); + die $x; + } + my $result = new Cassandra::Cassandra_get_string_list_property_result(); + $result->read($self->{input}); + $self->{input}->readMessageEnd(); + + if (defined $result->{success} ) { + return $result->{success}; + } + die "get_string_list_property failed: unknown result"; +} +sub describe_keyspaces{ + my $self = shift; + + $self->send_describe_keyspaces(); + return $self->recv_describe_keyspaces(); +} + +sub send_describe_keyspaces{ + my $self = shift; + + $self->{output}->writeMessageBegin('describe_keyspaces', TMessageType::CALL, $self->{seqid}); + my $args = new Cassandra::Cassandra_describe_keyspaces_args(); + $args->write($self->{output}); + $self->{output}->writeMessageEnd(); + $self->{output}->getTransport()->flush(); +} + +sub recv_describe_keyspaces{ + my $self = shift; + + my $rseqid = 0; + my $fname; + my $mtype = 0; + + $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid); + if ($mtype == TMessageType::EXCEPTION) { + my $x = new TApplicationException(); + $x->read($self->{input}); + $self->{input}->readMessageEnd(); + die $x; + } + my $result = new Cassandra::Cassandra_describe_keyspaces_result(); + $result->read($self->{input}); + $self->{input}->readMessageEnd(); + + if (defined $result->{success} ) { + return $result->{success}; + } + die "describe_keyspaces failed: unknown result"; +} +sub describe_cluster_name{ + my $self = shift; + + $self->send_describe_cluster_name(); + return $self->recv_describe_cluster_name(); +} + +sub send_describe_cluster_name{ + my $self = shift; + + $self->{output}->writeMessageBegin('describe_cluster_name', TMessageType::CALL, $self->{seqid}); + my $args = new Cassandra::Cassandra_describe_cluster_name_args(); + $args->write($self->{output}); + $self->{output}->writeMessageEnd(); + $self->{output}->getTransport()->flush(); +} + +sub recv_describe_cluster_name{ + my $self = shift; + + my $rseqid = 0; + my $fname; + my $mtype = 0; + + $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid); + if ($mtype == TMessageType::EXCEPTION) { + my $x = new TApplicationException(); + $x->read($self->{input}); + $self->{input}->readMessageEnd(); + die $x; + } + my $result = new Cassandra::Cassandra_describe_cluster_name_result(); + $result->read($self->{input}); + $self->{input}->readMessageEnd(); + + if (defined $result->{success} ) { + return $result->{success}; + } + die "describe_cluster_name failed: unknown result"; +} +sub describe_version{ + my $self = shift; + + $self->send_describe_version(); + return $self->recv_describe_version(); +} + +sub send_describe_version{ + my $self = shift; + + $self->{output}->writeMessageBegin('describe_version', TMessageType::CALL, $self->{seqid}); + my $args = new Cassandra::Cassandra_describe_version_args(); + $args->write($self->{output}); + $self->{output}->writeMessageEnd(); + $self->{output}->getTransport()->flush(); +} + +sub recv_describe_version{ + my $self = shift; + + my $rseqid = 0; + my $fname; + my $mtype = 0; + + $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid); + if ($mtype == TMessageType::EXCEPTION) { + my $x = new TApplicationException(); + $x->read($self->{input}); + $self->{input}->readMessageEnd(); + die $x; + } + my $result = new Cassandra::Cassandra_describe_version_result(); + $result->read($self->{input}); + $self->{input}->readMessageEnd(); + + if (defined $result->{success} ) { + return $result->{success}; + } + die "describe_version failed: unknown result"; +} +sub describe_ring{ + my $self = shift; + my $keyspace = shift; + + $self->send_describe_ring($keyspace); + return $self->recv_describe_ring(); +} + +sub send_describe_ring{ + my $self = shift; + my $keyspace = shift; + + $self->{output}->writeMessageBegin('describe_ring', TMessageType::CALL, $self->{seqid}); + my $args = new Cassandra::Cassandra_describe_ring_args(); + $args->{keyspace} = $keyspace; + $args->write($self->{output}); + $self->{output}->writeMessageEnd(); + $self->{output}->getTransport()->flush(); +} + +sub recv_describe_ring{ + my $self = shift; + + my $rseqid = 0; + my $fname; + my $mtype = 0; + + $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid); + if ($mtype == TMessageType::EXCEPTION) { + my $x = new TApplicationException(); + $x->read($self->{input}); + $self->{input}->readMessageEnd(); + die $x; + } + my $result = new Cassandra::Cassandra_describe_ring_result(); + $result->read($self->{input}); + $self->{input}->readMessageEnd(); + + if (defined $result->{success} ) { + return $result->{success}; + } + die "describe_ring failed: unknown result"; +} +sub describe_keyspace{ + my $self = shift; + my $keyspace = shift; + + $self->send_describe_keyspace($keyspace); + return $self->recv_describe_keyspace(); +} + +sub send_describe_keyspace{ + my $self = shift; + my $keyspace = shift; + + $self->{output}->writeMessageBegin('describe_keyspace', TMessageType::CALL, $self->{seqid}); + my $args = new Cassandra::Cassandra_describe_keyspace_args(); + $args->{keyspace} = $keyspace; + $args->write($self->{output}); + $self->{output}->writeMessageEnd(); + $self->{output}->getTransport()->flush(); +} + +sub recv_describe_keyspace{ + my $self = shift; + + my $rseqid = 0; + my $fname; + my $mtype = 0; + + $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid); + if ($mtype == TMessageType::EXCEPTION) { + my $x = new TApplicationException(); + $x->read($self->{input}); + $self->{input}->readMessageEnd(); + die $x; + } + my $result = new Cassandra::Cassandra_describe_keyspace_result(); + $result->read($self->{input}); + $self->{input}->readMessageEnd(); + + if (defined $result->{success} ) { + return $result->{success}; + } + if (defined $result->{nfe}) { + die $result->{nfe}; + } + die "describe_keyspace failed: unknown result"; +} +sub describe_splits{ + my $self = shift; + my $start_token = shift; + my $end_token = shift; + my $keys_per_split = shift; + + $self->send_describe_splits($start_token, $end_token, $keys_per_split); + return $self->recv_describe_splits(); +} + +sub send_describe_splits{ + my $self = shift; + my $start_token = shift; + my $end_token = shift; + my $keys_per_split = shift; + + $self->{output}->writeMessageBegin('describe_splits', TMessageType::CALL, $self->{seqid}); + my $args = new Cassandra::Cassandra_describe_splits_args(); + $args->{start_token} = $start_token; + $args->{end_token} = $end_token; + $args->{keys_per_split} = $keys_per_split; + $args->write($self->{output}); + $self->{output}->writeMessageEnd(); + $self->{output}->getTransport()->flush(); +} + +sub recv_describe_splits{ + my $self = shift; + + my $rseqid = 0; + my $fname; + my $mtype = 0; + + $self->{input}->readMessageBegin(\$fname, \$mtype, \$rseqid); + if ($mtype == TMessageType::EXCEPTION) { + my $x = new TApplicationException(); + $x->read($self->{input}); + $self->{input}->readMessageEnd(); + die $x; + } + my $result = new Cassandra::Cassandra_describe_splits_result(); + $result->read($self->{input}); + $self->{input}->readMessageEnd(); + + if (defined $result->{success} ) { + return $result->{success}; + } + die "describe_splits failed: unknown result"; +} +package Cassandra::CassandraProcessor; + +use strict; + + +sub new { + my ($classname, $handler) = @_; + my $self = {}; + $self->{handler} = $handler; + return bless ($self, $classname); +} + +sub process { + my ($self, $input, $output) = @_; + my $rseqid = 0; + my $fname = undef; + my $mtype = 0; + + $input->readMessageBegin(\$fname, \$mtype, \$rseqid); + my $methodname = 'process_'.$fname; + if (!$self->can($methodname)) { + $input->skip(TType::STRUCT); + $input->readMessageEnd(); + my $x = new TApplicationException('Function '.$fname.' not implemented.', TApplicationException::UNKNOWN_METHOD); + $output->writeMessageBegin($fname, TMessageType::EXCEPTION, $rseqid); + $x->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); + return; + } + $self->$methodname($rseqid, $input, $output); + return 1; +} + +sub process_login { + my ($self, $seqid, $input, $output) = @_; + my $args = new Cassandra::Cassandra_login_args(); + $args->read($input); + $input->readMessageEnd(); + my $result = new Cassandra::Cassandra_login_result(); + eval { + $self->{handler}->login($args->keyspace, $args->auth_request); + }; if( UNIVERSAL::isa($@,'Cassandra::AuthenticationException') ){ + $result->{authnx} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::AuthorizationException') ){ + $result->{authzx} = $@; + } + $output->writeMessageBegin('login', TMessageType::REPLY, $seqid); + $result->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); +} + +sub process_get { + my ($self, $seqid, $input, $output) = @_; + my $args = new Cassandra::Cassandra_get_args(); + $args->read($input); + $input->readMessageEnd(); + my $result = new Cassandra::Cassandra_get_result(); + eval { + $result->{success} = $self->{handler}->get($args->keyspace, $args->key, $args->column_path, $args->consistency_level); + }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ + $result->{ire} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::NotFoundException') ){ + $result->{nfe} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ + $result->{ue} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ + $result->{te} = $@; + } + $output->writeMessageBegin('get', TMessageType::REPLY, $seqid); + $result->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); +} + +sub process_get_slice { + my ($self, $seqid, $input, $output) = @_; + my $args = new Cassandra::Cassandra_get_slice_args(); + $args->read($input); + $input->readMessageEnd(); + my $result = new Cassandra::Cassandra_get_slice_result(); + eval { + $result->{success} = $self->{handler}->get_slice($args->keyspace, $args->key, $args->column_parent, $args->predicate, $args->consistency_level); + }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ + $result->{ire} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ + $result->{ue} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ + $result->{te} = $@; + } + $output->writeMessageBegin('get_slice', TMessageType::REPLY, $seqid); + $result->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); +} + +sub process_multiget { + my ($self, $seqid, $input, $output) = @_; + my $args = new Cassandra::Cassandra_multiget_args(); + $args->read($input); + $input->readMessageEnd(); + my $result = new Cassandra::Cassandra_multiget_result(); + eval { + $result->{success} = $self->{handler}->multiget($args->keyspace, $args->keys, $args->column_path, $args->consistency_level); + }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ + $result->{ire} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ + $result->{ue} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ + $result->{te} = $@; + } + $output->writeMessageBegin('multiget', TMessageType::REPLY, $seqid); + $result->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); +} + +sub process_multiget_slice { + my ($self, $seqid, $input, $output) = @_; + my $args = new Cassandra::Cassandra_multiget_slice_args(); + $args->read($input); + $input->readMessageEnd(); + my $result = new Cassandra::Cassandra_multiget_slice_result(); + eval { + $result->{success} = $self->{handler}->multiget_slice($args->keyspace, $args->keys, $args->column_parent, $args->predicate, $args->consistency_level); + }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ + $result->{ire} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ + $result->{ue} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ + $result->{te} = $@; + } + $output->writeMessageBegin('multiget_slice', TMessageType::REPLY, $seqid); + $result->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); +} + +sub process_get_count { + my ($self, $seqid, $input, $output) = @_; + my $args = new Cassandra::Cassandra_get_count_args(); + $args->read($input); + $input->readMessageEnd(); + my $result = new Cassandra::Cassandra_get_count_result(); + eval { + $result->{success} = $self->{handler}->get_count($args->keyspace, $args->key, $args->column_parent, $args->consistency_level); + }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ + $result->{ire} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ + $result->{ue} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ + $result->{te} = $@; + } + $output->writeMessageBegin('get_count', TMessageType::REPLY, $seqid); + $result->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); +} + +sub process_get_range_slice { + my ($self, $seqid, $input, $output) = @_; + my $args = new Cassandra::Cassandra_get_range_slice_args(); + $args->read($input); + $input->readMessageEnd(); + my $result = new Cassandra::Cassandra_get_range_slice_result(); + eval { + $result->{success} = $self->{handler}->get_range_slice($args->keyspace, $args->column_parent, $args->predicate, $args->start_key, $args->finish_key, $args->row_count, $args->consistency_level); + }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ + $result->{ire} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ + $result->{ue} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ + $result->{te} = $@; + } + $output->writeMessageBegin('get_range_slice', TMessageType::REPLY, $seqid); + $result->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); +} + +sub process_get_range_slices { + my ($self, $seqid, $input, $output) = @_; + my $args = new Cassandra::Cassandra_get_range_slices_args(); + $args->read($input); + $input->readMessageEnd(); + my $result = new Cassandra::Cassandra_get_range_slices_result(); + eval { + $result->{success} = $self->{handler}->get_range_slices($args->keyspace, $args->column_parent, $args->predicate, $args->range, $args->consistency_level); + }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ + $result->{ire} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ + $result->{ue} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ + $result->{te} = $@; + } + $output->writeMessageBegin('get_range_slices', TMessageType::REPLY, $seqid); + $result->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); +} + +sub process_insert { + my ($self, $seqid, $input, $output) = @_; + my $args = new Cassandra::Cassandra_insert_args(); + $args->read($input); + $input->readMessageEnd(); + my $result = new Cassandra::Cassandra_insert_result(); + eval { + $self->{handler}->insert($args->keyspace, $args->key, $args->column_path, $args->value, $args->timestamp, $args->consistency_level); + }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ + $result->{ire} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ + $result->{ue} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ + $result->{te} = $@; + } + $output->writeMessageBegin('insert', TMessageType::REPLY, $seqid); + $result->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); +} + +sub process_batch_insert { + my ($self, $seqid, $input, $output) = @_; + my $args = new Cassandra::Cassandra_batch_insert_args(); + $args->read($input); + $input->readMessageEnd(); + my $result = new Cassandra::Cassandra_batch_insert_result(); + eval { + $self->{handler}->batch_insert($args->keyspace, $args->key, $args->cfmap, $args->consistency_level); + }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ + $result->{ire} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ + $result->{ue} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ + $result->{te} = $@; + } + $output->writeMessageBegin('batch_insert', TMessageType::REPLY, $seqid); + $result->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); +} + +sub process_remove { + my ($self, $seqid, $input, $output) = @_; + my $args = new Cassandra::Cassandra_remove_args(); + $args->read($input); + $input->readMessageEnd(); + my $result = new Cassandra::Cassandra_remove_result(); + eval { + $self->{handler}->remove($args->keyspace, $args->key, $args->column_path, $args->timestamp, $args->consistency_level); + }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ + $result->{ire} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ + $result->{ue} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ + $result->{te} = $@; + } + $output->writeMessageBegin('remove', TMessageType::REPLY, $seqid); + $result->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); +} + +sub process_batch_mutate { + my ($self, $seqid, $input, $output) = @_; + my $args = new Cassandra::Cassandra_batch_mutate_args(); + $args->read($input); + $input->readMessageEnd(); + my $result = new Cassandra::Cassandra_batch_mutate_result(); + eval { + $self->{handler}->batch_mutate($args->keyspace, $args->mutation_map, $args->consistency_level); + }; if( UNIVERSAL::isa($@,'Cassandra::InvalidRequestException') ){ + $result->{ire} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::UnavailableException') ){ + $result->{ue} = $@; + }; if( UNIVERSAL::isa($@,'Cassandra::TimedOutException') ){ + $result->{te} = $@; + } + $output->writeMessageBegin('batch_mutate', TMessageType::REPLY, $seqid); + $result->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); +} + +sub process_get_string_property { + my ($self, $seqid, $input, $output) = @_; + my $args = new Cassandra::Cassandra_get_string_property_args(); + $args->read($input); + $input->readMessageEnd(); + my $result = new Cassandra::Cassandra_get_string_property_result(); + $result->{success} = $self->{handler}->get_string_property($args->property); + $output->writeMessageBegin('get_string_property', TMessageType::REPLY, $seqid); + $result->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); +} + +sub process_get_string_list_property { + my ($self, $seqid, $input, $output) = @_; + my $args = new Cassandra::Cassandra_get_string_list_property_args(); + $args->read($input); + $input->readMessageEnd(); + my $result = new Cassandra::Cassandra_get_string_list_property_result(); + $result->{success} = $self->{handler}->get_string_list_property($args->property); + $output->writeMessageBegin('get_string_list_property', TMessageType::REPLY, $seqid); + $result->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); +} + +sub process_describe_keyspaces { + my ($self, $seqid, $input, $output) = @_; + my $args = new Cassandra::Cassandra_describe_keyspaces_args(); + $args->read($input); + $input->readMessageEnd(); + my $result = new Cassandra::Cassandra_describe_keyspaces_result(); + $result->{success} = $self->{handler}->describe_keyspaces(); + $output->writeMessageBegin('describe_keyspaces', TMessageType::REPLY, $seqid); + $result->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); +} + +sub process_describe_cluster_name { + my ($self, $seqid, $input, $output) = @_; + my $args = new Cassandra::Cassandra_describe_cluster_name_args(); + $args->read($input); + $input->readMessageEnd(); + my $result = new Cassandra::Cassandra_describe_cluster_name_result(); + $result->{success} = $self->{handler}->describe_cluster_name(); + $output->writeMessageBegin('describe_cluster_name', TMessageType::REPLY, $seqid); + $result->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); +} + +sub process_describe_version { + my ($self, $seqid, $input, $output) = @_; + my $args = new Cassandra::Cassandra_describe_version_args(); + $args->read($input); + $input->readMessageEnd(); + my $result = new Cassandra::Cassandra_describe_version_result(); + $result->{success} = $self->{handler}->describe_version(); + $output->writeMessageBegin('describe_version', TMessageType::REPLY, $seqid); + $result->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); +} + +sub process_describe_ring { + my ($self, $seqid, $input, $output) = @_; + my $args = new Cassandra::Cassandra_describe_ring_args(); + $args->read($input); + $input->readMessageEnd(); + my $result = new Cassandra::Cassandra_describe_ring_result(); + $result->{success} = $self->{handler}->describe_ring($args->keyspace); + $output->writeMessageBegin('describe_ring', TMessageType::REPLY, $seqid); + $result->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); +} + +sub process_describe_keyspace { + my ($self, $seqid, $input, $output) = @_; + my $args = new Cassandra::Cassandra_describe_keyspace_args(); + $args->read($input); + $input->readMessageEnd(); + my $result = new Cassandra::Cassandra_describe_keyspace_result(); + eval { + $result->{success} = $self->{handler}->describe_keyspace($args->keyspace); + }; if( UNIVERSAL::isa($@,'Cassandra::NotFoundException') ){ + $result->{nfe} = $@; + } + $output->writeMessageBegin('describe_keyspace', TMessageType::REPLY, $seqid); + $result->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); +} + +sub process_describe_splits { + my ($self, $seqid, $input, $output) = @_; + my $args = new Cassandra::Cassandra_describe_splits_args(); + $args->read($input); + $input->readMessageEnd(); + my $result = new Cassandra::Cassandra_describe_splits_result(); + $result->{success} = $self->{handler}->describe_splits($args->start_token, $args->end_token, $args->keys_per_split); + $output->writeMessageBegin('describe_splits', TMessageType::REPLY, $seqid); + $result->write($output); + $output->writeMessageEnd(); + $output->getTransport()->flush(); +} + +1; diff -r 000000000000 -r a2f0a2c135cf Cassandra/lib/Cassandra/Constants.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Cassandra/lib/Cassandra/Constants.pm Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,15 @@ +# +# Autogenerated by Thrift +# +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING +# +package Cassandra::Constants; +require 5.6.0; +use strict; +use warnings; +use Thrift; + + +use constant VERSION => "2.1.0"; + +1; diff -r 000000000000 -r a2f0a2c135cf Cassandra/lib/Cassandra/Types.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Cassandra/lib/Cassandra/Types.pm Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,1619 @@ +# +# Autogenerated by Thrift +# +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING +# +require 5.6.0; +use strict; +use warnings; +use Thrift; + +package Cassandra::ConsistencyLevel; +use constant ZERO => 0; +use constant ONE => 1; +use constant QUORUM => 2; +use constant DCQUORUM => 3; +use constant DCQUORUMSYNC => 4; +use constant ALL => 5; +use constant ANY => 6; +package Cassandra::Column; +use base qw(Class::Accessor); +Cassandra::Column->mk_accessors( qw( name value timestamp ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{name} = undef; + $self->{value} = undef; + $self->{timestamp} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{name}) { + $self->{name} = $vals->{name}; + } + if (defined $vals->{value}) { + $self->{value} = $vals->{value}; + } + if (defined $vals->{timestamp}) { + $self->{timestamp} = $vals->{timestamp}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Column'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{name}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{value}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::I64) { + $xfer += $input->readI64(\$self->{timestamp}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Column'); + if (defined $self->{name}) { + $xfer += $output->writeFieldBegin('name', TType::STRING, 1); + $xfer += $output->writeString($self->{name}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{value}) { + $xfer += $output->writeFieldBegin('value', TType::STRING, 2); + $xfer += $output->writeString($self->{value}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{timestamp}) { + $xfer += $output->writeFieldBegin('timestamp', TType::I64, 3); + $xfer += $output->writeI64($self->{timestamp}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::SuperColumn; +use base qw(Class::Accessor); +Cassandra::SuperColumn->mk_accessors( qw( name columns ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{name} = undef; + $self->{columns} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{name}) { + $self->{name} = $vals->{name}; + } + if (defined $vals->{columns}) { + $self->{columns} = $vals->{columns}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'SuperColumn'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{name}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::LIST) { + { + my $_size0 = 0; + $self->{columns} = []; + my $_etype3 = 0; + $xfer += $input->readListBegin(\$_etype3, \$_size0); + for (my $_i4 = 0; $_i4 < $_size0; ++$_i4) + { + my $elem5 = undef; + $elem5 = new Cassandra::Column(); + $xfer += $elem5->read($input); + push(@{$self->{columns}},$elem5); + } + $xfer += $input->readListEnd(); + } + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('SuperColumn'); + if (defined $self->{name}) { + $xfer += $output->writeFieldBegin('name', TType::STRING, 1); + $xfer += $output->writeString($self->{name}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{columns}) { + $xfer += $output->writeFieldBegin('columns', TType::LIST, 2); + { + $output->writeListBegin(TType::STRUCT, scalar(@{$self->{columns}})); + { + foreach my $iter6 (@{$self->{columns}}) + { + $xfer += ${iter6}->write($output); + } + } + $output->writeListEnd(); + } + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::ColumnOrSuperColumn; +use base qw(Class::Accessor); +Cassandra::ColumnOrSuperColumn->mk_accessors( qw( column super_column ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{column} = undef; + $self->{super_column} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{column}) { + $self->{column} = $vals->{column}; + } + if (defined $vals->{super_column}) { + $self->{super_column} = $vals->{super_column}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'ColumnOrSuperColumn'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRUCT) { + $self->{column} = new Cassandra::Column(); + $xfer += $self->{column}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRUCT) { + $self->{super_column} = new Cassandra::SuperColumn(); + $xfer += $self->{super_column}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('ColumnOrSuperColumn'); + if (defined $self->{column}) { + $xfer += $output->writeFieldBegin('column', TType::STRUCT, 1); + $xfer += $self->{column}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{super_column}) { + $xfer += $output->writeFieldBegin('super_column', TType::STRUCT, 2); + $xfer += $self->{super_column}->write($output); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::NotFoundException; +use base qw(Thrift::TException); +use base qw(Class::Accessor); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + return bless ($self, $classname); +} + +sub getName { + return 'NotFoundException'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('NotFoundException'); + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::InvalidRequestException; +use base qw(Thrift::TException); +use base qw(Class::Accessor); +Cassandra::InvalidRequestException->mk_accessors( qw( why ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{why} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{why}) { + $self->{why} = $vals->{why}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'InvalidRequestException'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{why}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('InvalidRequestException'); + if (defined $self->{why}) { + $xfer += $output->writeFieldBegin('why', TType::STRING, 1); + $xfer += $output->writeString($self->{why}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::UnavailableException; +use base qw(Thrift::TException); +use base qw(Class::Accessor); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + return bless ($self, $classname); +} + +sub getName { + return 'UnavailableException'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('UnavailableException'); + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::TimedOutException; +use base qw(Thrift::TException); +use base qw(Class::Accessor); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + return bless ($self, $classname); +} + +sub getName { + return 'TimedOutException'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('TimedOutException'); + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::AuthenticationException; +use base qw(Thrift::TException); +use base qw(Class::Accessor); +Cassandra::AuthenticationException->mk_accessors( qw( why ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{why} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{why}) { + $self->{why} = $vals->{why}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'AuthenticationException'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{why}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('AuthenticationException'); + if (defined $self->{why}) { + $xfer += $output->writeFieldBegin('why', TType::STRING, 1); + $xfer += $output->writeString($self->{why}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::AuthorizationException; +use base qw(Thrift::TException); +use base qw(Class::Accessor); +Cassandra::AuthorizationException->mk_accessors( qw( why ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{why} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{why}) { + $self->{why} = $vals->{why}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'AuthorizationException'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{why}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('AuthorizationException'); + if (defined $self->{why}) { + $xfer += $output->writeFieldBegin('why', TType::STRING, 1); + $xfer += $output->writeString($self->{why}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::ColumnParent; +use base qw(Class::Accessor); +Cassandra::ColumnParent->mk_accessors( qw( column_family super_column ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{column_family} = undef; + $self->{super_column} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{column_family}) { + $self->{column_family} = $vals->{column_family}; + } + if (defined $vals->{super_column}) { + $self->{super_column} = $vals->{super_column}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'ColumnParent'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^3$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{column_family}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^4$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{super_column}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('ColumnParent'); + if (defined $self->{column_family}) { + $xfer += $output->writeFieldBegin('column_family', TType::STRING, 3); + $xfer += $output->writeString($self->{column_family}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{super_column}) { + $xfer += $output->writeFieldBegin('super_column', TType::STRING, 4); + $xfer += $output->writeString($self->{super_column}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::ColumnPath; +use base qw(Class::Accessor); +Cassandra::ColumnPath->mk_accessors( qw( column_family super_column column ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{column_family} = undef; + $self->{super_column} = undef; + $self->{column} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{column_family}) { + $self->{column_family} = $vals->{column_family}; + } + if (defined $vals->{super_column}) { + $self->{super_column} = $vals->{super_column}; + } + if (defined $vals->{column}) { + $self->{column} = $vals->{column}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'ColumnPath'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^3$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{column_family}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^4$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{super_column}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^5$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{column}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('ColumnPath'); + if (defined $self->{column_family}) { + $xfer += $output->writeFieldBegin('column_family', TType::STRING, 3); + $xfer += $output->writeString($self->{column_family}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{super_column}) { + $xfer += $output->writeFieldBegin('super_column', TType::STRING, 4); + $xfer += $output->writeString($self->{super_column}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{column}) { + $xfer += $output->writeFieldBegin('column', TType::STRING, 5); + $xfer += $output->writeString($self->{column}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::SliceRange; +use base qw(Class::Accessor); +Cassandra::SliceRange->mk_accessors( qw( start finish reversed count ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{start} = undef; + $self->{finish} = undef; + $self->{reversed} = 0; + $self->{count} = 100; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{start}) { + $self->{start} = $vals->{start}; + } + if (defined $vals->{finish}) { + $self->{finish} = $vals->{finish}; + } + if (defined $vals->{reversed}) { + $self->{reversed} = $vals->{reversed}; + } + if (defined $vals->{count}) { + $self->{count} = $vals->{count}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'SliceRange'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{start}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{finish}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::BOOL) { + $xfer += $input->readBool(\$self->{reversed}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^4$/ && do{ if ($ftype == TType::I32) { + $xfer += $input->readI32(\$self->{count}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('SliceRange'); + if (defined $self->{start}) { + $xfer += $output->writeFieldBegin('start', TType::STRING, 1); + $xfer += $output->writeString($self->{start}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{finish}) { + $xfer += $output->writeFieldBegin('finish', TType::STRING, 2); + $xfer += $output->writeString($self->{finish}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{reversed}) { + $xfer += $output->writeFieldBegin('reversed', TType::BOOL, 3); + $xfer += $output->writeBool($self->{reversed}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{count}) { + $xfer += $output->writeFieldBegin('count', TType::I32, 4); + $xfer += $output->writeI32($self->{count}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::SlicePredicate; +use base qw(Class::Accessor); +Cassandra::SlicePredicate->mk_accessors( qw( column_names slice_range ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{column_names} = undef; + $self->{slice_range} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{column_names}) { + $self->{column_names} = $vals->{column_names}; + } + if (defined $vals->{slice_range}) { + $self->{slice_range} = $vals->{slice_range}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'SlicePredicate'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::LIST) { + { + my $_size7 = 0; + $self->{column_names} = []; + my $_etype10 = 0; + $xfer += $input->readListBegin(\$_etype10, \$_size7); + for (my $_i11 = 0; $_i11 < $_size7; ++$_i11) + { + my $elem12 = undef; + $xfer += $input->readString(\$elem12); + push(@{$self->{column_names}},$elem12); + } + $xfer += $input->readListEnd(); + } + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRUCT) { + $self->{slice_range} = new Cassandra::SliceRange(); + $xfer += $self->{slice_range}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('SlicePredicate'); + if (defined $self->{column_names}) { + $xfer += $output->writeFieldBegin('column_names', TType::LIST, 1); + { + $output->writeListBegin(TType::STRING, scalar(@{$self->{column_names}})); + { + foreach my $iter13 (@{$self->{column_names}}) + { + $xfer += $output->writeString($iter13); + } + } + $output->writeListEnd(); + } + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{slice_range}) { + $xfer += $output->writeFieldBegin('slice_range', TType::STRUCT, 2); + $xfer += $self->{slice_range}->write($output); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::KeyRange; +use base qw(Class::Accessor); +Cassandra::KeyRange->mk_accessors( qw( start_key end_key start_token end_token count ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{start_key} = undef; + $self->{end_key} = undef; + $self->{start_token} = undef; + $self->{end_token} = undef; + $self->{count} = 100; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{start_key}) { + $self->{start_key} = $vals->{start_key}; + } + if (defined $vals->{end_key}) { + $self->{end_key} = $vals->{end_key}; + } + if (defined $vals->{start_token}) { + $self->{start_token} = $vals->{start_token}; + } + if (defined $vals->{end_token}) { + $self->{end_token} = $vals->{end_token}; + } + if (defined $vals->{count}) { + $self->{count} = $vals->{count}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'KeyRange'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{start_key}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{end_key}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{start_token}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^4$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{end_token}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^5$/ && do{ if ($ftype == TType::I32) { + $xfer += $input->readI32(\$self->{count}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('KeyRange'); + if (defined $self->{start_key}) { + $xfer += $output->writeFieldBegin('start_key', TType::STRING, 1); + $xfer += $output->writeString($self->{start_key}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{end_key}) { + $xfer += $output->writeFieldBegin('end_key', TType::STRING, 2); + $xfer += $output->writeString($self->{end_key}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{start_token}) { + $xfer += $output->writeFieldBegin('start_token', TType::STRING, 3); + $xfer += $output->writeString($self->{start_token}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{end_token}) { + $xfer += $output->writeFieldBegin('end_token', TType::STRING, 4); + $xfer += $output->writeString($self->{end_token}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{count}) { + $xfer += $output->writeFieldBegin('count', TType::I32, 5); + $xfer += $output->writeI32($self->{count}); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::KeySlice; +use base qw(Class::Accessor); +Cassandra::KeySlice->mk_accessors( qw( key columns ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{key} = undef; + $self->{columns} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{key}) { + $self->{key} = $vals->{key}; + } + if (defined $vals->{columns}) { + $self->{columns} = $vals->{columns}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'KeySlice'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{key}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::LIST) { + { + my $_size14 = 0; + $self->{columns} = []; + my $_etype17 = 0; + $xfer += $input->readListBegin(\$_etype17, \$_size14); + for (my $_i18 = 0; $_i18 < $_size14; ++$_i18) + { + my $elem19 = undef; + $elem19 = new Cassandra::ColumnOrSuperColumn(); + $xfer += $elem19->read($input); + push(@{$self->{columns}},$elem19); + } + $xfer += $input->readListEnd(); + } + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('KeySlice'); + if (defined $self->{key}) { + $xfer += $output->writeFieldBegin('key', TType::STRING, 1); + $xfer += $output->writeString($self->{key}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{columns}) { + $xfer += $output->writeFieldBegin('columns', TType::LIST, 2); + { + $output->writeListBegin(TType::STRUCT, scalar(@{$self->{columns}})); + { + foreach my $iter20 (@{$self->{columns}}) + { + $xfer += ${iter20}->write($output); + } + } + $output->writeListEnd(); + } + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Deletion; +use base qw(Class::Accessor); +Cassandra::Deletion->mk_accessors( qw( timestamp super_column predicate ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{timestamp} = undef; + $self->{super_column} = undef; + $self->{predicate} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{timestamp}) { + $self->{timestamp} = $vals->{timestamp}; + } + if (defined $vals->{super_column}) { + $self->{super_column} = $vals->{super_column}; + } + if (defined $vals->{predicate}) { + $self->{predicate} = $vals->{predicate}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Deletion'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::I64) { + $xfer += $input->readI64(\$self->{timestamp}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{super_column}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::STRUCT) { + $self->{predicate} = new Cassandra::SlicePredicate(); + $xfer += $self->{predicate}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Deletion'); + if (defined $self->{timestamp}) { + $xfer += $output->writeFieldBegin('timestamp', TType::I64, 1); + $xfer += $output->writeI64($self->{timestamp}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{super_column}) { + $xfer += $output->writeFieldBegin('super_column', TType::STRING, 2); + $xfer += $output->writeString($self->{super_column}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{predicate}) { + $xfer += $output->writeFieldBegin('predicate', TType::STRUCT, 3); + $xfer += $self->{predicate}->write($output); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::Mutation; +use base qw(Class::Accessor); +Cassandra::Mutation->mk_accessors( qw( column_or_supercolumn deletion ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{column_or_supercolumn} = undef; + $self->{deletion} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{column_or_supercolumn}) { + $self->{column_or_supercolumn} = $vals->{column_or_supercolumn}; + } + if (defined $vals->{deletion}) { + $self->{deletion} = $vals->{deletion}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'Mutation'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRUCT) { + $self->{column_or_supercolumn} = new Cassandra::ColumnOrSuperColumn(); + $xfer += $self->{column_or_supercolumn}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRUCT) { + $self->{deletion} = new Cassandra::Deletion(); + $xfer += $self->{deletion}->read($input); + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('Mutation'); + if (defined $self->{column_or_supercolumn}) { + $xfer += $output->writeFieldBegin('column_or_supercolumn', TType::STRUCT, 1); + $xfer += $self->{column_or_supercolumn}->write($output); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{deletion}) { + $xfer += $output->writeFieldBegin('deletion', TType::STRUCT, 2); + $xfer += $self->{deletion}->write($output); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::TokenRange; +use base qw(Class::Accessor); +Cassandra::TokenRange->mk_accessors( qw( start_token end_token endpoints ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{start_token} = undef; + $self->{end_token} = undef; + $self->{endpoints} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{start_token}) { + $self->{start_token} = $vals->{start_token}; + } + if (defined $vals->{end_token}) { + $self->{end_token} = $vals->{end_token}; + } + if (defined $vals->{endpoints}) { + $self->{endpoints} = $vals->{endpoints}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'TokenRange'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{start_token}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^2$/ && do{ if ($ftype == TType::STRING) { + $xfer += $input->readString(\$self->{end_token}); + } else { + $xfer += $input->skip($ftype); + } + last; }; + /^3$/ && do{ if ($ftype == TType::LIST) { + { + my $_size21 = 0; + $self->{endpoints} = []; + my $_etype24 = 0; + $xfer += $input->readListBegin(\$_etype24, \$_size21); + for (my $_i25 = 0; $_i25 < $_size21; ++$_i25) + { + my $elem26 = undef; + $xfer += $input->readString(\$elem26); + push(@{$self->{endpoints}},$elem26); + } + $xfer += $input->readListEnd(); + } + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('TokenRange'); + if (defined $self->{start_token}) { + $xfer += $output->writeFieldBegin('start_token', TType::STRING, 1); + $xfer += $output->writeString($self->{start_token}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{end_token}) { + $xfer += $output->writeFieldBegin('end_token', TType::STRING, 2); + $xfer += $output->writeString($self->{end_token}); + $xfer += $output->writeFieldEnd(); + } + if (defined $self->{endpoints}) { + $xfer += $output->writeFieldBegin('endpoints', TType::LIST, 3); + { + $output->writeListBegin(TType::STRING, scalar(@{$self->{endpoints}})); + { + foreach my $iter27 (@{$self->{endpoints}}) + { + $xfer += $output->writeString($iter27); + } + } + $output->writeListEnd(); + } + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +package Cassandra::AuthenticationRequest; +use base qw(Class::Accessor); +Cassandra::AuthenticationRequest->mk_accessors( qw( credentials ) ); + +sub new { + my $classname = shift; + my $self = {}; + my $vals = shift || {}; + $self->{credentials} = undef; + if (UNIVERSAL::isa($vals,'HASH')) { + if (defined $vals->{credentials}) { + $self->{credentials} = $vals->{credentials}; + } + } + return bless ($self, $classname); +} + +sub getName { + return 'AuthenticationRequest'; +} + +sub read { + my ($self, $input) = @_; + my $xfer = 0; + my $fname; + my $ftype = 0; + my $fid = 0; + $xfer += $input->readStructBegin(\$fname); + while (1) + { + $xfer += $input->readFieldBegin(\$fname, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + SWITCH: for($fid) + { + /^1$/ && do{ if ($ftype == TType::MAP) { + { + my $_size28 = 0; + $self->{credentials} = {}; + my $_ktype29 = 0; + my $_vtype30 = 0; + $xfer += $input->readMapBegin(\$_ktype29, \$_vtype30, \$_size28); + for (my $_i32 = 0; $_i32 < $_size28; ++$_i32) + { + my $key33 = ''; + my $val34 = ''; + $xfer += $input->readString(\$key33); + $xfer += $input->readString(\$val34); + $self->{credentials}->{$key33} = $val34; + } + $xfer += $input->readMapEnd(); + } + } else { + $xfer += $input->skip($ftype); + } + last; }; + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + return $xfer; +} + +sub write { + my ($self, $output) = @_; + my $xfer = 0; + $xfer += $output->writeStructBegin('AuthenticationRequest'); + if (defined $self->{credentials}) { + $xfer += $output->writeFieldBegin('credentials', TType::MAP, 1); + { + $output->writeMapBegin(TType::STRING, TType::STRING, scalar(keys %{$self->{credentials}})); + { + while( my ($kiter35,$viter36) = each %{$self->{credentials}}) + { + $xfer += $output->writeString($kiter35); + $xfer += $output->writeString($viter36); + } + } + $output->writeMapEnd(); + } + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; +} + +1; diff -r 000000000000 -r a2f0a2c135cf Cassandra/lib/Thrift.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Cassandra/lib/Thrift.pm Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,177 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +our $VERSION = '0.1'; + +require 5.6.0; +use strict; +use warnings; + +# +# Data types that can be sent via Thrift +# +package TType; +use constant STOP => 0; +use constant VOID => 1; +use constant BOOL => 2; +use constant BYTE => 3; +use constant I08 => 3; +use constant DOUBLE => 4; +use constant I16 => 6; +use constant I32 => 8; +use constant I64 => 10; +use constant STRING => 11; +use constant UTF7 => 11; +use constant STRUCT => 12; +use constant MAP => 13; +use constant SET => 14; +use constant LIST => 15; +use constant UTF8 => 16; +use constant UTF16 => 17; +1; + +# +# Message types for RPC +# +package TMessageType; +use constant CALL => 1; +use constant REPLY => 2; +use constant EXCEPTION => 3; +use constant ONEWAY => 4; +1; + +package Thrift::TException; + +sub new { + my $classname = shift; + my $self = {message => shift, code => shift || 0}; + + return bless($self,$classname); +} +1; + +package TApplicationException; +use base('Thrift::TException'); + +use constant UNKNOWN => 0; +use constant UNKNOWN_METHOD => 1; +use constant INVALID_MESSAGE_TYPE => 2; +use constant WRONG_METHOD_NAME => 3; +use constant BAD_SEQUENCE_ID => 4; +use constant MISSING_RESULT => 5; + +sub new { + my $classname = shift; + + my $self = $classname->SUPER::new(); + + return bless($self,$classname); +} + +sub read { + my $self = shift; + my $input = shift; + + my $xfer = 0; + my $fname = undef; + my $ftype = 0; + my $fid = 0; + + $xfer += $input->readStructBegin($fname); + + while (1) + { + $xfer += $input->readFieldBegin($fname, $ftype, $fid); + if ($ftype == TType::STOP) { + last; next; + } + + SWITCH: for($fid) + { + /1/ && do{ + + if ($ftype == TType::STRING) { + $xfer += $input->readString($self->{message}); + } else { + $xfer += $input->skip($ftype); + } + + last; + }; + + /2/ && do{ + if ($ftype == TType::I32) { + $xfer += $input->readI32($self->{code}); + } else { + $xfer += $input->skip($ftype); + } + last; + }; + + $xfer += $input->skip($ftype); + } + + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); + + return $xfer; +} + +sub write { + my $self = shift; + my $output = shift; + + my $xfer = 0; + + $xfer += $output->writeStructBegin('TApplicationException'); + + if ($self->getMessage()) { + $xfer += $output->writeFieldBegin('message', TType::STRING, 1); + $xfer += $output->writeString($self->getMessage()); + $xfer += $output->writeFieldEnd(); + } + + if ($self->getCode()) { + $xfer += $output->writeFieldBegin('type', TType::I32, 2); + $xfer += $output->writeI32($self->getCode()); + $xfer += $output->writeFieldEnd(); + } + + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + + return $xfer; +} + +sub getMessage +{ + my $self = shift; + + return $self->{message}; +} + +sub getCode +{ + my $self = shift; + + return $self->{code}; +} + +1; diff -r 000000000000 -r a2f0a2c135cf Cassandra/lib/Thrift/BinaryProtocol.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Cassandra/lib/Thrift/BinaryProtocol.pm Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,498 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +require 5.6.0; + +use strict; +use warnings; + +use utf8; +use Encode; + +use Thrift; +use Thrift::Protocol; + +use Bit::Vector; + +# +# Binary implementation of the Thrift protocol. +# +package Thrift::BinaryProtocol; +use base('Thrift::Protocol'); + +use constant VERSION_MASK => 0xffff0000; +use constant VERSION_1 => 0x80010000; + +sub new +{ + my $classname = shift; + my $trans = shift; + my $self = $classname->SUPER::new($trans); + + return bless($self,$classname); +} + +sub writeMessageBegin +{ + my $self = shift; + my ($name, $type, $seqid) = @_; + + return + $self->writeI32(VERSION_1 | $type) + + $self->writeString($name) + + $self->writeI32($seqid); +} + +sub writeMessageEnd +{ + my $self = shift; + return 0; +} + +sub writeStructBegin{ + my $self = shift; + my $name = shift; + return 0; +} + +sub writeStructEnd +{ + my $self = shift; + return 0; +} + +sub writeFieldBegin +{ + my $self = shift; + my ($fieldName, $fieldType, $fieldId) = @_; + + return + $self->writeByte($fieldType) + + $self->writeI16($fieldId); +} + +sub writeFieldEnd +{ + my $self = shift; + return 0; +} + +sub writeFieldStop +{ + my $self = shift; + return $self->writeByte(TType::STOP); +} + +sub writeMapBegin +{ + my $self = shift; + my ($keyType, $valType, $size) = @_; + + return + $self->writeByte($keyType) + + $self->writeByte($valType) + + $self->writeI32($size); +} + +sub writeMapEnd +{ + my $self = shift; + return 0; +} + +sub writeListBegin +{ + my $self = shift; + my ($elemType, $size) = @_; + + return + $self->writeByte($elemType) + + $self->writeI32($size); +} + +sub writeListEnd +{ + my $self = shift; + return 0; +} + +sub writeSetBegin +{ + my $self = shift; + my ($elemType, $size) = @_; + + return + $self->writeByte($elemType) + + $self->writeI32($size); +} + +sub writeSetEnd +{ + my $self = shift; + return 0; +} + +sub writeBool +{ + my $self = shift; + my $value = shift; + + my $data = pack('c', $value ? 1 : 0); + $self->{trans}->write($data, 1); + return 1; +} + +sub writeByte +{ + my $self = shift; + my $value= shift; + + my $data = pack('c', $value); + $self->{trans}->write($data, 1); + return 1; +} + +sub writeI16 +{ + my $self = shift; + my $value= shift; + + my $data = pack('n', $value); + $self->{trans}->write($data, 2); + return 2; +} + +sub writeI32 +{ + my $self = shift; + my $value= shift; + + my $data = pack('N', $value); + $self->{trans}->write($data, 4); + return 4; +} + +sub writeI64 +{ + my $self = shift; + my $value= shift; + my $data; + + my $vec; + #stop annoying error + $vec = Bit::Vector->new_Dec(64, $value); + $data = pack 'NN', $vec->Chunk_Read(32, 32), $vec->Chunk_Read(32, 0); + + $self->{trans}->write($data, 8); + + return 8; +} + + +sub writeDouble +{ + my $self = shift; + my $value= shift; + + my $data = pack('d', $value); + $self->{trans}->write(scalar reverse($data), 8); + return 8; +} + +sub writeString{ + my $self = shift; + my $value= shift; + + if( utf8::is_utf8($value) ){ + $value = Encode::encode_utf8($value); + } + + my $len = length($value); + + my $result = $self->writeI32($len); + + if ($len) { + $self->{trans}->write($value,$len); + } + return $result + $len; + } + + +# +#All references +# +sub readMessageBegin +{ + my $self = shift; + my ($name, $type, $seqid) = @_; + + my $version = 0; + my $result = $self->readI32(\$version); + if (($version & VERSION_MASK) > 0) { + if (($version & VERSION_MASK) != VERSION_1) { + die new Thrift::TException('Missing version identifier') + } + $$type = $version & 0x000000ff; + return + $result + + $self->readString($name) + + $self->readI32($seqid); + } else { # old client support code + return + $result + + $self->readStringBody($name, $version) + # version here holds the size of the string + $self->readByte($type) + + $self->readI32($seqid); + } +} + +sub readMessageEnd +{ + my $self = shift; + return 0; +} + +sub readStructBegin +{ + my $self = shift; + my $name = shift; + + $$name = ''; + + return 0; +} + +sub readStructEnd +{ + my $self = shift; + return 0; +} + +sub readFieldBegin +{ + my $self = shift; + my ($name, $fieldType, $fieldId) = @_; + + my $result = $self->readByte($fieldType); + + if ($$fieldType == TType::STOP) { + $$fieldId = 0; + return $result; + } + + $result += $self->readI16($fieldId); + + return $result; +} + +sub readFieldEnd() { + my $self = shift; + return 0; +} + +sub readMapBegin +{ + my $self = shift; + my ($keyType, $valType, $size) = @_; + + return + $self->readByte($keyType) + + $self->readByte($valType) + + $self->readI32($size); +} + +sub readMapEnd() +{ + my $self = shift; + return 0; +} + +sub readListBegin +{ + my $self = shift; + my ($elemType, $size) = @_; + + return + $self->readByte($elemType) + + $self->readI32($size); +} + +sub readListEnd +{ + my $self = shift; + return 0; +} + +sub readSetBegin +{ + my $self = shift; + my ($elemType, $size) = @_; + + return + $self->readByte($elemType) + + $self->readI32($size); +} + +sub readSetEnd +{ + my $self = shift; + return 0; +} + +sub readBool +{ + my $self = shift; + my $value = shift; + + my $data = $self->{trans}->readAll(1); + my @arr = unpack('c', $data); + $$value = $arr[0] == 1; + return 1; +} + +sub readByte +{ + my $self = shift; + my $value = shift; + + my $data = $self->{trans}->readAll(1); + my @arr = unpack('c', $data); + $$value = $arr[0]; + return 1; +} + +sub readI16 +{ + my $self = shift; + my $value = shift; + + my $data = $self->{trans}->readAll(2); + + my @arr = unpack('n', $data); + + $$value = $arr[0]; + + if ($$value > 0x7fff) { + $$value = 0 - (($$value - 1) ^ 0xffff); + } + + return 2; +} + +sub readI32 +{ + my $self = shift; + my $value= shift; + + my $data = $self->{trans}->readAll(4); + my @arr = unpack('N', $data); + + $$value = $arr[0]; + if ($$value > 0x7fffffff) { + $$value = 0 - (($$value - 1) ^ 0xffffffff); + } + return 4; +} + +sub readI64 +{ + my $self = shift; + my $value = shift; + + my $data = $self->{trans}->readAll(8); + + my ($hi,$lo)=unpack('NN',$data); + + my $vec = new Bit::Vector(64); + + $vec->Chunk_Store(32,32,$hi); + $vec->Chunk_Store(32,0,$lo); + + $$value = $vec->to_Dec(); + + return 8; +} + +sub readDouble +{ + my $self = shift; + my $value = shift; + + my $data = scalar reverse($self->{trans}->readAll(8)); + my @arr = unpack('d', $data); + + $$value = $arr[0]; + + return 8; +} + +sub readString +{ + my $self = shift; + my $value = shift; + + my $len; + my $result = $self->readI32(\$len); + + if ($len) { + $$value = $self->{trans}->readAll($len); + } else { + $$value = ''; + } + + return $result + $len; +} + +sub readStringBody +{ + my $self = shift; + my $value = shift; + my $len = shift; + + if ($len) { + $$value = $self->{trans}->readAll($len); + } else { + $$value = ''; + } + + return $len; +} + +# +# Binary Protocol Factory +# +package Thrift::BinaryProtocolFactory; +use base('TProtocolFactory'); + +sub new +{ + my $classname = shift; + my $self = $classname->SUPER::new(); + + return bless($self,$classname); +} + +sub getProtocol{ + my $self = shift; + my $trans = shift; + + return new Thrift::BinaryProtocol($trans); +} + +1; diff -r 000000000000 -r a2f0a2c135cf Cassandra/lib/Thrift/BufferedTransport.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Cassandra/lib/Thrift/BufferedTransport.pm Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,136 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +require 5.6.0; +use strict; +use warnings; + +use Thrift; +use Thrift::Transport; + +package Thrift::BufferedTransport; +use base('Thrift::Transport'); + +sub new +{ + my $classname = shift; + my $transport = shift; + my $rBufSize = shift || 512; + my $wBufSize = shift || 512; + + my $self = { + transport => $transport, + rBufSize => $rBufSize, + wBufSize => $wBufSize, + wBuf => '', + rBuf => '', + }; + + return bless($self,$classname); +} + +sub isOpen +{ + my $self = shift; + + return $self->{transport}->isOpen(); +} + +sub open +{ + my $self = shift; + $self->{transport}->open(); +} + +sub close() +{ + my $self = shift; + $self->{transport}->close(); +} + +sub readAll +{ + my $self = shift; + my $len = shift; + + return $self->{transport}->readAll($len); +} + +sub read +{ + my $self = shift; + my $len = shift; + my $ret; + + # Methinks Perl is already buffering these for us + return $self->{transport}->read($len); +} + +sub write +{ + my $self = shift; + my $buf = shift; + + $self->{wBuf} .= $buf; + if (length($self->{wBuf}) >= $self->{wBufSize}) { + $self->{transport}->write($self->{wBuf}); + $self->{wBuf} = ''; + } +} + +sub flush +{ + my $self = shift; + + if (length($self->{wBuf}) > 0) { + $self->{transport}->write($self->{wBuf}); + $self->{wBuf} = ''; + } + $self->{transport}->flush(); +} + + +# +# BufferedTransport factory creates buffered transport objects from transports +# +package Thrift::BufferedTransportFactory; + +sub new { + my $classname = shift; + my $self = {}; + + return bless($self,$classname); +} + +# +# Build a buffered transport from the base transport +# +# @return Thrift::BufferedTransport transport +# +sub getTransport +{ + my $self = shift; + my $trans = shift; + + my $buffered = Thrift::BufferedTransport->new($trans); + return $buffered; +} + + +1; diff -r 000000000000 -r a2f0a2c135cf Cassandra/lib/Thrift/FramedTransport.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Cassandra/lib/Thrift/FramedTransport.pm Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,164 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +use strict; +use warnings; + +use Thrift; +use Thrift::Transport; + +# +# Framed transport. Writes and reads data in chunks that are stamped with +# their length. +# +# @package thrift.transport +# +package Thrift::FramedTransport; + +use base('Thrift::Transport'); + +sub new +{ + my $classname = shift; + my $transport = shift; + my $read = shift || 1; + my $write = shift || 1; + + my $self = { + transport => $transport, + read => $read, + write => $write, + wBuf => '', + rBuf => '', + }; + + return bless($self,$classname); +} + +sub isOpen +{ + my $self = shift; + return $self->{transport}->isOpen(); +} + +sub open +{ + my $self = shift; + + $self->{transport}->open(); +} + +sub close +{ + my $self = shift; + + $self->{transport}->close(); +} + +# +# Reads from the buffer. When more data is required reads another entire +# chunk and serves future reads out of that. +# +# @param int $len How much data +# +sub read +{ + + my $self = shift; + my $len = shift; + + if (!$self->{read}) { + return $self->{transport}->read($len); + } + + if (length($self->{rBuf}) == 0) { + $self->_readFrame(); + } + + + # Just return full buff + if ($len > length($self->{rBuf})) { + my $out = $self->{rBuf}; + $self->{rBuf} = ''; + return $out; + } + + # Return substr + my $out = substr($self->{rBuf}, 0, $len); + $self->{rBuf} = substr($self->{rBuf}, $len); + return $out; +} + +# +# Reads a chunk of data into the internal read buffer. +# (private) +sub _readFrame +{ + my $self = shift; + my $buf = $self->{transport}->readAll(4); + my @val = unpack('N', $buf); + my $sz = $val[0]; + + $self->{rBuf} = $self->{transport}->readAll($sz); +} + +# +# Writes some data to the pending output buffer. +# +# @param string $buf The data +# @param int $len Limit of bytes to write +# +sub write +{ + my $self = shift; + my $buf = shift; + my $len = shift; + + unless($self->{write}) { + return $self->{transport}->write($buf, $len); + } + + if ( defined $len && $len < length($buf)) { + $buf = substr($buf, 0, $len); + } + + $self->{wBuf} .= $buf; + } + +# +# Writes the output buffer to the stream in the format of a 4-byte length +# followed by the actual data. +# +sub flush +{ + my $self = shift; + + unless ($self->{write}) { + return $self->{transport}->flush(); + } + + my $out = pack('N', length($self->{wBuf})); + $out .= $self->{wBuf}; + $self->{transport}->write($out); + $self->{transport}->flush(); + $self->{wBuf} = ''; + +} + +1; diff -r 000000000000 -r a2f0a2c135cf Cassandra/lib/Thrift/HttpClient.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Cassandra/lib/Thrift/HttpClient.pm Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,200 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +require 5.6.0; +use strict; +use warnings; + +use Thrift; +use Thrift::Transport; + +use HTTP::Request; +use LWP::UserAgent; +use IO::String; + +package Thrift::HttpClient; + +use base('Thrift::Transport'); + +sub new +{ + my $classname = shift; + my $url = shift || 'http://localhost:9090'; + my $debugHandler = shift; + + my $out = IO::String->new; + binmode($out); + + my $self = { + url => $url, + out => $out, + debugHandler => $debugHandler, + debug => 0, + sendTimeout => 100, + recvTimeout => 750, + handle => undef, + }; + + return bless($self,$classname); +} + +sub setSendTimeout +{ + my $self = shift; + my $timeout = shift; + + $self->{sendTimeout} = $timeout; +} + +sub setRecvTimeout +{ + my $self = shift; + my $timeout = shift; + + $self->{recvTimeout} = $timeout; +} + + +# +#Sets debugging output on or off +# +# @param bool $debug +# +sub setDebug +{ + my $self = shift; + my $debug = shift; + + $self->{debug} = $debug; +} + +# +# Tests whether this is open +# +# @return bool true if the socket is open +# +sub isOpen +{ + return 1; +} + +sub open {} + +# +# Cleans up the buffer. +# +sub close +{ + my $self = shift; + if (defined($self->{io})) { + close($self->{io}); + $self->{io} = undef; + } +} + +# +# Guarantees that the full amount of data is read. +# +# @return string The data, of exact length +# @throws TTransportException if cannot read data +# +sub readAll +{ + my $self = shift; + my $len = shift; + + my $buf = $self->read($len); + + if (!defined($buf)) { + die new Thrift::TException('TSocket: Could not read '.$len.' bytes from input buffer'); + } + return $buf; +} + +# +# Read and return string +# +sub read +{ + my $self = shift; + my $len = shift; + + my $buf; + + my $in = $self->{in}; + + if (!defined($in)) { + die new Thrift::TException("Response buffer is empty, no request."); + } + eval { + my $ret = sysread($in, $buf, $len); + if (! defined($ret)) { + die new Thrift::TException("No more data available."); + } + }; if($@){ + die new Thrift::TException($@); + } + + return $buf; +} + +# +# Write string +# +sub write +{ + my $self = shift; + my $buf = shift; + $self->{out}->print($buf); +} + +# +# Flush output (do the actual HTTP/HTTPS request) +# +sub flush +{ + my $self = shift; + + my $ua = LWP::UserAgent->new('timeout' => ($self->{sendTimeout} / 1000), + 'agent' => 'Perl/THttpClient' + ); + $ua->default_header('Accept' => 'application/x-thrift'); + $ua->default_header('Content-Type' => 'application/x-thrift'); + $ua->cookie_jar({}); # hash to remember cookies between redirects + + my $out = $self->{out}; + $out->setpos(0); # rewind + my $buf = join('', <$out>); + + my $request = new HTTP::Request(POST => $self->{url}, undef, $buf); + my $response = $ua->request($request); + my $content_ref = $response->content_ref; + + my $in = IO::String->new($content_ref); + binmode($in); + $self->{in} = $in; + $in->setpos(0); # rewind + + # reset write buffer + $out = IO::String->new; + binmode($out); + $self->{out} = $out; +} + +1; diff -r 000000000000 -r a2f0a2c135cf Cassandra/lib/Thrift/MemoryBuffer.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Cassandra/lib/Thrift/MemoryBuffer.pm Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,146 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +require 5.6.0; +use strict; +use warnings; + +use Thrift; +use Thrift::Transport; + +package Thrift::MemoryBuffer; +use base('Thrift::Transport'); + +sub new +{ + my $classname = shift; + + my $bufferSize= shift || 1024; + + my $self = { + buffer => '', + bufferSize=> $bufferSize, + wPos => 0, + rPos => 0, + }; + + return bless($self,$classname); +} + +sub isOpen +{ + return 1; +} + +sub open +{ + +} + +sub close +{ + +} + +sub peek +{ + my $self = shift; + return($self->{rPos} < $self->{wPos}); +} + + +sub getBuffer +{ + my $self = shift; + return $self->{buffer}; +} + +sub resetBuffer +{ + my $self = shift; + + my $new_buffer = shift || ''; + + $self->{buffer} = $new_buffer; + $self->{bufferSize} = length($new_buffer); + $self->{wPos} = length($new_buffer); + $self->{rPos} = 0; +} + +sub available +{ + my $self = shift; + return ($self->{wPos} - $self->{rPos}); +} + +sub read +{ + my $self = shift; + my $len = shift; + my $ret; + + my $avail = ($self->{wPos} - $self->{rPos}); + return '' if $avail == 0; + + #how much to give + my $give = $len; + $give = $avail if $avail < $len; + + $ret = substr($self->{buffer},$self->{rPos},$give); + + $self->{rPos} += $give; + + return $ret; +} + +sub readAll +{ + my $self = shift; + my $len = shift; + + my $avail = ($self->{wPos} - $self->{rPos}); + if ($avail < $len) { + die new TTransportException("Attempt to readAll($len) found only $avail available"); + } + + my $data = ''; + my $got = 0; + + while (($got = length($data)) < $len) { + $data .= $self->read($len - $got); + } + + return $data; +} + +sub write +{ + my $self = shift; + my $buf = shift; + + $self->{buffer} .= $buf; + $self->{wPos} += length($buf); +} + +sub flush +{ + +} + +1; diff -r 000000000000 -r a2f0a2c135cf Cassandra/lib/Thrift/Protocol.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Cassandra/lib/Thrift/Protocol.pm Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,543 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +require 5.6.0; +use strict; +use warnings; + +use Thrift; + +# +# Protocol exceptions +# +package TProtocolException; +use base('Thrift::TException'); + +use constant UNKNOWN => 0; +use constant INVALID_DATA => 1; +use constant NEGATIVE_SIZE => 2; +use constant SIZE_LIMIT => 3; +use constant BAD_VERSION => 4; + +sub new { + my $classname = shift; + + my $self = $classname->SUPER::new(); + + return bless($self,$classname); +} + +# +# Protocol base class module. +# +package Thrift::Protocol; + +sub new { + my $classname = shift; + my $self = {}; + + my $trans = shift; + $self->{trans}= $trans; + + return bless($self,$classname); +} + +sub getTransport +{ + my $self = shift; + + return $self->{trans}; +} + +# +# Writes the message header +# +# @param string $name Function name +# @param int $type message type TMessageType::CALL or TMessageType::REPLY +# @param int $seqid The sequence id of this message +# +sub writeMessageBegin +{ + my ($name, $type, $seqid); + die "abstract"; +} + +# +# Close the message +# +sub writeMessageEnd { + die "abstract"; +} + +# +# Writes a struct header. +# +# @param string $name Struct name +# @throws TException on write error +# @return int How many bytes written +# +sub writeStructBegin { + my ($name); + + die "abstract"; +} + +# +# Close a struct. +# +# @throws TException on write error +# @return int How many bytes written +# +sub writeStructEnd { + die "abstract"; +} + +# +# Starts a field. +# +# @param string $name Field name +# @param int $type Field type +# @param int $fid Field id +# @throws TException on write error +# @return int How many bytes written +# +sub writeFieldBegin { + my ($fieldName, $fieldType, $fieldId); + + die "abstract"; +} + +sub writeFieldEnd { + die "abstract"; +} + +sub writeFieldStop { + die "abstract"; +} + +sub writeMapBegin { + my ($keyType, $valType, $size); + + die "abstract"; +} + +sub writeMapEnd { + die "abstract"; +} + +sub writeListBegin { + my ($elemType, $size); + die "abstract"; +} + +sub writeListEnd { + die "abstract"; +} + +sub writeSetBegin { + my ($elemType, $size); + die "abstract"; +} + +sub writeSetEnd { + die "abstract"; +} + +sub writeBool { + my ($bool); + die "abstract"; +} + +sub writeByte { + my ($byte); + die "abstract"; +} + +sub writeI16 { + my ($i16); + die "abstract"; +} + +sub writeI32 { + my ($i32); + die "abstract"; +} + +sub writeI64 { + my ($i64); + die "abstract"; +} + +sub writeDouble { + my ($dub); + die "abstract"; +} + +sub writeString +{ + my ($str); + die "abstract"; +} + +# +# Reads the message header +# +# @param string $name Function name +# @param int $type message type TMessageType::CALL or TMessageType::REPLY +# @parem int $seqid The sequence id of this message +# +sub readMessageBegin +{ + my ($name, $type, $seqid); + die "abstract"; +} + +# +# Read the close of message +# +sub readMessageEnd +{ + die "abstract"; +} + +sub readStructBegin +{ + my($name); + + die "abstract"; +} + +sub readStructEnd +{ + die "abstract"; +} + +sub readFieldBegin +{ + my ($name, $fieldType, $fieldId); + die "abstract"; +} + +sub readFieldEnd +{ + die "abstract"; +} + +sub readMapBegin +{ + my ($keyType, $valType, $size); + die "abstract"; +} + +sub readMapEnd +{ + die "abstract"; +} + +sub readListBegin +{ + my ($elemType, $size); + die "abstract"; +} + +sub readListEnd +{ + die "abstract"; +} + +sub readSetBegin +{ + my ($elemType, $size); + die "abstract"; +} + +sub readSetEnd +{ + die "abstract"; +} + +sub readBool +{ + my ($bool); + die "abstract"; +} + +sub readByte +{ + my ($byte); + die "abstract"; +} + +sub readI16 +{ + my ($i16); + die "abstract"; +} + +sub readI32 +{ + my ($i32); + die "abstract"; +} + +sub readI64 +{ + my ($i64); + die "abstract"; +} + +sub readDouble +{ + my ($dub); + die "abstract"; +} + +sub readString +{ + my ($str); + die "abstract"; +} + +# +# The skip function is a utility to parse over unrecognized data without +# causing corruption. +# +# @param TType $type What type is it +# +sub skip +{ + my $self = shift; + my $type = shift; + + my $ref; + my $result; + my $i; + + if($type == TType::BOOL) + { + return $self->readBool(\$ref); + } + elsif($type == TType::BYTE){ + return $self->readByte(\$ref); + } + elsif($type == TType::I16){ + return $self->readI16(\$ref); + } + elsif($type == TType::I32){ + return $self->readI32(\$ref); + } + elsif($type == TType::I64){ + return $self->readI64(\$ref); + } + elsif($type == TType::DOUBLE){ + return $self->readDouble(\$ref); + } + elsif($type == TType::STRING) + { + return $self->readString(\$ref); + } + elsif($type == TType::STRUCT) + { + $result = $self->readStructBegin(\$ref); + while (1) { + my ($ftype,$fid); + $result += $self->readFieldBegin(\$ref, \$ftype, \$fid); + if ($ftype == TType::STOP) { + last; + } + $result += $self->skip($ftype); + $result += $self->readFieldEnd(); + } + $result += $self->readStructEnd(); + return $result; + } + elsif($type == TType::MAP) + { + my($keyType,$valType,$size); + $result = $self->readMapBegin(\$keyType, \$valType, \$size); + for ($i = 0; $i < $size; $i++) { + $result += $self->skip($keyType); + $result += $self->skip($valType); + } + $result += $self->readMapEnd(); + return $result; + } + elsif($type == TType::SET) + { + my ($elemType,$size); + $result = $self->readSetBegin(\$elemType, \$size); + for ($i = 0; $i < $size; $i++) { + $result += $self->skip($elemType); + } + $result += $self->readSetEnd(); + return $result; + } + elsif($type == TType::LIST) + { + my ($elemType,$size); + $result = $self->readListBegin(\$elemType, \$size); + for ($i = 0; $i < $size; $i++) { + $result += $self->skip($elemType); + } + $result += $self->readListEnd(); + return $result; + } + + + return 0; + + } + +# +# Utility for skipping binary data +# +# @param TTransport $itrans TTransport object +# @param int $type Field type +# +sub skipBinary +{ + my $self = shift; + my $itrans = shift; + my $type = shift; + + if($type == TType::BOOL) + { + return $itrans->readAll(1); + } + elsif($type == TType::BYTE) + { + return $itrans->readAll(1); + } + elsif($type == TType::I16) + { + return $itrans->readAll(2); + } + elsif($type == TType::I32) + { + return $itrans->readAll(4); + } + elsif($type == TType::I64) + { + return $itrans->readAll(8); + } + elsif($type == TType::DOUBLE) + { + return $itrans->readAll(8); + } + elsif( $type == TType::STRING ) + { + my @len = unpack('N', $itrans->readAll(4)); + my $len = $len[0]; + if ($len > 0x7fffffff) { + $len = 0 - (($len - 1) ^ 0xffffffff); + } + return 4 + $itrans->readAll($len); + } + elsif( $type == TType::STRUCT ) + { + my $result = 0; + while (1) { + my $ftype = 0; + my $fid = 0; + my $data = $itrans->readAll(1); + my @arr = unpack('c', $data); + $ftype = $arr[0]; + if ($ftype == TType::STOP) { + last; + } + # I16 field id + $result += $itrans->readAll(2); + $result += $self->skipBinary($itrans, $ftype); + } + return $result; + } + elsif($type == TType::MAP) + { + # Ktype + my $data = $itrans->readAll(1); + my @arr = unpack('c', $data); + my $ktype = $arr[0]; + # Vtype + $data = $itrans->readAll(1); + @arr = unpack('c', $data); + my $vtype = $arr[0]; + # Size + $data = $itrans->readAll(4); + @arr = unpack('N', $data); + my $size = $arr[0]; + if ($size > 0x7fffffff) { + $size = 0 - (($size - 1) ^ 0xffffffff); + } + my $result = 6; + for (my $i = 0; $i < $size; $i++) { + $result += $self->skipBinary($itrans, $ktype); + $result += $self->skipBinary($itrans, $vtype); + } + return $result; + } + elsif($type == TType::SET || $type == TType::LIST) + { + # Vtype + my $data = $itrans->readAll(1); + my @arr = unpack('c', $data); + my $vtype = $arr[0]; + # Size + $data = $itrans->readAll(4); + @arr = unpack('N', $data); + my $size = $arr[0]; + if ($size > 0x7fffffff) { + $size = 0 - (($size - 1) ^ 0xffffffff); + } + my $result = 5; + for (my $i = 0; $i < $size; $i++) { + $result += $self->skipBinary($itrans, $vtype); + } + return $result; + } + + return 0; + +} + +# +# Protocol factory creates protocol objects from transports +# +package TProtocolFactory; + + +sub new { + my $classname = shift; + my $self = {}; + + return bless($self,$classname); +} + +# +# Build a protocol from the base transport +# +# @return TProtcol protocol +# +sub getProtocol +{ + my ($trans); + die "interface"; +} + + +1; diff -r 000000000000 -r a2f0a2c135cf Cassandra/lib/Thrift/Server.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Cassandra/lib/Thrift/Server.pm Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,313 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +require 5.6.0; +use strict; +use warnings; + +use Thrift; +use Thrift::BufferedTransport; +use Thrift::BinaryProtocol; + +# +# Server base class module +# +package Thrift::Server; + +# 3 possible constructors: +# 1. (processor, serverTransport) +# 2. (processor, serverTransport, transportFactory, protocolFactory) +# 3. (processor, serverTransport, +# inputTransportFactory, outputTransportFactory, +# inputProtocolFactory, outputProtocolFactory) +sub new +{ + my $classname = shift; + my @args = @_; + + my $self; + + if (scalar @args == 2) + { + $self = _init($args[0], $args[1], + Thrift::BufferedTransportFactory->new(), + Thrift::BufferedTransportFactory->new(), + Thrift::BinaryProtocolFactory->new(), + Thrift::BinaryProtocolFactory->new()); + } + elsif (scalar @args == 4) + { + $self = _init($args[0], $args[1], $args[2], $args[2], $args[3], $args[3]); + } + elsif (scalar @args == 6) + { + $self = _init($args[0], $args[1], $args[2], $args[3], $args[4], $args[5]); + } + else + { + die "Thrift::Server expects exactly 2, 4, or 6 args"; + } + + return bless($self,$classname); +} + +sub _init +{ + my $processor = shift; + my $serverTransport = shift; + my $inputTransportFactory = shift; + my $outputTransportFactory = shift; + my $inputProtocolFactory = shift; + my $outputProtocolFactory = shift; + + my $self = { + processor => $processor, + serverTransport => $serverTransport, + inputTransportFactory => $inputTransportFactory, + outputTransportFactory => $outputTransportFactory, + inputProtocolFactory => $inputProtocolFactory, + outputProtocolFactory => $outputProtocolFactory, + }; +} + +sub serve +{ + die "abstract"; +} + +sub _clientBegin +{ + my $self = shift; + my $iprot = shift; + my $oprot = shift; + + if (exists $self->{serverEventHandler} and + defined $self->{serverEventHandler}) + { + $self->{serverEventHandler}->clientBegin($iprot, $oprot); + } +} + +sub _handleException +{ + my $self = shift; + my $e = shift; + + if ($e =~ m/TException/ and exists $e->{message}) { + my $message = $e->{message}; + my $code = $e->{code}; + my $out = $code . ':' . $message; + + $message =~ m/TTransportException/ and die $out; + if ($message =~ m/TSocket/) { + # suppress TSocket messages + } else { + warn $out; + } + } else { + warn $e; + } +} + + +# +# SimpleServer from the Server base class that handles one connection at a time +# +package Thrift::SimpleServer; +use base qw( Thrift::Server ); + +sub new +{ + my $classname = shift; + my @args = @_; + + my $self = $classname->SUPER::new(@args); + return bless($self,$classname); +} + +sub serve +{ + my $self = shift; + + $self->{serverTransport}->listen(); + while (1) + { + my $client = $self->{serverTransport}->accept(); + my $itrans = $self->{inputTransportFactory}->getTransport($client); + my $otrans = $self->{outputTransportFactory}->getTransport($client); + my $iprot = $self->{inputProtocolFactory}->getProtocol($itrans); + my $oprot = $self->{outputProtocolFactory}->getProtocol($otrans); + eval { + $self->_clientBegin($iprot, $oprot); + while (1) + { + $self->{processor}->process($iprot, $oprot); + } + }; if($@) { + $self->_handleException($@); + } + + $itrans->close(); + $otrans->close(); + } +} + + +# +# ForkingServer that forks a new process for each request +# +package Thrift::ForkingServer; +use base qw( Thrift::Server ); + +use POSIX ":sys_wait_h"; + +sub new +{ + my $classname = shift; + my @args = @_; + + my $self = $classname->SUPER::new(@args); + return bless($self,$classname); +} + + +sub serve +{ + my $self = shift; + + $self->{serverTransport}->listen(); + while (1) + { + my $client = $self->{serverTransport}->accept(); + $self->_client($client); + } +} + +sub _client +{ + my $self = shift; + my $client = shift; + + eval { + my $itrans = $self->{inputTransportFactory}->getTransport($client); + my $otrans = $self->{outputTransportFactory}->getTransport($client); + + my $iprot = $self->{inputProtocolFactory}->getProtocol($itrans); + my $oprot = $self->{outputProtocolFactory}->getProtocol($otrans); + + $self->_clientBegin($iprot, $oprot); + + my $pid = fork(); + + if ($pid) #parent + { + $self->_parent($pid, $itrans, $otrans); + } else { + $self->_child($itrans, $otrans, $iprot, $oprot); + } + }; if($@) { + $self->_handleException($@); + } +} + +sub _parent +{ + my $self = shift; + my $pid = shift; + my $itrans = shift; + my $otrans = shift; + + # add before collect, otherwise you race w/ waitpid + $self->{children}->{$pid} = 1; + $self->_collectChildren(); + + # Parent must close socket or the connection may not get closed promptly + $self->tryClose($itrans); + $self->tryClose($otrans); +} + +sub _child +{ + my $self = shift; + my $itrans = shift; + my $otrans = shift; + my $iprot = shift; + my $oprot = shift; + + my $ecode = 0; + eval { + while (1) + { + $self->{processor}->process($iprot, $oprot); + } + }; if($@) { + $ecode = 1; + $self->_handleException($@); + } + + $self->tryClose($itrans); + $self->tryClose($otrans); + + exit($ecode); +} + +sub tryClose +{ + my $self = shift; + my $file = shift; + + eval { + if (defined $file) + { + $file->close(); + } + }; if($@) { + if ($@ =~ m/TException/ and exists $@->{message}) { + my $message = $@->{message}; + my $code = $@->{code}; + my $out = $code . ':' . $message; + + warn $out; + } else { + warn $@; + } + } +} + +sub _collectChildren +{ + my $self = shift; + + while (scalar keys %{$self->{children}}) + { + my $pid = waitpid(-1, WNOHANG); + + if ($pid>0) + { + delete $self->{children}->{$pid}; + } + else + { + last; + } + } +} + + +1; diff -r 000000000000 -r a2f0a2c135cf Cassandra/lib/Thrift/Socket.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Cassandra/lib/Thrift/Socket.pm Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,330 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +require 5.6.0; +use strict; +use warnings; + +use Thrift; +use Thrift::Transport; + +use IO::Socket::INET; +use IO::Select; + +package Thrift::Socket; + +use base('Thrift::Transport'); + +sub new +{ + my $classname = shift; + my $host = shift || "localhost"; + my $port = shift || 9090; + my $debugHandler = shift; + + my $self = { + host => $host, + port => $port, + debugHandler => $debugHandler, + debug => 0, + sendTimeout => 10000, + recvTimeout => 10000, + handle => undef, + }; + + return bless($self,$classname); +} + + +sub setSendTimeout +{ + my $self = shift; + my $timeout = shift; + + $self->{sendTimeout} = $timeout; +} + +sub setRecvTimeout +{ + my $self = shift; + my $timeout = shift; + + $self->{recvTimeout} = $timeout; +} + + +# +#Sets debugging output on or off +# +# @param bool $debug +# +sub setDebug +{ + my $self = shift; + my $debug = shift; + + $self->{debug} = $debug; +} + +# +# Tests whether this is open +# +# @return bool true if the socket is open +# +sub isOpen +{ + my $self = shift; + + if( defined $self->{handle} ){ + return ($self->{handle}->handles())[0]->connected; + } + + return 0; +} + +# +# Connects the socket. +# +sub open +{ + my $self = shift; + + my $sock = IO::Socket::INET->new(PeerAddr => $self->{host}, + PeerPort => $self->{port}, + Proto => 'tcp', + Timeout => $self->{sendTimeout}/1000) + || do { + my $error = 'TSocket: Could not connect to '.$self->{host}.':'.$self->{port}.' ('.$!.')'; + + if ($self->{debug}) { + $self->{debugHandler}->($error); + } + + die new Thrift::TException($error); + + }; + + + $self->{handle} = new IO::Select( $sock ); +} + +# +# Closes the socket. +# +sub close +{ + my $self = shift; + + if( defined $self->{handle} ){ + CORE::close( ($self->{handle}->handles())[0] ); + } +} + +# +# Uses stream get contents to do the reading +# +# @param int $len How many bytes +# @return string Binary data +# +sub readAll +{ + my $self = shift; + my $len = shift; + + + return unless defined $self->{handle}; + + my $pre = ""; + while (1) { + + #check for timeout + my @sockets = $self->{handle}->can_read( $self->{recvTimeout} / 1000 ); + + if(@sockets == 0){ + die new Thrift::TException('TSocket: timed out reading '.$len.' bytes from '. + $self->{host}.':'.$self->{port}); + } + + my $sock = $sockets[0]; + + my ($buf,$sz); + $sock->recv($buf, $len); + + if (!defined $buf || $buf eq '') { + + die new Thrift::TException('TSocket: Could not read '.$len.' bytes from '. + $self->{host}.':'.$self->{port}); + + } elsif (($sz = length($buf)) < $len) { + + $pre .= $buf; + $len -= $sz; + + } else { + return $pre.$buf; + } + } +} + +# +# Read from the socket +# +# @param int $len How many bytes +# @return string Binary data +# +sub read +{ + my $self = shift; + my $len = shift; + + return unless defined $self->{handle}; + + #check for timeout + my @sockets = $self->{handle}->can_read( $self->{recvTimeout} / 1000 ); + + if(@sockets == 0){ + die new Thrift::TException('TSocket: timed out reading '.$len.' bytes from '. + $self->{host}.':'.$self->{port}); + } + + my $sock = $sockets[0]; + + my ($buf,$sz); + $sock->recv($buf, $len); + + if (!defined $buf || $buf eq '') { + + die new TException('TSocket: Could not read '.$len.' bytes from '. + $self->{host}.':'.$self->{port}); + + } + + return $buf; +} + + +# +# Write to the socket. +# +# @param string $buf The data to write +# +sub write +{ + my $self = shift; + my $buf = shift; + + + return unless defined $self->{handle}; + + while (length($buf) > 0) { + + + #check for timeout + my @sockets = $self->{handle}->can_write( $self->{sendTimeout} / 1000 ); + + if(@sockets == 0){ + die new Thrift::TException('TSocket: timed out writing to bytes from '. + $self->{host}.':'.$self->{port}); + } + + my $sock = $sockets[0]; + + my $got = $sock->send($buf); + + if (!defined $got || $got == 0 ) { + die new Thrift::TException('TSocket: Could not write '.length($buf).' bytes '. + $self->{host}.':'.$self->{host}); + } + + $buf = substr($buf, $got); + } +} + +# +# Flush output to the socket. +# +sub flush +{ + my $self = shift; + + return unless defined $self->{handle}; + + my $ret = ($self->{handle}->handles())[0]->flush; +} + + +# +# Build a ServerSocket from the ServerTransport base class +# +package Thrift::ServerSocket; + +use base qw( Thrift::Socket Thrift::ServerTransport ); + +use constant LISTEN_QUEUE_SIZE => 128; + +sub new +{ + my $classname = shift; + my $port = shift; + + my $self = $classname->SUPER::new(undef, $port, undef); + return bless($self,$classname); +} + +sub listen +{ + my $self = shift; + + # Listen to a new socket + my $sock = IO::Socket::INET->new(LocalAddr => undef, # any addr + LocalPort => $self->{port}, + Proto => 'tcp', + Listen => LISTEN_QUEUE_SIZE, + ReuseAddr => 1) + || do { + my $error = 'TServerSocket: Could not bind to ' . + $self->{host} . ':' . $self->{port} . ' (' . $! . ')'; + + if ($self->{debug}) { + $self->{debugHandler}->($error); + } + + die new Thrift::TException($error); + }; + + $self->{handle} = $sock; +} + +sub accept +{ + my $self = shift; + + if ( exists $self->{handle} and defined $self->{handle} ) + { + my $client = $self->{handle}->accept(); + my $result = new Thrift::Socket; + $result->{handle} = new IO::Select($client); + return $result; + } + + return 0; +} + + +1; diff -r 000000000000 -r a2f0a2c135cf Cassandra/lib/Thrift/Transport.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Cassandra/lib/Thrift/Transport.pm Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,177 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +require 5.6.0; +use strict; +use warnings; + +use Thrift; + +# +# Transport exceptions +# +package TTransportException; +use base('Thrift::TException'); + +use constant UNKNOWN => 0; +use constant NOT_OPEN => 1; +use constant ALREADY_OPEN => 2; +use constant TIMED_OUT => 3; +use constant END_OF_FILE => 4; + +sub new{ + my $classname = shift; + my $self = $classname->SUPER::new(@_); + + return bless($self,$classname); +} + +package Thrift::Transport; + +# +# Whether this transport is open. +# +# @return boolean true if open +# +sub isOpen +{ + die "abstract"; +} + +# +# Open the transport for reading/writing +# +# @throws TTransportException if cannot open +# +sub open +{ + die "abstract"; +} + +# +# Close the transport. +# +sub close +{ + die "abstract"; +} + +# +# Read some data into the array. +# +# @param int $len How much to read +# @return string The data that has been read +# @throws TTransportException if cannot read any more data +# +sub read +{ + my ($len); + die("abstract"); +} + +# +# Guarantees that the full amount of data is read. +# +# @return string The data, of exact length +# @throws TTransportException if cannot read data +# +sub readAll +{ + my $self = shift; + my $len = shift; + + my $data = ''; + my $got = 0; + + while (($got = length($data)) < $len) { + $data .= $self->read($len - $got); + } + + return $data; +} + +# +# Writes the given data out. +# +# @param string $buf The data to write +# @throws TTransportException if writing fails +# +sub write +{ + my ($buf); + die "abstract"; +} + +# +# Flushes any pending data out of a buffer +# +# @throws TTransportException if a writing error occurs +# +sub flush {} + + +# +# TransportFactory creates transport objects from transports +# +package Thrift::TransportFactory; + +sub new { + my $classname = shift; + my $self = {}; + + return bless($self,$classname); +} + +# +# Build a transport from the base transport +# +# @return Thrift::Transport transport +# +sub getTransport +{ + my $self = shift; + my $trans = shift; + + return $trans; +} + + +# +# ServerTransport base class module +# +package Thrift::ServerTransport; + +sub listen +{ + die "abstract"; +} + +sub accept +{ + die "abstract"; +} + +sub close +{ + die "abstract"; +} + + +1; + diff -r 000000000000 -r a2f0a2c135cf Yuki/DiffText.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Yuki/DiffText.pm Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,90 @@ +package Yuki::DiffText; +use strict; +use Algorithm::Diff qw(traverse_sequences); +use vars qw($VERSION @EXPORT_OK @ISA); +use vars qw($diff_text $diff_msgrefA $diff_msgrefB @diff_deleted @diff_added); +require Exporter; +@ISA = qw(Exporter); +@EXPORT_OK = qw(difftext); +$VERSION = '0.1'; + +=head1 NAME + +Yuki::DiffText - A wrapper of Algorithm::Diff for YukiWiki. + +=head1 SYNOPSIS + + use strict; + use Yuki::DiffText qw(difftext); + + my @array1 = ( "Alice", "Bobby", "Chris", ); + my @array2 = ( "Alice", "Chris", "Diana", ); + my $difftext = difftext(\@array1, \@array2); + print $difftext; + + # Result: + # =Alice + # -Bobby + # =Chris + # +Diana + +=head1 SEE ALSO + +=over 4 + +=item L + +=back + +=head1 AUTHOR + +Hiroshi Yuki http://www.hyuki.com/ + +=head1 LICENSE + +Copyright (C) 2002 by Hiroshi Yuki. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=cut + +sub difftext { + ($diff_msgrefA, $diff_msgrefB) = @_; + undef $diff_text; + undef @diff_deleted; + undef @diff_added; + traverse_sequences( + $diff_msgrefA, $diff_msgrefB, + { + MATCH => \&df_match, + DISCARD_A => \&df_delete, + DISCARD_B => \&df_add, + } + ); + &diff_flush; + return $diff_text; +} + +sub diff_flush { + $diff_text .= join('', map { "-$_\n" } splice(@diff_deleted)); + $diff_text .= join('', map { "+$_\n" } splice(@diff_added)); +} + +sub df_match { + my ($a, $b) = @_; + &diff_flush; + $diff_text .= "=$diff_msgrefA->[$a]\n"; +} + +sub df_delete { + my ($a, $b) = @_; + push(@diff_deleted, $diff_msgrefA->[$a]); +} + +sub df_add { + my ($a, $b) = @_; + push(@diff_added, $diff_msgrefB->[$b]); +} + +1; diff -r 000000000000 -r a2f0a2c135cf Yuki/PluginManager.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Yuki/PluginManager.pm Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,150 @@ +package Yuki::PluginManager; + +use UNIVERSAL qw(can); + +# Be careful. +# use strict; +# no strict refs; + +my $VERSION = '0.2'; +my $DEBUG = 0; + +# +# Constructor of Yuki::PluginManager. +# +sub new { + my ($class, $context, @dirs) = @_; + my $self = { + # Maps plugin name to its filename. + pluginname_to_filename => {}, + # Listing of filter type plugins. + filter => [], + # Logs. + log => [], + # Plugin context given by YukiWiki plugin. + context => $context, + }; + # Search for plugins. + for my $dir (@dirs) { + for my $file (sort glob("$dir/*.pl")) { + if (-e($file)) { + my $pluginname = $file; + $pluginname =~ s/.*?(\w+?)\.pl$/$1/; + $self->{pluginname_to_filename}->{$pluginname} = $file; + if ($plugin =~ /^filter_/) { + push(@{$self->{filter}}, $plugin); + } + } + } + } + return bless $self, $class; +} + +# Calls plugin. +# $plugin is the plugin name, for example: 'amazon' +# $type is either 'inline', 'block', 'usage, or 'filter'. +# $argument is plugin dependent. +sub call { + my ($self, $plugin, $type, $argument) = @_; + my $file = $self->{pluginname_to_filename}->{$plugin}; + my $result = undef; + # + # my $funcname = "plugin_$type"; + # my $funcref = \&{"${plugin}::plugin_$type"}; + # my $namespace = \%{"${plugin}::"}; + # + # Does the plugin exist? + if ($file) { + eval { + require $file; + # Check if the function is defined or not. + # + # if (defined($namespace->{$funcname})) { + # $result = $funcref->($argument, $self->{context}); + # } else { + # push(@{$self->{log}}, "$funcname: undefined function."); + # } + # + my $funcname = "plugin_$type"; + my $funcref = can($plugin, $funcname); + if (defined($funcref)) { + $result = $funcref->($argument, $self->{context}); + } else { + push(@{$self->{log}}, "$funcname: undefined function."); + } + }; + if ($@) { + push(@{$self->{log}}, "$@"); + } + } else { + push(@{$self->{log}}, "$plugin: file for this plugin is not found."); + } + return $result; +} + +# Return undef if no replacement. +sub filter { + my ($self) = @_; + for my $plugin (@{$self->{filter}}) { + my $rawout = $self->call($plugin, 'filter', ''); + return $rawout if defined($rawout); + } + return undef; +} + +# Gather information of plugins. +sub usage { + my ($self) = @_; + my $usage_array_ref = []; + for my $plugin (sort keys %{$self->{pluginname_to_filename}}) { + my $usage_hash = $self->call($plugin, 'usage', ''); + if (defined($usage_hash)) { + push(@{$usage_array_ref}, $usage_hash); + } + } + return $usage_array_ref; +} + +1; +__END__ +=head1 NAME + +Yuki::PluginManager - Manages installed YukiWiki plugins. + +=head1 SYNOPSIS + + use strict; + use Yuki::PluginManager; + + my $plugin_manager = new Yuki::PluginManager($plugin_context, 'plugin/dir/'); + +=head1 DESCRIPTION + +Yuki::PluginManager is used by YukiWiki. + +=head1 METHODS + +=over 4 + +=item new($plugin_context, @dirs) + +=item call($self, $plugin, $type, $argument) + +It calls $plugin::plugin_$type($argument). + +=head1 SEE ALSO + +=back + +=head1 AUTHOR + +Hiroshi Yuki http://www.hyuki.com/ + +=head1 LICENSE + +Copyright (C) 2003, 2004 by Hiroshi Yuki. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=cut diff -r 000000000000 -r a2f0a2c135cf Yuki/RSS.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Yuki/RSS.pm Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,161 @@ +package Yuki::RSS; +use strict; +use vars qw($VERSION); + +$VERSION = '0.4a'; + +=head1 NAME + +Yuki::RSS - The smallest module to generate RSS 1.0. +It is downward compatible to XML::RSS. + +=head1 SYNOPSIS + + use strict; + use Yuki::RSS; + + my $rss = new Yuki::RSS( + version => '1.0', + encoding => 'Shift_JIS' + ); + + $rss->channel( + title => "Site Title", + link => "http://www.example.com/index.html", + about => "http://www.example.com/rss.rdf", + description => "The description of your site", + ); + + $rss->add_item( + title => "Item Title", + link => "http://www.example.com/item.html", + description => "Yoo, hoo, hoo", + dc_date => "2003-12-06T01:23:45+09:00", + ); + + print $rss->as_string; + +=head1 DESCRIPTION + +Yuki::RSS is the smallest RSS 1.0 generator. +This module helps you to create the minimum document of RSS 1.0. +If you need more than that, use XML::RSS. + +=head1 METHODS + +=over 4 + +=item new Yuki::RSS (version => $version, encoding => $encoding) + +Constructor for Yuki::RSS. +It returns a reference to a Yuki::RSS object. +B must be 1.0. +B will be inserted output document as a XML encoding. +This module does not convert to this encoding. + +=item add_item (title => $title, link => $link, description => $description, dc_date => $date) + +Adds an item to the Yuki::RSS object. + +=item as_string + +Returns the RSS string. + +=item channel (title => $title, about => $about, link => $link, description => $desc) + +Channel information of RSS. + +=head1 SEE ALSO + +=over 4 + +=item L + +=back + +=head1 AUTHOR + +Hiroshi Yuki http://www.hyuki.com/ + +=head1 LICENSE + +Copyright (C) 2001,2004 by Hiroshi Yuki. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=cut + +# The constructor. +sub new { + my ($class, %hash) = @_; + my $self = { + version => $hash{version}, + encoding => $hash{encoding}, + channel => { }, + items => [], + }; + return bless $self, $class; +} + +# Setting channel. +sub channel { + my ($self, %hash) = @_; + foreach (keys %hash) { + $self->{channel}->{$_} = $hash{$_}; + } + return $self->{channel}; +} + +# Adding item. +sub add_item { + my ($self, %hash) = @_; + push(@{$self->{items}}, \%hash); + return $self->{items}; +} + +# +sub as_string { + my ($self) = @_; + my $about = $self->{channel}->{about}; + $about = $self->{channel}->{link} unless ($about); + my $doc = <<"EOD"; +{encoding}" ?> + + + + + $self->{channel}->{title} + $self->{channel}->{link} + $self->{channel}->{description} + + + @{[ + map { + qq{ \n} + } @{$self->{items}} + ]} + + + +@{[ + map { + qq{ + + $_->{title} + $_->{link} + $_->{description} + $_->{dc_date} + + } + } @{$self->{items}} +]} + +EOD +} + +1; diff -r 000000000000 -r a2f0a2c135cf Yuki/YukiWikiDB.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Yuki/YukiWikiDB.pm Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,121 @@ +package Yuki::YukiWikiDB; + +use strict; +use Fcntl ':flock'; + +# Constructor +sub new { + return shift->TIEHASH(@_); +} + +# tying +sub TIEHASH { + my ($class, $dbname) = @_; + my $self = { + dir => $dbname, + keys => [], + }; + if (not -d $self->{dir}) { + if (!mkdir($self->{dir}, 0777)) { + die "mkdir(" . $self->{dir} . ") fail"; + } + } + return bless($self, $class); +} + +# Store +sub STORE { + my ($self, $key, $value) = @_; + my $filename = &make_filename($self, $key); + &lock_store($filename, $value); + return $value; +} + +# Fetch +sub FETCH { + my ($self, $key) = @_; + my $filename = &make_filename($self, $key); + my $value = &lock_fetch($filename); + return $value; +} + +# Exists +sub EXISTS { + my ($self, $key) = @_; + my $filename = &make_filename($self, $key); + return -e($filename); +} + +# Delete +sub DELETE { + my ($self, $key) = @_; + my $filename = &make_filename($self, $key); + unlink $filename; + # return delete $self->{$key}; +} + +sub FIRSTKEY { + my ($self) = @_; + opendir(DIR, $self->{dir}) or die $self->{dir}; + @{$self->{keys}} = grep /\.txt$/, readdir(DIR); + foreach my $name (@{$self->{keys}}) { + $name =~ s/\.txt$//; + $name =~ s/[0-9A-F][0-9A-F]/pack("C", hex($&))/eg; + } + return shift @{$self->{keys}}; +} + +sub NEXTKEY { + my ($self) = @_; + return shift @{$self->{keys}}; +} + +sub make_filename { + my ($self, $key) = @_; + my $enkey = ''; + foreach my $ch (split(//, $key)) { + $enkey .= sprintf("%02X", ord($ch)); + } + return $self->{dir} . "/$enkey.txt"; +} + +sub lock_store { + my ($filename, $value) = @_; + open(FILE, "+< $filename") or open(FILE, "> $filename") or die "$filename cannot be created"; + eval("flock(FILE, LOCK_EX)"); + if ($@) { + # Your platform does not support flock. + # Implement another EXCLUSIVE LOCK here. + } + truncate(FILE, 0); + # binmode(FILE); + $value =~ s/\x0D\x0A/\n/g; + print FILE $value; + eval("flock(FILE, LOCK_UN)"); + if ($@) { + # Your platform does not support flock. + # Implement another UNLOCK here. + } + close(FILE); +} + +sub lock_fetch { + my ($filename) = @_; + open(FILE, "$filename") or return(undef); + eval("flock(FILE, LOCK_SH)"); + if ($@) { + # Your platform does not support flock. + # Implement another SHARED LOCK here. + } + local $/; + my $value = ; + eval("flock(FILE, LOCK_UN)"); + if ($@) { + # Your platform does not support flock. + # Implement another UNLOCK here. + } + close(FILE); + return $value; +} + +1; diff -r 000000000000 -r a2f0a2c135cf conflict.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/conflict.txt Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,11 @@ +更新の衝突が発生しました。 + +他の人が、このページを更新してしまったようです。 + +以下に、 +あなたの編集したテキストがありますので、 +あなたの編集内容が失われないように、 +いますぐ、メモ帳などにコピー&ペーストしてください。 + +コピー&ペーストが済んでから、 +RecentChangesで最新の内容を見て、再度編集し直してください。 diff -r 000000000000 -r a2f0a2c135cf format.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/format.txt Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,62 @@ +**テキスト整形のルール + +通常は入力した文字がそのまま出力されますが、 +以下のルールに従ってテキスト整形を行うことができます。 + +***基本ルール +- 連続した複数行は連結されます。 +- 空行は段落の区切りとなります。 +- 行頭がスペースで始まっていると、その段落は整形済みとして扱われます。 +- HTMLのタグは書けません。 + +***文字飾り +- シングルクォート2個ではさんだ部分は、''ボールド''になります。 +- シングルクォート3個ではさんだ部分は、'''イタリック'''になります。 + +***見出し +- アスタリスク(*)を行頭に書くと、大見出しになります。 +- アスタリスク2個(**)を行頭に書くと、中見出しになります。 +- アスタリスク3個(***)を行頭に書くと、小見出しになります。 +- 見出しがあると自動的に目次が作られます。 + +***箇条書き、水平線、引用文 +- マイナス(-)を行頭に書くと、箇条書きになります。- -- --- の3レベルがあります。 +- マイナス4個(----)を行頭に書くと、水平線になります。 +- > を行頭に書くと、引用文が書けます。> >> >>> の3レベルがあります。 + +***ハイパーリンク +- http://www.hyuki.com/のようなURLは自動的にリンクになります。 +- YukiWikiのように大文字小文字を混ぜた英文字列を書くと、YukiWikiのページ名になります。 +- 二重の大かっこ[[ ]]でくくった文字列を書くと、YukiWikiのページ名になります。大かっこの中にはスペースを含めてはいけません。日本語も使えます。 + +***用語解説 +- コロン(:)を行頭に書くと、用語と解説文が作れます。以下のようにします。 + +---( +:用語1:いろいろ書いた解説文1 +:用語2:いろいろ書いた解説文2 +:用語3:いろいろ書いた解説文3 +---) + +:用語1:いろいろ書いた解説文1 +:用語2:いろいろ書いた解説文2 +:用語3:いろいろ書いた解説文3 + +***テーブル +- コンマ(,)を行頭に書くと、テーブル(表)が作れます。以下のようにします。 + +---( +, Wikiの名前 , 作者 , URL +,Wiki,Ward Cunningham,http://www.c2.com/ +,YukiWiki,Hiroshi Yuki,http://www.hyuki.com/ +,WalWiki,Makio Tsukamoto,http://digit.que.ne.jp/ +---) + +, Wikiの名前 , 作者 , URL +,Wiki,Ward Cunningham,http://www.c2.com/ +,YukiWiki,Hiroshi Yuki,http://www.hyuki.com/ +,WalWiki,Makio Tsukamoto,http://digit.que.ne.jp/ + +***バーベイタム機能 +- --( と --) でくくられた行は書いたまま表示されますが、リンクや文字飾りは有効です(バーベイタム・ソフト)。 +- ---( と ---) でくくられた行はリンクや文字飾りも無視されて書いたまま表示されます(バーベイタム・ハード)。 diff -r 000000000000 -r a2f0a2c135cf frontpage.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/frontpage.txt Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,13 @@ +このページはYukiWikiのFrontPageです。 + +もしあなたが管理者なら、このYukiWikiを公開する前に、 +AdminChangePasswordのリンク経由で管理者のパスワードを設定してください。 + +管理者のパスワードが設定できたなら、 +frontpage.txtを編集して、 +あなた独自のFrontPageを作ってください。 + +- YukiWikiの最新情報は http://www.hyuki.com/yukiwiki/ にあります。 +- RecentChangesが最近更新されたページの一覧になります。 +- IndexPageは全ページの一覧です。 +- 練習にはSandBoxがお勧めです。 diff -r 000000000000 -r a2f0a2c135cf history.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/history.txt Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,570 @@ +YukiWiki作業記録 + +*2006-07-06 +- Version 2.1.3. +- Subversionに移行。 +- RSSをファイルとして出力するように変更。 +-- wiki.cgi: $modifier_rss_about追加。 +-- wiki.cgi: $file_rss追加。 +-- wiki.cgi: update_rssfile追加。 +-- パッケージにrss.xml追加。説明はreadme.txtに。 +- 簡単なspam対策。 +-- wiki.cgi: keyword_reject追加。 +- メールの書式を変更。 +- 書き込み長さの最大制限 +-- wiki.cgi: length_reject追加。 +-- wiki.cgi: $max_message_length追加。 +-- resource.txt: toolongpost追加。 + +*2004-10-24 +- wikibook_branchで作業中。 +- Version 2.1.2a. +- wiki.cgi: &make_linkでスキームのチェックを入れるように修正。 +- zenitaniさんに感謝。 +- wiki.cgi: textareaからwrap="off"を削除。 +- wiki.cgi: Copyright表示をPowered byに変更。 +- cvs tag tag_release-212a_2004-10-24 + +*2004-05-07 +- wikibook_branchで作業中。 +- wiki.css: Verdanaフォントをデフォルトに。その他細かい点を修正。 + +*2004-05-06 +- wikibook_branchで作業中。 +- wiki.css: dl, dt, ddを調整。 + +*2004-03-31 +- wikibook_branchで作業中。 +- wiki.cgi: RssPage→$RssPage +- zenitaniさんに感謝。 + +*2004-03-27 +- wikibook_branchで作業中。 +- Version 2.1.2. +- cvs tag tag_release-212_2004-03-28 + +*2004-03-27 +- wikibook_branchで作業中。 +- plugin/link.pl: http|https|ftp|mailto以外のURLは無視するように修正。 +- zenitaniさんに感謝。 + +*2004-03-27 +- wikibook_branchで作業中。 +- wiki.cgi: 目次部分はタグを除去するように修正。 +- shinoさんに感謝。 + +*2004-03-21 +- 書籍サポートサイトに「練習用YukiWikiサイト」を設置するため、別ブランチを作る。 +- branch_wb-wiki_2004-03-21 +- http://www.hyuki.com/wb/wiki/wiki.cgi + +*2004-03-02 +- wikibook_branchで作業中。 +- Yuki/PluginManager.pm: stashを使わずUNIVERSAL::canを使ってsubの有無を判定。 +- andiさんに感謝。 + +*2004-03-02 +- wikibook_branchで作業中。 +- Yuki/PluginManager.pm: 不要なuse varsを削除。 + +*2004-02-27 +- wikibook_branchで作業中。 +- Version 2.1.1. +- readme.txt: pluginに関する記述漏れを修正。 +- cvs tag tag_release-candidate-211_2004-02-27 +- これを書籍収録版にする予定。 + +*2004-02-26 +- wikibook_branchで作業中。 +- Version 2.1.1. +- プラグインを追加(サンプルとしての意味合いが強い)。 +- plugin.txt: 追加。 +- plugin/link.pl: 追加。 +- plugin/recent.pl: 追加。 +- plugin/ruby.pl: 追加。 +- plugin/verb.pl: 追加。 +- cvs tag tag_release-candidate-211_2004-02-26 +- これを書籍収録版にする予定→やめ。 + +*2004-02-24 +- wikibook_branchで作業中。 +- Version 2.1.0e. +- Yuki/PluginManager.pm: 追加。 +- wiki.cgi: plugin関連追加。 +- resource.txt: plugin関連追加。 +- これでプラグイン機能がenableになった。 +-- プラグイン自体はzipにはまだ含めない。 +-- 標準プラグインを決める必要がある。 + +*2004-02-24 +- wikibook_branchで作業中。 +- Version 2.1.0d. +- wiki.css: tableの灰色がきつすぎるのでライトブルーに。 +- .htaccess: AddType text/css .css 追加。 + +*2004-02-24 +- wikibook_branchで作業中。 +- Version 2.1.0d. +- .htaccess: AddHandler cgi-script .cgi +- wiki.css: body.normalが抜けていた。 + +*2004-02-21 +- wikibook_branchで作業中。 +- Version 2.1.0d. +- $use_FixedFrontPageが効いていなかった。 +- RSSのdc_dateが効いていなかった。 +- cvs tag tag_release-210d_2004-02-21 + +*2004-02-21 +- wikibook_branchで作業中。 +- Version 2.1.0c. +- UNIX環境で正しくdiffできないのを修正。 + +*2004-02-20 +- wikibook_branchで作業中。 +- Version 2.1.0b. +- メインのYukiWikiをこのバージョンに戻し、 +- プラグイン機能はいったんdisableにする。 + +*2004-02-15 +- wikibook_branchで作業中。 +- Version 2.1.0b. +- wiki.cgi: textareaの先頭に1個改行を入れる。 + +*2004-02-13 +- wikibook_branchで作業中。 +- wiki.cgi: RSS Autodiscovery用のヘッダを追加。 +- + +*2004-02-13 +- wikibook_branchで作業中。 +- Version 2.1.0a. +- RSSのchannelのaboutにはRSSのchannelを入れたほうがよいというので修正。 +- Yuki/RSS.pm: channelにaboutを追加。Version 0.4. +- wiki.cgi: $modifier_rss_linkを使ってaboutフィールドを埋める. + +*2004-02-09 +- wikibook_branchで作業中。 +- Version 2.1.0. +- cvs tag tag_release-210_2004-02-09 + +*2004-02-09 +- wikibook_branchで作業中。 +- Yuki/YukiWikiDB.pm: ファイル書き込みのbinmodeをやめる。 +- Windows環境でCR LFとLFが混在してしまいdiffが正しく出ないため。 +- wiki.css: 整理。 + +*2004-02-02 +- wikibook_branchで作業中。 +- ここまでの機能を2.1.0にしようと思っている。 + +*2004-02-02 +- wikibook_branchで作業中。 +- wiki.css, wiki.cgi: [VerbatimSoft] バーベイタムを入れた。 --(, --) +- wiki.css, wiki.cgi: [VerbatimHard] バーベイタムを入れた。 ---(, ---) +- Yuki/RSS.pm: dc_dateを入れた(WalWiki参考)。 +- Yuki/RSS.pm: xmlns抜け修正(Thank you, y-Akiさん)。 +- wiki.cgi: WalWikiに習ってencodeを修正[better encode]。 +- resource.txt, wiki.cgi: &text_to_html: 目次があるときは「目次」を追加。 +- wiki.cgi: Fix bug: 見出し文字列が空の時には見出しとして扱わないようにした。 +- wiki.cgi: 見出しレベルを*, **, ***の3レベルにした。 +- wiki.cgi: $use_FixedFrontPageを導入してFrontPageを編集可能にできるようにした。 +- frontpage.txt: Fix typo. +- wiki.css: Styles for printer. +- wiki.cgi: Add "editlink" class. + +*2004-01-26 +- wikibook_branchで作業中。 +- TODO: + - prohostingで動作確認。特にmodifier_...を変更した場合。 + +*2004-01-25 +- ★以下、wikibook_branchで作業★ +- 2004-12-04〜2004-01-14の修正はtrunk側なので、こちらにはまだ反映されていないことに注意。 +- wiki.cgi: バージョン名にWBを付加する。Copyright表記を修正。 +- convert.cgi: 削除する。 +- history1.txt: 削除する。 +- history2.txt: 削除する。 +- history.txt: trunkの方から統合する。 +- frontpage.txt: 修正。 +- ここまでで動作確認。タグを張る。 +- cvs tag tag_run_2004-01-26 + +*2004-01-25 +- YukiWiki 2.0.6系を/wb/wikiに移動し、そちらを新たな2.1系にする。 +- YukiWiki 2.1.dev系は保留とする。 + +*2004-01-14 +- YukiWiki 2.1.dev8で作業中。 +- readme.txtに合わせてディレクトリを整理した。 +- それに伴い、config.plを整理。 +- theme/ ディレクトリを作成。CSSとGIFはここに入れる。 + +*2003-12-20 +- YukiWiki 2.1.dev8で作業中。 +- 見出しレベルを*, **, ***の3レベルにした。 +- Jcode-0.68をlib以下に展開した。 +- do_rss: Jcodeを用い、EUC-JP, Shift_JIS, UTF-8のいずれでもRSS出力可能にした。 +- config.pl: rss_encodingを追加。 +- config.pl: kanjicodeを削除。コンテンツはcharsetで統一する。 +- code_convert: 文字コードを適切にマッピングするようにした。 +- readme.txt: ばらばらになっていた情報を集めたり、ディレクトリ一覧を作ったりした。 + +*2003-12-14 +- YukiWiki1のhistory1.txtとhistory2.txtをまとめてhistory.txtとした。 +- test_convertを削除。 +- YukiWikiMiniの場所を移動。 + +*2003-12-14 +- plugins/ → plugin/ に名前変更。 +- image/ 作成。 + +*2003-12-13 +- YukiWiki 2.1.dev7で作業中。 +- config.pl: 作成。 +- $modifier_ 変数群をすべて$config{ }に変更。 + +*2003-12-11 +- template.html, wiki.css: transparentはCSSに書く。 +- plugins/attach.pl: 作成中。 + +*2003-12-10 +- YukiWiki 2.1.dev5で作業中。 +- Yuki::Templateの実装。 +- template.html: テンプレート例を作成。 +- %decoration: 削除。 +- dump_error: 追加。テンプレートが使えなくても使えるprint_error相当。 +- resource.txt: いろいろ追加。 +- &text_to_html: 目次があるときは「目次」を追加。 + +*2003-12-09 +- YukiWiki 2.1.dev4で作業中。 +- ActionPluginの下準備。 +- linktree.pl: WikiNameがarmoredのときのバグ修正。 + +*2003-12-09 +- YukiWiki 2.1.dev3で作業中。 +- filterプラグインの仕様を変更。definedのときオーバーライドするようにした。 +- filter_layout.pl: サンプルとしてspecial_rawoutを作った。 + +*2003-12-08 +- YukiWiki 2.1.dev2で作業中。 +- WalWikiに習ってencodeを修正[better encode]。 +- [LinkTreePlugin][[リンクツリープラグイン]]を作ってみた(linktree.pl)。 +- RSS.pmのでxmlns抜け修正(Thank you, y-Akiさん)。 + +*2003-12-07 +- YukiWiki 2.1.dev1で作業中。 +- フィルタプラグインの機構を入れた。 +- ブロックプラグインを入れた。 +- [VerbatimSoft] バーベイタムを入れた。 --(, --) +- [VerbatimHard] バーベイタムを入れた。 ---(, ---) +- [FilterPlugin] フィルタ機能を入れた。サンプルとしてfilter_layout.plを実装した。 +- [AutoPluginUsage]プラグインの利用方法が自動的に編集時のヘルプに取り込まれようにした。 +- Fix bug: 見出し文字列が空の時には見出しとして扱わないようにした。 + +*2003-12-06 +- YukiWiki 2.1.dev0で作業中。 +- プラグインの機構を入れた。とりあえず&user_plugin(argument)の形式。 +- plugins/link.plで名前付きリンクを実現した。 +- plugins/amazon.plでアマゾンのリンクを実現した。 +- RSS.pmにdc_dateを入れた(WalWiki参考)。 + +*2003-12-04 +- YukiWiki 2.1.dev0で作業中。 +- Yuki::YukiWikiDBをデフォルトにした。 +- $use_FixedFrontPageを導入してFrontPageを編集可能にできるようにした。 +- WalWikiの塚本さんから有益な情報と励ましをたくさんいただいた。 + +*2003-07-13 +- YukiWiki 2.0.6xxで作業中。 +- 2.0.6xで入れた修正の再修正。コメント機能のあたり。 + +*2003-06-06 +- YukiWiki 2.0.6xで作業中。 +- 整形済みの中のembed_command, embed_rcommandの扱いを修正中。塚本さんの指摘による。 +- TODO:AnyDBM_FileでYuki::YukiWikiDBをデフォルトデータベースの順番をいじるようにしたほうがよいと思う。 + +*2003-02-23 +- /^\s*$/ にマッチしたときに通常モードに戻るのではなく/^$/にマッチしたときに戻るように修正。 +これは、
の中にスペースだけの行が含まれたときに一度
になってしまうのを防ぐため。 + +*2002-08-28 +- Yuki::YukiWikiDBにflockを入れた。 +- Yuki::YukiWikiDBのデバッグプリントをdieに変更した。 +- hyuki.comで運用していたYukiWikiのデータベースを復旧。 +- AnyDBM_FileからYuki::YukiWikiDBに手動で変換。 +- wiki.cgiスクリプトには変更なし。 + +*2002-08-22 +- YukiWiki 2.0.5公開。 + +*2002-08-22 +- 2.0.4のXSS対策に不十分な点があったので&print_editform修正(関村さんの指摘による)。 +$form{mypassword}を&escapeしていなかった。 +- $resource{anydbmfileerroranydbmfileerror}のtypo修正。 + +*2002-07-12 +- YukiWiki 2.0.4公開。 + +*2002-07-12 +- 2.0.3のXSS対策に不十分な点があったので&make_link修正(塚本牧生さんの指摘による)。 +- 配布物にデバッグ用のコードが残っていたのでコメントアウト。 + +*2002-07-11 +- YukiWiki 2.0.3公開。 + +*2002-07-11 +- officeさんから「クロスサイトスクリプティング脆弱性」の指摘を受ける。 +- ページ名にスクリプトが混入させられた場合に対処。 +- 生でページ名を見せず、必ず&escapeする修正を行う。 + +*2002-06-30 +- do_indexでページ漏れが生じる問題はまだ未解決。 +- use AnyDBM_File;をevalでくるみ、エラーにならないように注意する。 +- エラーになったとき、$modifier_dbtypeがAnyDBM_Fileになっていたらエラーページを表示。 +- (自動的に$modifier_dbtypeを変更することはしない) + +*2002-06-06 +- YukiWiki 2.0.0公開。 + +*2002-05-31 +- history1.txt, history2.txt作成。 +- wikiman_ja.pl作成。 + +*2002-05-22 +- #で始まるページ名はnot is_editable. +- 衝突が起きたときの画面を修正。 + +*2002-05-21 +- RSSをXMLファイルではなくCGI経由で出すように修正。 +- &を正しくページ名として扱えるように修正。 +- wiki.cgiをreadme2.txtをreadme_en.txtとreadme_ja.txtに分離。 +- CGI中のPODは最小限にした。 +- データディレクトリを別ディレクトリにできるように$modifier_dir_dataを導入した。 +- alpha6 + +*2002-05-19 +- footerの部分はaddress要素に変更。shinoさんの指摘による。 +- 目次リンクにバグあり。余計な#があり、うまく目次リンクからジャンプできなかった。 + +*2002-05-18 +- WalWikiを参考にして、ページの * や ** は目次として収集するようにした。 + +*2002-05-17 +- プレビュー画面(YukiWiki1から持ってきた) +- YukiWiki1からYukiWiki2への移行ツール(WalWikiのconvert.cgiを改造。感謝)。 +- wiki.txt→frontpage.txtにリネーム。 +- YukiWikiDBを別ファイルにしてYuki::YukiWikiDBに移動。 +- AnyDBM_File, YukiWikiDB, dbmopenの3方式に対応(ふう…)。 +- alpha5のスクリプトを公開。 +- YukiWiki1のデータをごそっとYukiWiki2に移行してみる。大丈夫だろうか…。 +- とりあえず、YukiWiki1のほうは編集できなくしてみた。そのうち、自動的にYukiWiki2に転送するようにするつもり。 + +*2002-05-16 +- existsがない場合にはdefinedで代用できるように$use_existsを導入。 +- RecentChangesの更新ミスを修正。 + +*2002-05-14 +- RSS機能(Yuki::RSS)を追加した。 +- 差分用のコードがごちゃごちゃしていたので、Yuki::DiffTextを作った。 +- WalWiki(http://digit.que.ne.jp/work/index.cgi?WalWiki)からコードを借りてテーブルを実装。 +- alpha3のスクリプトを公開。 + +*2002-05-13 +- 普通のページを凍結する手段はすでに作られている。 +- FrontPageに大きなロゴをつけた。 +- 差分をまずは組み込んだ。完全にはリソース化されていない。HTML::Templateが使いたくなる。 + +*2002-05-09 +- 画像をimg化するようにした。 +- FormatRuleを編集画面の下のほうに出すようにした。 + +*2002-05-08 +- TfWikiをYukiWiki2として、ディレクトリ移動。 +- 元のTfWikiのほうへのリンクはYukiWiki2へリダイレクト。 + +*2002-04-14 +- [[YukiWiki2]]を次回のC MAGAZINEの連載題材にしようと考慮中。 +- [[YukiWiki2]]のロゴ作成依頼中。 + +*2002-03-27 +- [[一言コメント機能]]で書き込んでも[[更新履歴]]が更新されない不具合の修正。 +- [[一言コメント逆順機能]]を試しに実装する。 + +*2002-03-26 +- [[大阪弁:TfWiki作業記録]]というのはどうでしょうか。[[極悪]]さんのご紹介。 +- 画像のロゴは不要かもしれないが、リンク用バナーアイコン88x31はあってもいいかな。今度は割とシャープな感じにしたいな。 +- 編集のリンクに画像を使うことはやらない予定。ああいうアイコンって分かりにくいと思うから。 +- メニューバーは漢字表記になっているけれど、実はスクリプト中にはまったく日本語はないのだ。リソースファイルとして外部ファイル化している。だからやる気になれば、スクリプトはそのままで、(クッキーやCGIへ渡す引数などで)英語/日本語の全切り替えも可能なのだ。 +- 知らないうちに[[英語版:FrontPage]]もできそうな感じ。InterWikiNameに追加してくれた人、ありがとうございます。 + +*2002-03-25 +- AdminEditでのエンコード忘れ修正。 +- タイトルを検索リンクにした。 +- TfWikiもいいけれど、YukiWikiをバージョンアップしたくなってきた。 +- 急に整形ルールを変更してみる。当然のごとくあちこちのレイアウトがおかしくなるのであった。ひえー。 +- だんだんTfWikiではなく、YukiWiki2.0を作っている気分になってきました。 +- [[一言コメント機能]]を実装しました。 +- RecentChangesや一言コメントの日付けはmonospaceになるようにスタイル指定。 +- 一言コメントをつけたときにもRecentChangesが更新されるように修正。 +- PlugIn機能を実装しているWikiがあるけれど、私はPlugInにはあまり興味なし。 +- できるだけシンプルに、でもあちこちのWikiClonesで実装されている便利な機能は取り込んでいくつもり。 +- で、適当なタイミングで現在のYukiWikiレポジトリをEUCに変換して、YukiWikiのバージョンアップへとつなげていこうと思っている。 +- [[YukiWiki2]]向けのロゴも作りたいな。 +- このページを観察しているページを発見(^_^) => http://www1.u-netsurf.ne.jp/~dune/wiki_2Epl.html? + +*2002-03-24 +- InterWikiを実験的に実装中。[[google:結城浩]] +InterWikiはクリックされたときに展開したほうがよい、という指摘がありました。 +でも、それほど大きな負担ではないと思うので、まずはこのままにしておきます。 +- タイムスタンプの更新をやめることも可能にしました。 +- タッチファイルをいれて、更新情報でチェックしやすくしました。 +- 管理者という存在を入れました。外からは見えないけれど。 +- [[凍結ページ機能]]を実装しました。ちなみにこのページ自身も凍結。 +- 凍結ページの場合には右下にAdminEditのリンクを用意するようにした。 + +*2002-03-23 +- 日本語のWikiNameは[[ ]]でくくることにしました。 +-- KbWikiのように「  」にしようかな…。 +-- それ、Tikiでそうなっているけど、なにかと不便です‥‥‥。 +-- ふうん、やっぱり難しいものなのですね。 +-- 思い付きですが、"ほげほげ。。"というように、まるを2つ付ければWikinameになるというのどうでしょうか。いちいち、IMEを切替えなくて楽かも知れません。 +-- または、"#ほげほげ"のように、全角の#を付けたときとか。#は滅多に使いませんし。 +-- アイディアどうもです。EUCにすると[[ ]]でくくってもあまりきにならなくなっちゃいました... + +- 衝突のチェック。 +-- ちなみに、衝突のチェックはYukiWikiのときと同じようにページのハッシュ値を使う。 +-- Last modifiedの情報を入れる +-- これ、もう少し汎用にして、ページの「ヘッダ」を作る。Subjectもそこに入れる。 +-- 結局、衝突のチェックはLast-Modifedの情報を別データベースにいれた。 +-- ページのヘッダは煩雑すぎるのでやめ。 + +*2002-03-22 +- 以降は、YukiWiki2の作業記録である。 +- IndexPage, SearchPage, HelpPageなどを作る +-- これ、InterWikiの機能を使って実現できそうだな。自分自身をサーバとする。 + +*2002-03-06 +- Version 1.6.8。 +- スタイルシートを別ファイルとした($stylesheet)。 +- Content-typeを出力する際にcharsetを明示的に出すようにした(print_header)。 +- プレビュー画面でも更新の衝突をチェックするように修正(check_conflict)。 +- 差分表示のとき、モノクロなブラウザでも分かるように表示(do_diff)。 + +*2002-03-01 +- Version 1.6.7。 +- パッケージにDiff.pmを同梱。 + +*2001-10-20 +- Version 1.6.6。 +- 更新の衝突対策。 +- 元ページの簡単なチェックサムを取っておき、更新前にチェックサムを比較する。 +修正個所はdigestという文字列を検索すれば分かる。 +本来はMD5などでちゃんとやった方がいいのだけれど。 +- 衝突時に表示されるメッセージなどは「極悪」さんのページを参考にした。 + +*2001-10-17 +- Version 1.6.5。 +- プレビュー画面で、更新ボタンを押したときに送信される +メッセージの内容をinput要素のtype="hidden"を使って埋め込むのをやめる。 +代わりに、textarea要素を使う。 +- 再プレビュー用にmyspecial_を導入。でもきれいな対策ではない。 + +*2001-08-30 +- Version 1.6.4。 +- URLでダイレクトにページ名を指定しても、 +$WikiNameと$BracketName以外のページを作れないようにした。 +(is_valid_nameとis_editable参照)。 + +*2001-08-30 +- Version 1.6.3。 +- RecentChangesを編集・再編集不可とした。 +- 編集不可ページは@uneditableにページ名を入れる。 + +*2001-02-25 +- Version 1.6.1, 1.6.2。 +- 差分機能のバグ修正。 +- do_previewで'>'が扱えないバグを修正(ユーザからの指摘)。 + +*2001-02-22 +- Version 1.6.0。 +- 差分機能を実装した。 + +*2001-02-19 +- Version 1.5.4。 +- 画像ファイルへのリンクは画像にしてみた。 + +*2001-02-19 +- Version 1.5.3。 +- RecentChangesの中に削除したページがあるのをやめた。 +- use strict;で引っかかる部分を少し整理(完全ではない)。 + +*2001-02-16 +- Version 1.5.2。 +- textareaに表示およびプレビューする前に < や > を < や > に変換した +(do_preview, editpage, print_preview_buttons)。 + +*2000-12-27 +- Version 1.5.1。 +- プレビュー画面を整理した。 + +*2000-12-22 +- Version 1.5.0。 +- 全体的にずいぶん書き直した。 +- 一覧を別途作成するようにした(do_list)。 +- 書き込む前に確認画面を出すようにした(do_preview)。 +- テキストの書き方を編集画面に入れた(do_edit, do_reedit)。 +- WhatsNew→RecentChanges、TopPage→FrontPageに変更した。 + +*2000-12-20 +- Version 1.1.0。 +- tieを利用して、dbmopenが使えない場合でも動作するように修正。 +- 利用者の1人である「極悪」さんから送っていただいたコードを元にしています。 + +*2000-09-05 +- Version 1.0.2。 +- → +- 利用者からの指摘による。感謝。 + +*2000-08-06 +- Version 1.0.1を公開。 +- C MAGAZINE(ソフトバンクパブリッシング)2000年10月号連載記事向け公開版。 +- [[ ]] の最後が「望」のようにシフトJISで +- 0x5Dになる場合の回避を行なった。 + +*2000-08-05 +- Version 1.0.0を公開。 + +*2000-07-23 +- Version 0.82を公開。 +- 編集時のリンクミス。 +-
+@{[ + $mode{admin} ? + qq( + $resource{frozenbutton} + $resource{notfrozenbutton}
) + : "" +]} +@{[ + $mode{conflict} ? "" : + qq( + $resource{touch}
+ +
+ ) +]} + +EOD + unless ($mode{conflict}) { + # Show the format rule. + open(FILE, $file_format) or &print_error("($file_format)"); + my $content = join('', ); + &code_convert(\$content, $kanjicode); + close(FILE); + print &text_to_html($content, toc=>0); + } + + unless ($mode{conflict}) { + # Show plugin information. + my $plugin_usage = <<"EOD"; +*$resource{available_plugins} +EOD + foreach my $usage (@{$plugin_manager->usage}) { + $plugin_usage .= <<"EOD"; +** $usage->{name} +---( +$resource{plugin_usage_name}: $usage->{name} +$resource{plugin_usage_version}: $usage->{version} +$resource{plugin_usage_author}: $usage->{author} +$resource{plugin_usage_syntax}: $usage->{syntax} +$resource{plugin_usage_description}: $usage->{description} +$resource{plugin_usage_example}: $usage->{example} +---) +EOD + } + &code_convert(\$plugin_usage, $kanjicode); + print &text_to_html($plugin_usage, toc=>0); + } +} + +sub print_passwordform { + print <<"EOD"; +
+ + $resource{oldpassword}
+ $resource{newpassword}
+ $resource{newpassword2}
+
+
+EOD +} + +sub is_editable { + my ($page) = @_; + if (&is_bracket_name($page)) { + return 0; + } elsif ($fixedpage{$page}) { + return 0; + } elsif ($page =~ /\s/) { + return 0; + } elsif ($page =~ /^\#/) { + return 0; + } elsif ($page =~ /^$interwiki_name$/) { + return 0; + } elsif (not $page) { + return 0; + } else { + return 1; + } +} + +# armor_name: +# WikiName -> WikiName +# not_wiki_name -> [[not_wiki_name]] +sub armor_name { + my ($name) = @_; + if ($name =~ /^$wiki_name$/) { + return $name; + } else { + return "[[$name]]"; + } +} + +# unarmor_name: +# [[bracket_name]] -> bracket_name +# WikiName -> WikiName +sub unarmor_name { + my ($name) = @_; + if ($name =~ /^$bracket_name$/) { + return $1; + } else { + return $name; + } +} + +sub is_bracket_name { + my ($name) = @_; + if ($name =~ /^$bracket_name$/) { + return 1; + } else { + return 0; + } +} + +sub decode { + my ($s) = @_; + $s =~ tr/+/ /; + $s =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg; + return $s; +} + +# Thanks to WalWiki for [better encode]. +sub encode { + my ($encoded) = @_; + $encoded =~ s/(\W)/'%' . unpack('H2', $1)/eg; + return $encoded; +} + +sub init_resource { + open(FILE, $file_resource) or &print_error("(resource)"); + while () { + chomp; + next if /^#/; + my ($key, $value) = split(/=/, $_, 2); + $resource{$key} = &code_convert(\$value, $kanjicode); + } + close(FILE); +} + +sub conflict { + my ($page, $rawmsg) = @_; + if ($form{myConflictChecker} eq &get_info($page, $info_ConflictChecker)) { + return 0; + } + open(FILE, $file_conflict) or &print_error("(conflict)"); + my $content = join('', ); + &code_convert(\$content, $kanjicode); + close(FILE); + &print_header($page); + &print_content($content); + &print_editform($rawmsg, $form{myConflictChecker}, frozen=>0, conflict=>1); + &print_footer($page); + return 1; +} + +sub get_now { + my (@week) = qw(Sun Mon Tue Wed Thu Fri Sat); + my ($sec, $min, $hour, $day, $mon, $year, $weekday) = localtime(time); + $year += 1900; + $mon++; + $mon = "0$mon" if $mon < 10; + $day = "0$day" if $day < 10; + $hour = "0$hour" if $hour < 10; + $min = "0$min" if $min < 10; + $sec = "0$sec" if $sec < 10; + $weekday = $week[$weekday]; + return "$year-$mon-$day ($weekday) $hour:$min:$sec"; +} + +# [[YukiWiki http://www.hyuki.com/yukiwiki/wiki.cgi?euc($1)]] +sub init_InterWikiName { + my $content = $database{$InterWikiName}; + while ($content =~ /\[\[(\S+) +(\S+)\]\]/g) { + my ($name, $url) = ($1, $2); + $interwiki{$name} = $url; + } +} + +sub interwiki_convert { + my ($type, $localname) = @_; + if ($type eq 'sjis' or $type eq 'euc') { + &code_convert(\$localname, $type); + return &encode($localname); + } elsif ($type eq 'ykwk') { + # for YukiWiki1 + if ($localname =~ /^$wiki_name$/) { + return $localname; + } else { + &code_convert(\$localname, 'sjis'); + return &encode("[[" . $localname . "]]"); + } + } elsif ($type eq 'asis') { + return $localname; + } else { + return $localname; + } +} + +sub get_info { + my ($page, $key) = @_; + my %info = map { split(/=/, $_, 2) } split(/\n/, $infobase{$page}); + return $info{$key}; +} + +sub set_info { + my ($page, $key, $value) = @_; + my %info = map { split(/=/, $_, 2) } split(/\n/, $infobase{$page}); + $info{$key} = $value; + my $s = ''; + for (keys %info) { + $s .= "$_=$info{$_}\n"; + } + $infobase{$page} = $s; +} + +sub frozen_reject { + my ($isfrozen) = &get_info($form{mypage}, $info_IsFrozen); + my ($willbefrozen) = $form{myfrozen}; + if (not $isfrozen and not $willbefrozen) { + # You need no check. + return 0; + } elsif (valid_password($form{mypassword})) { + # You are admin. + return 0; + } else { + &print_error($resource{passworderror}); + return 1; + } +} + +sub length_reject { + if ($max_message_length < 0) { + return 0; + } + if ($max_message_length < length($form{mymsg})) { + &print_error($resource{toolongpost} . $max_message_length); + return 1; + } + return 0; +} + +sub valid_password { + my ($givenpassword) = @_; + my ($validpassword_crypt) = &get_info($AdminSpecialPage, $info_AdminPassword); + if (crypt($givenpassword, $validpassword_crypt) eq $validpassword_crypt) { + return 1; + } else { + return 0; + } +} + +sub is_frozen { + my ($page) = @_; + if (&get_info($page, $info_IsFrozen)) { + return 1; + } else { + return 0; + } +} + +sub do_comment { + my ($content) = $database{$form{mypage}}; + my $datestr = &get_now; + my $namestr = $form{myname} ? " ''[[$form{myname}]]'' : " : " "; + if ($content =~ s/(^|\n)(\Q$embed_comment\E)/$1- $datestr$namestr$form{mymsg}\n$2/) { + ; + } else { + $content =~ s/(^|\n)(\Q$embed_rcomment\E)/$1$2\n- $datestr$namestr$form{mymsg}/; + } + if ($form{mymsg}) { + $form{mymsg} = $content; + $form{mytouch} = 'on'; + &do_write; + } else { + $form{mycmd} = 'read'; + &do_read; + } +} + +sub embedded_to_html { + my ($embedded) = @_; + my $escapedmypage = &escape($form{mypage}); + if ($embedded eq $embed_comment or $embedded eq $embed_rcomment) { + my $conflictchecker = &get_info($form{mypage}, $info_ConflictChecker); + return <<"EOD"; +
+ + + + + $resource{yourname} + + + +
+EOD + } else { + return $embedded; + } +} + +sub code_convert { + my ($contentref, $kanjicode) = @_; +# &Jcode::convert($contentref, $kanjicode); # for Jcode.pm + &jcode::convert($contentref, $kanjicode); # for jcode.pl + return $$contentref; +} + +sub test_convert { + my $txt = &text_to_html(<<"EOD", toc=>1); +*HEADER1 +**HEADER1-1 +-ITEM1 +-ITEM2 +-ITEM3 +PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1 +PAR1PAR1PAR1PAR1PAR1PAR1''BOLD''PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1 +PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1 + +PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2 +PAR2PAR2PAR2PAR2PAR2PAR2'''ITALIC'''PAR2PAR2PAR2PAR2PAR2PAR2PAR2 +PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2 +**HEADER1-2 +:TERM1:DESCRIPTION1 AND ''BOLD'' +PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1 +PAR1PAR1PAR1PAR1PAR1PAR1''BOLD''PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1 +PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1 +:TERM2:DESCRIPTION2 +:TERM3:DESCRIPTION3 +---- +*HEADER2 +**HEADER2-1 +http://www.hyuki.com/ +**HEADER2-2 + +[[YukiWiki2]] + +PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1 +PAR1PAR1PAR1PAR1PAR1PAR1'''''BOLD ITALIC'''''PAR1PAR1PAR1PAR1PAR1 +PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1PAR1 +>PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2 +>PAR2PAR2PAR2PAR2PAR2PAR2'''ITALIC'''PAR2PAR2PAR2PAR2PAR2PAR2PAR2 +>PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2PAR2 + +LEVEL0LEVEL0LEVEL0LEVEL0LEVEL0LEVEL0LEVEL0 + +>LEVEL1 +>LEVEL1 +>LEVEL1 +>>LEVEL2 +>>LEVEL2 +>>LEVEL2 +>>>LEVEL3 +-HELLO-1 +--HELLO-2 +(HELLO-2, HELLO-2, HELLO-2) +---HELLO-3 +(HELLO-3, HELLO-3, HELLO-3) +--HELLO-2 +---HELLO-3 +--HELLO-2 +---HELLO-3 +>>>LEVEL3 +>>>LEVEL3 +>>>LEVEL3 +>>>LEVEL3 +EOD + print $txt; + exit; +} + +sub do_diff { + if (not &is_editable($form{mypage})) { + &do_read; + return; + } + &open_diff; + my $title = $form{mypage}; + &print_header($title); + $_ = &escape($diffbase{$form{mypage}}); + &close_diff; + print qq(

$resource{difftitle}

); + print qq($resource{diffnotice}); + print qq(
);
+    foreach (split(/\n/, $_)) {
+        if (/^\+(.*)/) {
+            print qq($1\n);
+        } elsif (/^\-(.*)/) {
+            print qq($1\n);
+        } elsif (/^\=(.*)/) {
+            print qq($1\n);
+        } else {
+            print qq|??? $_\n|;
+        }
+    }
+    print qq(
); + print qq(
); + &print_footer($title); +} + +sub do_rss { + if ($file_rss) { + print <<"EOD"; +Status: 301 Moved Permanently +Location: $modifier_rss_about + +EOD + return; + } +} + +sub is_exist_page { + my ($name) = @_; + if ($use_exists) { + return exists($database{$name}); + } else { + return $database{$name}; + } +} + +# sub check_modifiers { +# if ($error_AnyDBM_File and $modifier_dbtype eq 'AnyDBM_File') { +# &print_error($resource{anydbmfileerror}); +# } +# } + +# Initialize plugins. +sub init_plugin { + $plugin_manager = new Yuki::PluginManager($plugin_context, $modifier_dir_plugin); +} + +sub print_plugin_log { + if ($plugin_context->{debug}) { + print "
(print_plugin_log)\n", join("\n", @{$plugin_manager->{log}}), "
"; + } +} + +sub keyword_reject { + my $s = $form{mymsg}; + my @reject_words = qw( +buy-cheap.com +ultram.online-buy.com + ); + for (@reject_words) { + if ($s =~ /\Q$_\E/) { + &send_mail_to_admin($form{mypage}, "Rejectword: $_"); + sleep(30); + return 1; + } + } + return 0; +} + +# Thanks to Makio Tsukamoto for dc_date. +sub update_rssfile { + my $rss = new Yuki::RSS( + version => '1.0', + encoding => $charset, + ); + $rss->channel( + title => $modifier_rss_title, + link => $modifier_rss_link, + about => $modifier_rss_about, + description => $modifier_rss_description, + ); + my $recentchanges = $database{$RecentChanges}; + my $count = 0; + foreach (split(/\n/, $recentchanges)) { + last if ($count >= 15); + /^\- (\d\d\d\d\-\d\d\-\d\d) \(...\) (\d\d:\d\d:\d\d) (\S+)/; # date format. + my $dc_date = "$1T$2$modifier_rss_timezone"; + my $title = &unarmor_name($3); + my $escaped_title = &escape($title); + my $link = $modifier_rss_link . '?' . &encode($title); + my $description = $escaped_title . &escape(&get_subjectline($title)); + $rss->add_item( + title => $escaped_title, + link => $link, + description => $description, + dc_date => $dc_date, + ); + $count++; + } + open(FILE, "> $file_rss") or &print_error("($file_rss)"); + print FILE $rss->as_string; + close(FILE); +} + +1; +__END__ +=head1 NAME + +wiki.cgi - This is YukiWiki, yet another Wiki clone. + +=head1 DESCRIPTION + +YukiWiki is yet another Wiki clone. + +YukiWiki can treat Japanese WikiNames (enclosed with [[ and ]]). +YukiWiki provides 'InterWiki' feature, RDF Site Summary (RSS), +and some embedded commands (such as [[#comment]] to add comments). + +=head1 AUTHOR + +Hiroshi Yuki http://www.hyuki.com/yukiwiki/ + +=head1 LICENSE + +Copyright (C) 2000-2006 by Hiroshi Yuki. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=cut diff -r 000000000000 -r a2f0a2c135cf wiki.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wiki.css Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,221 @@ +/* + * wiki.css + */ + +body { + margin: .5em .5em .5em .5em; + color: black; + font-family: "Verdana"; +} + +body.normal { + background-color: white; +} + +body.frozen { + background-color: #eee; +} + +.preview { + color: black; + background-color: #fcc; +} + +p, dl { + margin: 5pt; + padding: 5pt; +} + +p, pre, ul, li, dl, dt, dd { + line-height: 140%; +} + +dt { + font-weight: bold; +} + +dd { + margin: 5pt; + padding: 5pt; +} + +a { +} + +a:hover { + color: red; + background-color: white; + text-decoration: underline; +} + +a img { + border: none; +} + +.tools { + margin: 1pt; + padding: 1pt; + text-align: right; +} + +.header { + margin: 10pt 0 5pt 0; + padding: 5pt 5pt 5pt 5pt; + text-align: left; + /* border: #999 1px solid; */ + color: black; + background-color: #ccf; +} + +.footer { + font-style: normal; + text-align: right; +} + +.InterWiki { + color: black; + background-color: #eee; +} + +h2 { + margin: 10pt 0 5pt 0; + padding: 5pt 5pt 5pt 5pt; + text-align: left; + color: black; + background-color: #ccf; + /* border: #999 1px solid; */ + +} + +h3 { + margin: 10pt 0 5pt 0; + padding: 5pt 5pt 5pt 5pt; + text-align: left; + color: black; + border-left: #ccf 10pt solid; + border-bottom: #ccf 1pt solid; +} + +h4 { + margin: 10pt 0 5pt 0; + padding: 5pt 5pt 5pt 5pt; + text-align: left; + color: black; + border-bottom: #ccf 1px solid; +} + +.date { + font-family: monospace; +} + +/* verbatim */ +pre.verbatim-hard { + margin: 5pt; + padding: 5pt; + background-color: #eef; + border: #ccf 1px solid; + padding: 1em 1em 1em 1em; +} + +pre.verbatim-soft { + margin: 5pt; + padding: 5pt; + background-color: #eef; + border: #ccf 1px solid; +} + +/* diff */ +.added { + color: blue; +} + +.deleted { + color: red; +} + +.same { + color: #666; +} + +.diff { + color: black; + background-color: #eee; +} + +/* table */ +table { + margin: 5pt; + padding: 5pt; + background-color: #ccf; +} + +td { + margin: 1px; + padding: 5px; + background-color: #eef; +} + +.error { +} + +/* + * Styles for printer. + */ + +@media print { + form { + display: none; + } + + .header { + color: black; + border: none; + text-align: center; + /* font-size: large; */ + margin-bottom: 1em; + } + + h2 { + border: none; + border-bottom: #ccc 1px solid; + border-left: #ccc .5em solid; + } + + h3 { + border: none; + border-bottom: #ccc 1px solid; + } + + h4 { + border: none; + } + + a:hover { + color: black; + text-decoration: none; + } + + a { + text-decoration: none; + } + + a.editlink { + display: none; + } + + .footer { + display: none; + } + + body { + } + + .tools { + display: none; + } + + p { + font-family: Serif; + } +} +