Mercurial > hg > Applications > casawiki
changeset 0:a2f0a2c135cf
hg init
author | Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 06 Jun 2010 22:00:38 +0900 |
parents | |
children | 0b233d5d1944 |
files | Algorithm/Diff.pm Cassandra/CassHash.pm Cassandra/lib/Cassandra/Cassandra.pm Cassandra/lib/Cassandra/Constants.pm Cassandra/lib/Cassandra/Types.pm Cassandra/lib/Thrift.pm Cassandra/lib/Thrift/BinaryProtocol.pm Cassandra/lib/Thrift/BufferedTransport.pm Cassandra/lib/Thrift/FramedTransport.pm Cassandra/lib/Thrift/HttpClient.pm Cassandra/lib/Thrift/MemoryBuffer.pm Cassandra/lib/Thrift/Protocol.pm Cassandra/lib/Thrift/Server.pm Cassandra/lib/Thrift/Socket.pm Cassandra/lib/Thrift/Transport.pm Yuki/DiffText.pm Yuki/PluginManager.pm Yuki/RSS.pm Yuki/YukiWikiDB.pm conflict.txt format.txt frontpage.txt history.txt icon40x40.gif icon80x80.gif jcode.pl plugin.txt plugin/link.pl plugin/recent.pl plugin/ruby.pl plugin/verb.pl readme.txt resource.txt rss.xml touched.txt wiki.cgi wiki.css |
diffstat | 37 files changed, 15279 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /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, <mario@wolczko.com> +# 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<diff>; 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<S> 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<S> to be as long as possible. In this case +I<S> 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<diff>-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<a> and C<b> 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<a b c z>. But actually, the LCS +is C<a x b y c z>: + + 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<LCS>, C<diff>, and +C<traverse_sequences>. + +=head2 C<LCS> + +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<LCS> may be passed an optional third parameter; this is a CODE +reference to a key generation function. See L</KEY GENERATION +FUNCTIONS>. + + @lcs = LCS( \@seq1, \@seq2, $keyGen ); + $lcsref = LCS( \@seq1, \@seq2, $keyGen ); + +Additional parameters, if any, will be passed to the key generation +routine. + +=head2 C<diff> + + @diffs = diff( \@seq1, \@seq2 ); + $diffs_ref = diff( \@seq1, \@seq2 ); + +C<diff> 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<hunks>; each hunk +represents a contiguous section of items which should be added, +deleted, or replaced. The return value of C<diff> 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<a> at +position 0 of the first sequence should be deleted (C<->). The second +hunk says that the C<d> at position 2 of the second sequence should +be inserted (C<+>). The third hunk says that the C<h> at position 4 +of the first sequence should be removed and replaced with the C<f> +from position 4 of the second sequence. The other two hunks similarly. + +C<diff> may be passed an optional third parameter; this is a CODE +reference to a key generation function. See L</KEY GENERATION +FUNCTIONS>. + +Additional parameters, if any, will be passed to the key generation +routine. + +=head2 C<traverse_sequences> + +C<traverse_sequences> is the most general facility provided by this +module; C<diff> and C<LCS> 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<traverse_sequences> 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<traverse_sequences> when arrow A is +pointing to C<$A[$i]> and arrow B is pointing to C<$B[$j]>. When this +happens, C<traverse_sequences> will call the C<MATCH> 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<traverse_sequences> will advance that +arrow and will call the C<DISCARD_A> or the C<DISCARD_B> callback, +depending on which arrow it advanced. If both arrows point to +elements that are not part of the LCS, then C<traverse_sequences> will +advance one of them and call the appropriate callback, but it is not +specified which it will call. + +The arguments to C<traverse_sequences> 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<traverse_sequences> will call the C<A_FINISHED> callback when it +advances arrow B, if there is such a function; if not it will call +C<DISCARD_B> instead. Similarly if arrow B finishes first. +C<traverse_sequences> 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<traverse_sequences> may be passed an optional fourth parameter; this +is a CODE reference to a key generation function. See L</KEY +GENERATION FUNCTIONS>. + +Additional parameters, if any, will be passed to the key generation +function. + +=head1 KEY GENERATION FUNCTIONS + +C<diff>, C<LCS>, and C<traverse_sequences> 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 <mario@wolczko.com>, which is available at +ftp://st.cs.uiuc.edu/pub/Smalltalk/MANCHESTER/manchester/4.0/diff.st + +The algorithm is that described in +I<A Fast Algorithm for Computing Longest Common Subsequences>, +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;
--- /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;
--- /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;
--- /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;
--- /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;
--- /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;
--- /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;
--- /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;
--- /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;
--- /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;
--- /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;
--- /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;
--- /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;
--- /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;
--- /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; +
--- /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<Algorithm::Diff> + +=back + +=head1 AUTHOR + +Hiroshi Yuki <hyuki@hyuki.com> 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;
--- /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; + # <use-can> + # my $funcname = "plugin_$type"; + # my $funcref = \&{"${plugin}::plugin_$type"}; + # my $namespace = \%{"${plugin}::"}; + # </use-can> + # Does the plugin exist? + if ($file) { + eval { + require $file; + # Check if the function is defined or not. + # <use-can> + # if (defined($namespace->{$funcname})) { + # $result = $funcref->($argument, $self->{context}); + # } else { + # push(@{$self->{log}}, "$funcname: undefined function."); + # } + # </use-can> + 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 <hyuki@hyuki.com> 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
--- /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<version> must be 1.0. +B<encoding> 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<XML::RSS> + +=back + +=head1 AUTHOR + +Hiroshi Yuki <hyuki@hyuki.com> 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"; +<?xml version="1.0" encoding="$self->{encoding}" ?> + +<rdf:RDF + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns="http://purl.org/rss/1.0/" + xmlns:dc="http://purl.org/dc/elements/1.1/" +> + +<channel rdf:about="$self->{channel}->{about}"> + <title>$self->{channel}->{title}</title> + <link>$self->{channel}->{link}</link> + <description>$self->{channel}->{description}</description> + <items> + <rdf:Seq> + @{[ + map { + qq{ <rdf:li rdf:resource="$_->{link}" />\n} + } @{$self->{items}} + ]} + </rdf:Seq> + </items> +</channel> +@{[ + map { + qq{ + <item rdf:about="$_->{link}"> + <title>$_->{title}</title> + <link>$_->{link}</link> + <description>$_->{description}</description> + <dc:date>$_->{dc_date}</dc:date> + </item> + } + } @{$self->{items}} +]} +</rdf:RDF> +EOD +} + +1;
--- /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 = <FILE>; + eval("flock(FILE, LOCK_UN)"); + if ($@) { + # Your platform does not support flock. + # Implement another UNLOCK here. + } + close(FILE); + return $value; +} + +1;
--- /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 @@ +XV‚ÌÕ“Ë‚ª”¶‚µ‚Ü‚µ‚½B + +‘¼‚Ìl‚ªA‚±‚̃y[ƒW‚ðXV‚µ‚Ä‚µ‚Ü‚Á‚½‚悤‚Å‚·B + +ˆÈ‰º‚ÉA +‚ ‚È‚½‚Ì•ÒW‚µ‚½ƒeƒLƒXƒg‚ª‚ ‚è‚Ü‚·‚Ì‚ÅA +‚ ‚È‚½‚Ì•ÒW“à—e‚ªŽ¸‚í‚ê‚È‚¢‚悤‚ÉA +‚¢‚Ü‚·‚®Aƒƒ‚’ ‚ȂǂɃRƒs[•ƒy[ƒXƒg‚µ‚Ä‚‚¾‚³‚¢B + +ƒRƒs[•ƒy[ƒXƒg‚ªÏ‚ñ‚Å‚©‚çA +RecentChanges‚ÅÅV‚Ì“à—e‚ðŒ©‚ÄAÄ“x•ÒW‚µ’¼‚µ‚Ä‚‚¾‚³‚¢B
--- /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 @@ +**ƒeƒLƒXƒg®Œ`‚̃‹[ƒ‹ + +’Êí‚Í“ü—Í‚µ‚½•¶Žš‚ª‚»‚Ì‚Ü‚Üo—Í‚³‚ê‚Ü‚·‚ªA +ˆÈ‰º‚̃‹[ƒ‹‚É]‚Á‚ăeƒLƒXƒg®Œ`‚ðs‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·B + +***Šî–{ƒ‹[ƒ‹ +- ˜A‘±‚µ‚½•¡”s‚͘AŒ‹‚³‚ê‚Ü‚·B +- ‹ós‚Í’i—Ž‚Ì‹æØ‚è‚Æ‚È‚è‚Ü‚·B +- s“ª‚ªƒXƒy[ƒX‚ÅŽn‚Ü‚Á‚Ä‚¢‚é‚ÆA‚»‚Ì’i—Ž‚Í®Œ`Ï‚Ý‚Æ‚µ‚Ĉµ‚í‚ê‚Ü‚·B +- HTML‚̃^ƒO‚Í‘‚¯‚Ü‚¹‚ñB + +***•¶Žšü‚è +- ƒVƒ“ƒOƒ‹ƒNƒH[ƒg2ŒÂ‚Å‚Í‚³‚ñ‚¾•”•ª‚ÍA''ƒ{[ƒ‹ƒh''‚É‚È‚è‚Ü‚·B +- ƒVƒ“ƒOƒ‹ƒNƒH[ƒg3ŒÂ‚Å‚Í‚³‚ñ‚¾•”•ª‚ÍA'''ƒCƒ^ƒŠƒbƒN'''‚É‚È‚è‚Ü‚·B + +***Œ©o‚µ +- ƒAƒXƒ^ƒŠƒXƒN(*)‚ðs“ª‚É‘‚‚ÆA‘匩o‚µ‚É‚È‚è‚Ü‚·B +- ƒAƒXƒ^ƒŠƒXƒN2ŒÂ(**)‚ðs“ª‚É‘‚‚ÆA’†Œ©o‚µ‚É‚È‚è‚Ü‚·B +- ƒAƒXƒ^ƒŠƒXƒN3ŒÂ(***)‚ðs“ª‚É‘‚‚ÆA¬Œ©o‚µ‚É‚È‚è‚Ü‚·B +- Œ©o‚µ‚ª‚ ‚é‚ÆŽ©“®“I‚É–ÚŽŸ‚ªì‚ç‚ê‚Ü‚·B + +***‰Óð‘‚«A…•½üAˆø—p•¶ +- ƒ}ƒCƒiƒX(-)‚ðs“ª‚É‘‚‚ÆA‰Óð‘‚«‚É‚È‚è‚Ü‚·B- -- --- ‚Ì3ƒŒƒxƒ‹‚ª‚ ‚è‚Ü‚·B +- ƒ}ƒCƒiƒX4ŒÂ(----)‚ðs“ª‚É‘‚‚ÆA…•½ü‚É‚È‚è‚Ü‚·B +- > ‚ðs“ª‚É‘‚‚ÆAˆø—p•¶‚ª‘‚¯‚Ü‚·B> >> >>> ‚Ì3ƒŒƒxƒ‹‚ª‚ ‚è‚Ü‚·B + +***ƒnƒCƒp[ƒŠƒ“ƒN +- http://www.hyuki.com/‚̂悤‚ÈURL‚ÍŽ©“®“I‚ɃŠƒ“ƒN‚É‚È‚è‚Ü‚·B +- YukiWiki‚̂悤‚ɑ啶Žš¬•¶Žš‚𬂺‚½‰p•¶Žš—ñ‚ð‘‚‚ÆAYukiWiki‚̃y[ƒW–¼‚É‚È‚è‚Ü‚·B +- “ñd‚Ì‘å‚©‚Á‚±[[ ]]‚Å‚‚‚Á‚½•¶Žš—ñ‚ð‘‚‚ÆAYukiWiki‚̃y[ƒW–¼‚É‚È‚è‚Ü‚·B‘å‚©‚Á‚±‚Ì’†‚ɂ̓Xƒy[ƒX‚ðŠÜ‚ß‚Ä‚Í‚¢‚¯‚Ü‚¹‚ñB“ú–{Œê‚àŽg‚¦‚Ü‚·B + +***—pŒê‰ðà +- ƒRƒƒ“(:)‚ðs“ª‚É‘‚‚ÆA—pŒê‚Ɖðà•¶‚ªì‚ê‚Ü‚·BˆÈ‰º‚̂悤‚É‚µ‚Ü‚·B + +---( +:—pŒê1:‚¢‚ë‚¢‚ë‘‚¢‚½‰ðà•¶1 +:—pŒê2:‚¢‚ë‚¢‚ë‘‚¢‚½‰ðà•¶2 +:—pŒê3:‚¢‚ë‚¢‚ë‘‚¢‚½‰ðà•¶3 +---) + +:—pŒê1:‚¢‚ë‚¢‚ë‘‚¢‚½‰ðà•¶1 +:—pŒê2:‚¢‚ë‚¢‚ë‘‚¢‚½‰ðà•¶2 +:—pŒê3:‚¢‚ë‚¢‚ë‘‚¢‚½‰ðà•¶3 + +***ƒe[ƒuƒ‹ +- ƒRƒ“ƒ}(,)‚ðs“ª‚É‘‚‚ÆAƒe[ƒuƒ‹(•\)‚ªì‚ê‚Ü‚·BˆÈ‰º‚̂悤‚É‚µ‚Ü‚·B + +---( +, Wiki‚Ì–¼‘O , ìŽÒ , URL +,Wiki,Ward Cunningham,http://www.c2.com/ +,YukiWiki,Hiroshi Yuki,http://www.hyuki.com/ +,WalWiki,Makio Tsukamoto,http://digit.que.ne.jp/ +---) + +, Wiki‚Ì–¼‘O , ìŽÒ , URL +,Wiki,Ward Cunningham,http://www.c2.com/ +,YukiWiki,Hiroshi Yuki,http://www.hyuki.com/ +,WalWiki,Makio Tsukamoto,http://digit.que.ne.jp/ + +***ƒo[ƒxƒCƒ^ƒ€‹@”\ +- --( ‚Æ --) ‚Å‚‚‚ç‚ꂽs‚Í‘‚¢‚½‚Ü‚Ü•\Ž¦‚³‚ê‚Ü‚·‚ªAƒŠƒ“ƒN‚╶Žšü‚è‚Í—LŒø‚Å‚·(ƒo[ƒxƒCƒ^ƒ€Eƒ\ƒtƒg)B +- ---( ‚Æ ---) ‚Å‚‚‚ç‚ꂽs‚̓Šƒ“ƒN‚╶Žšü‚è‚à–³Ž‹‚³‚ê‚Ä‘‚¢‚½‚Ü‚Ü•\Ž¦‚³‚ê‚Ü‚·(ƒo[ƒxƒCƒ^ƒ€Eƒn[ƒh)B
--- /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 @@ +‚±‚̃y[ƒW‚ÍYukiWiki‚ÌFrontPage‚Å‚·B + +‚à‚µ‚ ‚È‚½‚ªŠÇ—ŽÒ‚È‚çA‚±‚ÌYukiWiki‚ðŒöŠJ‚·‚é‘O‚ÉA +AdminChangePassword‚̃Šƒ“ƒNŒo—R‚ÅŠÇ—ŽÒ‚̃pƒXƒ[ƒh‚ðݒ肵‚Ä‚‚¾‚³‚¢B + +ŠÇ—ŽÒ‚̃pƒXƒ[ƒh‚ªÝ’è‚Å‚«‚½‚È‚çA +frontpage.txt‚ð•ÒW‚µ‚ÄA +‚ ‚È‚½“ÆŽ©‚ÌFrontPage‚ðì‚Á‚Ä‚‚¾‚³‚¢B + +- YukiWiki‚ÌÅVî•ñ‚Í http://www.hyuki.com/yukiwiki/ ‚É‚ ‚è‚Ü‚·B +- RecentChanges‚ªÅ‹ßXV‚³‚ꂽƒy[ƒW‚̈ꗗ‚É‚È‚è‚Ü‚·B +- IndexPage‚Í‘Sƒy[ƒW‚̈ꗗ‚Å‚·B +- —ûK‚É‚ÍSandBox‚ª‚¨Š©‚ß‚Å‚·B
--- /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ì‹Æ‹L˜^ + +*2006-07-06 +- Version 2.1.3. +- Subversion‚ɈÚsB +- RSS‚ðƒtƒ@ƒCƒ‹‚Æ‚µ‚Äo—Í‚·‚é‚悤‚É•ÏXB +-- wiki.cgi: $modifier_rss_about’ljÁB +-- wiki.cgi: $file_rss’ljÁB +-- wiki.cgi: update_rssfile’ljÁB +-- ƒpƒbƒP[ƒW‚Érss.xml’ljÁBà–¾‚Íreadme.txt‚ÉB +- ŠÈ’P‚Èspam‘ÎôB +-- wiki.cgi: keyword_reject’ljÁB +- ƒ[ƒ‹‚Ì‘Ž®‚ð•ÏXB +- ‘‚«ž‚Ý’·‚³‚Ìő姌À +-- wiki.cgi: length_reject’ljÁB +-- wiki.cgi: $max_message_length’ljÁB +-- resource.txt: toolongpost’ljÁB + +*2004-10-24 +- wikibook_branch‚Åì‹Æ’†B +- Version 2.1.2a. +- wiki.cgi: &make_link‚ŃXƒL[ƒ€‚̃`ƒFƒbƒN‚ð“ü‚ê‚é‚悤‚ÉC³B +- zenitani‚³‚ñ‚ÉŠ´ŽÓB +- wiki.cgi: textarea‚©‚çwrap="off"‚ðíœB +- wiki.cgi: Copyright•\Ž¦‚ðPowered by‚É•ÏXB +- cvs tag tag_release-212a_2004-10-24 + +*2004-05-07 +- wikibook_branch‚Åì‹Æ’†B +- wiki.css: VerdanaƒtƒHƒ“ƒg‚ðƒfƒtƒHƒ‹ƒg‚ÉB‚»‚Ì‘¼×‚©‚¢“_‚ðC³B + +*2004-05-06 +- wikibook_branch‚Åì‹Æ’†B +- wiki.css: dl, dt, dd‚ð’²®B + +*2004-03-31 +- wikibook_branch‚Åì‹Æ’†B +- wiki.cgi: RssPage¨$RssPage +- zenitani‚³‚ñ‚ÉŠ´ŽÓB + +*2004-03-27 +- wikibook_branch‚Åì‹Æ’†B +- Version 2.1.2. +- cvs tag tag_release-212_2004-03-28 + +*2004-03-27 +- wikibook_branch‚Åì‹Æ’†B +- plugin/link.pl: http|https|ftp|mailtoˆÈŠO‚ÌURL‚Í–³Ž‹‚·‚é‚悤‚ÉC³B +- zenitani‚³‚ñ‚ÉŠ´ŽÓB + +*2004-03-27 +- wikibook_branch‚Åì‹Æ’†B +- wiki.cgi: –ÚŽŸ•”•ª‚̓^ƒO‚𜋎‚·‚é‚悤‚ÉC³B +- shino‚³‚ñ‚ÉŠ´ŽÓB + +*2004-03-21 +- ‘ЃTƒ|[ƒgƒTƒCƒg‚Éu—ûK—pYukiWikiƒTƒCƒgv‚ðÝ’u‚·‚邽‚ßA•Êƒuƒ‰ƒ“ƒ`‚ðì‚éB +- branch_wb-wiki_2004-03-21 +- http://www.hyuki.com/wb/wiki/wiki.cgi + +*2004-03-02 +- wikibook_branch‚Åì‹Æ’†B +- Yuki/PluginManager.pm: stash‚ðŽg‚킸UNIVERSAL::can‚ðŽg‚Á‚Äsub‚Ì—L–³‚ð”»’èB +- andi‚³‚ñ‚ÉŠ´ŽÓB + +*2004-03-02 +- wikibook_branch‚Åì‹Æ’†B +- Yuki/PluginManager.pm: •s—v‚Èuse vars‚ðíœB + +*2004-02-27 +- wikibook_branch‚Åì‹Æ’†B +- Version 2.1.1. +- readme.txt: plugin‚ÉŠÖ‚·‚é‹Lq˜R‚ê‚ðC³B +- cvs tag tag_release-candidate-211_2004-02-27 +- ‚±‚ê‚ð‘ÐŽû˜^”Å‚É‚·‚é—\’èB + +*2004-02-26 +- wikibook_branch‚Åì‹Æ’†B +- Version 2.1.1. +- ƒvƒ‰ƒOƒCƒ“‚ð’ljÁiƒTƒ“ƒvƒ‹‚Æ‚µ‚Ă̈Ӗ¡‡‚¢‚ª‹‚¢jB +- plugin.txt: ’ljÁB +- plugin/link.pl: ’ljÁB +- plugin/recent.pl: ’ljÁB +- plugin/ruby.pl: ’ljÁB +- plugin/verb.pl: ’ljÁB +- cvs tag tag_release-candidate-211_2004-02-26 +- ‚±‚ê‚ð‘ÐŽû˜^”Å‚É‚·‚é—\’訂â‚ßB + +*2004-02-24 +- wikibook_branch‚Åì‹Æ’†B +- Version 2.1.0e. +- Yuki/PluginManager.pm: ’ljÁB +- wiki.cgi: pluginŠÖ˜A’ljÁB +- resource.txt: pluginŠÖ˜A’ljÁB +- ‚±‚ê‚Ńvƒ‰ƒOƒCƒ“‹@”\‚ªenable‚É‚È‚Á‚½B +-- ƒvƒ‰ƒOƒCƒ“Ž©‘Ì‚Ízip‚É‚Í‚Ü‚¾ŠÜ‚ß‚È‚¢B +-- •W€ƒvƒ‰ƒOƒCƒ“‚ðŒˆ‚ß‚é•K—v‚ª‚ ‚éB + +*2004-02-24 +- wikibook_branch‚Åì‹Æ’†B +- Version 2.1.0d. +- wiki.css: table‚ÌŠDF‚ª‚«‚‚·‚¬‚é‚̂щƒCƒgƒuƒ‹[‚ÉB +- .htaccess: AddType text/css .css ’ljÁB + +*2004-02-24 +- wikibook_branch‚Åì‹Æ’†B +- Version 2.1.0d. +- .htaccess: AddHandler cgi-script .cgi +- wiki.css: body.normal‚ª”²‚¯‚Ä‚¢‚½B + +*2004-02-21 +- wikibook_branch‚Åì‹Æ’†B +- Version 2.1.0d. +- $use_FixedFrontPage‚ªŒø‚¢‚Ä‚¢‚È‚©‚Á‚½B +- RSS‚Ìdc_date‚ªŒø‚¢‚Ä‚¢‚È‚©‚Á‚½B +- cvs tag tag_release-210d_2004-02-21 + +*2004-02-21 +- wikibook_branch‚Åì‹Æ’†B +- Version 2.1.0c. +- UNIXŠÂ‹«‚ų‚µ‚diff‚Å‚«‚È‚¢‚Ì‚ðC³B + +*2004-02-20 +- wikibook_branch‚Åì‹Æ’†B +- Version 2.1.0b. +- ƒƒCƒ“‚ÌYukiWiki‚ð‚±‚Ìƒo[ƒWƒ‡ƒ“‚É–ß‚µA +- ƒvƒ‰ƒOƒCƒ“‹@”\‚Í‚¢‚Á‚½‚ñdisable‚É‚·‚éB + +*2004-02-15 +- wikibook_branch‚Åì‹Æ’†B +- Version 2.1.0b. +- wiki.cgi: textarea‚Ì擪‚É1ŒÂ‰üs‚ð“ü‚ê‚éB + +*2004-02-13 +- wikibook_branch‚Åì‹Æ’†B +- wiki.cgi: RSS Autodiscovery—p‚̃wƒbƒ_‚ð’ljÁB +- <link rel="alternate" type="application/rss+xml" title="RSS" href="$url_cgi?RssPage" /> + +*2004-02-13 +- wikibook_branch‚Åì‹Æ’†B +- Version 2.1.0a. +- RSS‚Ìchannel‚Ìabout‚É‚ÍRSS‚Ìchannel‚ð“ü‚ꂽ‚Ù‚¤‚ª‚æ‚¢‚Æ‚¢‚¤‚Ì‚ÅC³B +- Yuki/RSS.pm: channel‚Éabout‚ð’ljÁBVersion 0.4. +- wiki.cgi: $modifier_rss_link‚ðŽg‚Á‚ÄaboutƒtƒB[ƒ‹ƒh‚ð–„‚ß‚é. + +*2004-02-09 +- wikibook_branch‚Åì‹Æ’†B +- Version 2.1.0. +- cvs tag tag_release-210_2004-02-09 + +*2004-02-09 +- wikibook_branch‚Åì‹Æ’†B +- Yuki/YukiWikiDB.pm: ƒtƒ@ƒCƒ‹‘‚«ž‚Ý‚Ìbinmode‚ð‚â‚ß‚éB +- WindowsŠÂ‹«‚ÅCR LF‚ÆLF‚ª¬Ý‚µ‚Ä‚µ‚Ü‚¢diff‚ª³‚µ‚o‚È‚¢‚½‚ßB +- wiki.css: ®—B + +*2004-02-02 +- wikibook_branch‚Åì‹Æ’†B +- ‚±‚±‚Ü‚Å‚Ì‹@”\‚ð2.1.0‚É‚µ‚悤‚ÆŽv‚Á‚Ä‚¢‚éB + +*2004-02-02 +- wikibook_branch‚Åì‹Æ’†B +- wiki.css, wiki.cgi: [VerbatimSoft] ƒo[ƒxƒCƒ^ƒ€‚ð“ü‚ꂽB --(, --) +- wiki.css, wiki.cgi: [VerbatimHard] ƒo[ƒxƒCƒ^ƒ€‚ð“ü‚ꂽB ---(, ---) +- Yuki/RSS.pm: dc_date‚ð“ü‚ꂽ(WalWikiŽQl)B +- Yuki/RSS.pm: xmlns”²‚¯C³(Thank you, y-Aki‚³‚ñ)B +- wiki.cgi: WalWiki‚ÉK‚Á‚Äencode‚ðC³[better encode]B +- resource.txt, wiki.cgi: &text_to_html: –ÚŽŸ‚ª‚ ‚é‚Æ‚«‚Íu–ÚŽŸv‚ð’ljÁB +- wiki.cgi: Fix bug: Œ©o‚µ•¶Žš—ñ‚ª‹ó‚ÌŽž‚É‚ÍŒ©o‚µ‚Æ‚µ‚Ĉµ‚í‚È‚¢‚悤‚É‚µ‚½B +- wiki.cgi: Œ©o‚µƒŒƒxƒ‹‚ð*, **, ***‚Ì3ƒŒƒxƒ‹‚É‚µ‚½B +- wiki.cgi: $use_FixedFrontPage‚𓱓ü‚µ‚ÄFrontPage‚ð•ÒW‰Â”\‚É‚Å‚«‚é‚悤‚É‚µ‚½B +- frontpage.txt: Fix typo. +- wiki.css: Styles for printer. +- wiki.cgi: Add "editlink" class. + +*2004-01-26 +- wikibook_branch‚Åì‹Æ’†B +- TODO: + - prohosting‚Å“®ìŠm”FB“Á‚Émodifier_...‚ð•ÏX‚µ‚½ê‡B + +*2004-01-25 +- šˆÈ‰ºAwikibook_branch‚Åì‹Æš +- 2004-12-04`2004-01-14‚ÌC³‚Ítrunk‘¤‚È‚Ì‚ÅA‚±‚¿‚ç‚É‚Í‚Ü‚¾”½‰f‚³‚ê‚Ä‚¢‚È‚¢‚±‚Æ‚É’ˆÓB +- wiki.cgi: ƒo[ƒWƒ‡ƒ“–¼‚ÉWB‚ð•t‰Á‚·‚éBCopyright•\‹L‚ðC³B +- convert.cgi: 휂·‚éB +- history1.txt: 휂·‚éB +- history2.txt: 휂·‚éB +- history.txt: trunk‚Ì•û‚©‚瓇‚·‚éB +- frontpage.txt: C³B +- ‚±‚±‚Ü‚Å‚Å“®ìŠm”FBƒ^ƒO‚𒣂éB +- cvs tag tag_run_2004-01-26 + +*2004-01-25 +- YukiWiki 2.0.6Œn‚ð/wb/wiki‚Ɉړ®‚µA‚»‚¿‚ç‚ðV‚½‚È2.1Œn‚É‚·‚éB +- YukiWiki 2.1.devŒn‚Í•Û—¯‚Æ‚·‚éB + +*2004-01-14 +- YukiWiki 2.1.dev8‚Åì‹Æ’†B +- readme.txt‚ɇ‚킹‚ăfƒBƒŒƒNƒgƒŠ‚ð®—‚µ‚½B +- ‚»‚ê‚É”º‚¢Aconfig.pl‚ð®—B +- theme/ ƒfƒBƒŒƒNƒgƒŠ‚ðì¬BCSS‚ÆGIF‚Í‚±‚±‚É“ü‚ê‚éB + +*2003-12-20 +- YukiWiki 2.1.dev8‚Åì‹Æ’†B +- Œ©o‚µƒŒƒxƒ‹‚ð*, **, ***‚Ì3ƒŒƒxƒ‹‚É‚µ‚½B +- Jcode-0.68‚ðlibˆÈ‰º‚É“WŠJ‚µ‚½B +- do_rss: Jcode‚ð—p‚¢AEUC-JP, Shift_JIS, UTF-8‚Ì‚¢‚¸‚ê‚Å‚àRSSo—͉”\‚É‚µ‚½B +- config.pl: rss_encoding‚ð’ljÁB +- config.pl: kanjicode‚ðíœBƒRƒ“ƒeƒ“ƒc‚Ícharset‚Å“ˆê‚·‚éB +- code_convert: •¶ŽšƒR[ƒh‚ð“K؂Ƀ}ƒbƒsƒ“ƒO‚·‚é‚悤‚É‚µ‚½B +- readme.txt: ‚΂ç‚΂ç‚É‚È‚Á‚Ä‚¢‚½î•ñ‚ðW‚ß‚½‚èAƒfƒBƒŒƒNƒgƒŠˆê——‚ðì‚Á‚½‚肵‚½B + +*2003-12-14 +- YukiWiki1‚Ìhistory1.txt‚Æhistory2.txt‚ð‚Ü‚Æ‚ß‚Ähistory.txt‚Æ‚µ‚½B +- test_convert‚ðíœB +- YukiWikiMini‚ÌꊂðˆÚ“®B + +*2003-12-14 +- plugins/ ¨ plugin/ ‚É–¼‘O•ÏXB +- image/ ì¬B + +*2003-12-13 +- YukiWiki 2.1.dev7‚Åì‹Æ’†B +- config.pl: ì¬B +- $modifier_ •Ï”ŒQ‚ð‚·‚×‚Ä$config{ }‚É•ÏXB + +*2003-12-11 +- template.html, wiki.css: transparent‚ÍCSS‚É‘‚B +- plugins/attach.pl: 쬒†B + +*2003-12-10 +- YukiWiki 2.1.dev5‚Åì‹Æ’†B +- Yuki::Template‚ÌŽÀ‘•B +- template.html: ƒeƒ“ƒvƒŒ[ƒg—á‚ðì¬B +- %decoration: íœB +- dump_error: ’ljÁBƒeƒ“ƒvƒŒ[ƒg‚ªŽg‚¦‚È‚‚Ä‚àŽg‚¦‚éprint_error‘Š“–B +- resource.txt: ‚¢‚ë‚¢‚ë’ljÁB +- &text_to_html: –ÚŽŸ‚ª‚ ‚é‚Æ‚«‚Íu–ÚŽŸv‚ð’ljÁB + +*2003-12-09 +- YukiWiki 2.1.dev4‚Åì‹Æ’†B +- ActionPlugin‚̉º€”õB +- linktree.pl: WikiName‚ªarmored‚Ì‚Æ‚«‚̃oƒOC³B + +*2003-12-09 +- YukiWiki 2.1.dev3‚Åì‹Æ’†B +- filterƒvƒ‰ƒOƒCƒ“‚ÌŽd—l‚ð•ÏXBdefined‚Ì‚Æ‚«ƒI[ƒo[ƒ‰ƒCƒh‚·‚é‚悤‚É‚µ‚½B +- filter_layout.pl: ƒTƒ“ƒvƒ‹‚Æ‚µ‚Äspecial_rawout‚ðì‚Á‚½B + +*2003-12-08 +- YukiWiki 2.1.dev2‚Åì‹Æ’†B +- WalWiki‚ÉK‚Á‚Äencode‚ðC³[better encode]B +- [LinkTreePlugin][[ƒŠƒ“ƒNƒcƒŠ[ƒvƒ‰ƒOƒCƒ“]]‚ðì‚Á‚Ä‚Ý‚½(linktree.pl)B +- RSS.pm‚Ì‚Åxmlns”²‚¯C³(Thank you, y-Aki‚³‚ñ)B + +*2003-12-07 +- YukiWiki 2.1.dev1‚Åì‹Æ’†B +- ƒtƒBƒ‹ƒ^ƒvƒ‰ƒOƒCƒ“‚Ì‹@\‚ð“ü‚ꂽB +- ƒuƒƒbƒNƒvƒ‰ƒOƒCƒ“‚ð“ü‚ꂽB +- [VerbatimSoft] ƒo[ƒxƒCƒ^ƒ€‚ð“ü‚ꂽB --(, --) +- [VerbatimHard] ƒo[ƒxƒCƒ^ƒ€‚ð“ü‚ꂽB ---(, ---) +- [FilterPlugin] ƒtƒBƒ‹ƒ^‹@”\‚ð“ü‚ꂽBƒTƒ“ƒvƒ‹‚Æ‚µ‚Äfilter_layout.pl‚ðŽÀ‘•‚µ‚½B +- [AutoPluginUsage]ƒvƒ‰ƒOƒCƒ“‚Ì—˜—p•û–@‚ªŽ©“®“I‚É•ÒWŽž‚̃wƒ‹ƒv‚ÉŽæ‚èž‚Ü‚ê‚悤‚É‚µ‚½B +- Fix bug: Œ©o‚µ•¶Žš—ñ‚ª‹ó‚ÌŽž‚É‚ÍŒ©o‚µ‚Æ‚µ‚Ĉµ‚í‚È‚¢‚悤‚É‚µ‚½B + +*2003-12-06 +- YukiWiki 2.1.dev0‚Åì‹Æ’†B +- ƒvƒ‰ƒOƒCƒ“‚Ì‹@\‚ð“ü‚ꂽB‚Æ‚è‚ ‚¦‚¸&user_plugin(argument)‚ÌŒ`Ž®B +- plugins/link.pl‚Å–¼‘O•t‚«ƒŠƒ“ƒN‚ðŽÀŒ»‚µ‚½B +- plugins/amazon.pl‚ŃAƒ}ƒ]ƒ“‚̃Šƒ“ƒN‚ðŽÀŒ»‚µ‚½B +- RSS.pm‚Édc_date‚ð“ü‚ꂽ(WalWikiŽQl)B + +*2003-12-04 +- YukiWiki 2.1.dev0‚Åì‹Æ’†B +- Yuki::YukiWikiDB‚ðƒfƒtƒHƒ‹ƒg‚É‚µ‚½B +- $use_FixedFrontPage‚𓱓ü‚µ‚ÄFrontPage‚ð•ÒW‰Â”\‚É‚Å‚«‚é‚悤‚É‚µ‚½B +- WalWiki‚Ì’Ë–{‚³‚ñ‚©‚ç—L‰v‚Èî•ñ‚Æ—ã‚Ü‚µ‚ð‚½‚‚³‚ñ‚¢‚½‚¾‚¢‚½B + +*2003-07-13 +- YukiWiki 2.0.6xx‚Åì‹Æ’†B +- 2.0.6x‚Å“ü‚ꂽC³‚ÌÄC³BƒRƒƒ“ƒg‹@”\‚Ì‚ ‚½‚èB + +*2003-06-06 +- YukiWiki 2.0.6x‚Åì‹Æ’†B +- ®Œ`Ï‚Ý‚Ì’†‚Ìembed_command, embed_rcommand‚̈µ‚¢‚ðC³’†B’Ë–{‚³‚ñ‚ÌŽw“E‚É‚æ‚éB +- TODO:AnyDBM_File‚ÅYuki::YukiWikiDB‚ðƒfƒtƒHƒ‹ƒgƒf[ƒ^ƒx[ƒX‚̇”Ô‚ð‚¢‚¶‚é‚悤‚É‚µ‚½‚Ù‚¤‚ª‚æ‚¢‚ÆŽv‚¤B + +*2003-02-23 +- /^\s*$/ ‚Ƀ}ƒbƒ`‚µ‚½‚Æ‚«‚É’Ê탂[ƒh‚É–ß‚é‚Ì‚Å‚Í‚È‚/^$/‚Ƀ}ƒbƒ`‚µ‚½‚Æ‚«‚É–ß‚é‚悤‚ÉC³B +‚±‚ê‚ÍA<pre>‚Ì’†‚ɃXƒy[ƒX‚¾‚¯‚Ìs‚ªŠÜ‚܂ꂽ‚Æ‚«‚Ɉê“x</pre>‚É‚È‚Á‚Ä‚µ‚Ü‚¤‚Ì‚ð–h‚®‚½‚ßB + +*2002-08-28 +- Yuki::YukiWikiDB‚Éflock‚ð“ü‚ꂽB +- Yuki::YukiWikiDB‚̃fƒoƒbƒOƒvƒŠƒ“ƒg‚ðdie‚É•ÏX‚µ‚½B +- hyuki.com‚ʼn^—p‚µ‚Ä‚¢‚½YukiWiki‚̃f[ƒ^ƒx[ƒX‚𕜋ŒB +- AnyDBM_File‚©‚çYuki::YukiWikiDB‚ÉŽè“®‚Å•ÏŠ·B +- wiki.cgiƒXƒNƒŠƒvƒg‚É‚Í•ÏX‚È‚µB + +*2002-08-22 +- YukiWiki 2.0.5ŒöŠJB + +*2002-08-22 +- 2.0.4‚ÌXSS‘Îô‚É•s\•ª‚È“_‚ª‚ ‚Á‚½‚Ì‚Å&print_editformC³(ŠÖ‘º‚³‚ñ‚ÌŽw“E‚É‚æ‚é)B +$form{mypassword}‚ð&escape‚µ‚Ä‚¢‚È‚©‚Á‚½B +- $resource{anydbmfileerroranydbmfileerror}‚ÌtypoC³B + +*2002-07-12 +- YukiWiki 2.0.4ŒöŠJB + +*2002-07-12 +- 2.0.3‚ÌXSS‘Îô‚É•s\•ª‚È“_‚ª‚ ‚Á‚½‚Ì‚Å&make_linkC³(’Ë–{–q¶‚³‚ñ‚ÌŽw“E‚É‚æ‚é)B +- ”z•z•¨‚ɃfƒoƒbƒO—p‚̃R[ƒh‚ªŽc‚Á‚Ä‚¢‚½‚̂ŃRƒƒ“ƒgƒAƒEƒgB + +*2002-07-11 +- YukiWiki 2.0.3ŒöŠJB + +*2002-07-11 +- office‚³‚ñ‚©‚çuƒNƒƒXƒTƒCƒgƒXƒNƒŠƒvƒeƒBƒ“ƒOÆŽã«v‚ÌŽw“E‚ðŽó‚¯‚éB +- ƒy[ƒW–¼‚ɃXƒNƒŠƒvƒg‚ª¬“ü‚³‚¹‚ç‚ꂽꇂɑΈB +- ¶‚Ńy[ƒW–¼‚ðŒ©‚¹‚¸A•K‚¸&escape‚·‚éC³‚ðs‚¤B + +*2002-06-30 +- do_index‚Ńy[ƒW˜R‚ꂪ¶‚¶‚é–â‘è‚Í‚Ü‚¾–¢‰ðŒˆB +- use AnyDBM_File;‚ðeval‚Å‚‚é‚ÝAƒGƒ‰[‚É‚È‚ç‚È‚¢‚悤‚É’ˆÓ‚·‚éB +- ƒGƒ‰[‚É‚È‚Á‚½‚Æ‚«A$modifier_dbtype‚ªAnyDBM_File‚É‚È‚Á‚Ä‚¢‚½‚çƒGƒ‰[ƒy[ƒW‚ð•\Ž¦B +- (Ž©“®“I‚É$modifier_dbtype‚ð•ÏX‚·‚邱‚Æ‚Í‚µ‚È‚¢) + +*2002-06-06 +- YukiWiki 2.0.0ŒöŠJB + +*2002-05-31 +- history1.txt, history2.txtì¬B +- wikiman_ja.plì¬B + +*2002-05-22 +- #‚ÅŽn‚Ü‚éƒy[ƒW–¼‚Ínot is_editable. +- Õ“Ë‚ª‹N‚«‚½‚Æ‚«‚̉æ–Ê‚ðC³B + +*2002-05-21 +- RSS‚ðXMLƒtƒ@ƒCƒ‹‚Å‚Í‚È‚CGIŒo—R‚Åo‚·‚悤‚ÉC³B +- &‚𳂵‚ƒy[ƒW–¼‚Æ‚µ‚Ĉµ‚¦‚é‚悤‚ÉC³B +- wiki.cgi‚ðreadme2.txt‚ðreadme_en.txt‚Æreadme_ja.txt‚É•ª—£B +- CGI’†‚ÌPOD‚ÍŬŒÀ‚É‚µ‚½B +- ƒf[ƒ^ƒfƒBƒŒƒNƒgƒŠ‚ð•ÊƒfƒBƒŒƒNƒgƒŠ‚É‚Å‚«‚é‚悤‚É$modifier_dir_data‚𓱓ü‚µ‚½B +- alpha6 + +*2002-05-19 +- footer‚Ì•”•ª‚Íaddress—v‘f‚É•ÏXBshino‚³‚ñ‚ÌŽw“E‚É‚æ‚éB +- –ÚŽŸƒŠƒ“ƒN‚ɃoƒO‚ ‚èB—]Œv‚È#‚ª‚ ‚èA‚¤‚Ü‚–ÚŽŸƒŠƒ“ƒN‚©‚çƒWƒƒƒ“ƒv‚Å‚«‚È‚©‚Á‚½B + +*2002-05-18 +- WalWiki‚ðŽQl‚É‚µ‚ÄAƒy[ƒW‚Ì * ‚â ** ‚Í–ÚŽŸ‚Æ‚µ‚ÄŽûW‚·‚é‚悤‚É‚µ‚½B + +*2002-05-17 +- ƒvƒŒƒrƒ…[‰æ–Ê(YukiWiki1‚©‚玂Á‚Ä‚«‚½) +- YukiWiki1‚©‚çYukiWiki2‚ւ̈Úsƒc[ƒ‹(WalWiki‚Ìconvert.cgi‚ð‰ü‘¢BŠ´ŽÓ)B +- wiki.txt¨frontpage.txt‚ɃŠƒl[ƒ€B +- YukiWikiDB‚ð•Êƒtƒ@ƒCƒ‹‚É‚µ‚ÄYuki::YukiWikiDB‚Ɉړ®B +- AnyDBM_File, YukiWikiDB, dbmopen‚Ì3•ûŽ®‚ɑΉži‚Ó‚¤cjB +- alpha5‚̃XƒNƒŠƒvƒg‚ðŒöŠJB +- YukiWiki1‚̃f[ƒ^‚ð‚²‚»‚Á‚ÆYukiWiki2‚ɈÚs‚µ‚Ä‚Ý‚éB‘åä•v‚¾‚낤‚©cB +- ‚Æ‚è‚ ‚¦‚¸AYukiWiki1‚Ì‚Ù‚¤‚Í•ÒW‚Å‚«‚È‚‚µ‚Ä‚Ý‚½B‚»‚Ì‚¤‚¿AŽ©“®“I‚ÉYukiWiki2‚É“]‘—‚·‚é‚悤‚É‚·‚é‚‚à‚èB + +*2002-05-16 +- exists‚ª‚È‚¢ê‡‚É‚Ídefined‚Å‘ã—p‚Å‚«‚é‚悤‚É$use_exists‚𓱓üB +- RecentChanges‚ÌXVƒ~ƒX‚ðC³B + +*2002-05-14 +- RSS‹@”\(Yuki::RSS)‚ð’ljÁ‚µ‚½B +- ·•ª—p‚̃R[ƒh‚ª‚²‚¿‚Ⴒ‚¿‚Ⴕ‚Ä‚¢‚½‚Ì‚ÅAYuki::DiffText‚ðì‚Á‚½B +- WalWiki(http://digit.que.ne.jp/work/index.cgi?WalWiki)‚©‚çƒR[ƒh‚ðŽØ‚è‚ăe[ƒuƒ‹‚ðŽÀ‘•B +- alpha3‚̃XƒNƒŠƒvƒg‚ðŒöŠJB + +*2002-05-13 +- •’ʂ̃y[ƒW‚𓀌‹‚·‚éŽè’i‚Í‚·‚Å‚Éì‚ç‚ê‚Ä‚¢‚éB +- FrontPage‚É‘å‚«‚ȃƒS‚ð‚‚¯‚½B +- ·•ª‚ð‚Ü‚¸‚Í‘g‚Ýž‚ñ‚¾BŠ®‘S‚ɂ̓Šƒ\[ƒX‰»‚³‚ê‚Ä‚¢‚È‚¢BHTML::Template‚ªŽg‚¢‚½‚‚È‚éB + +*2002-05-09 +- ‰æ‘œ‚ðimg‰»‚·‚é‚悤‚É‚µ‚½B +- FormatRule‚ð•ÒW‰æ–ʂ̉º‚Ì‚Ù‚¤‚Éo‚·‚悤‚É‚µ‚½B + +*2002-05-08 +- TfWiki‚ðYukiWiki2‚Æ‚µ‚ÄAƒfƒBƒŒƒNƒgƒŠˆÚ“®B +- Œ³‚ÌTfWiki‚Ì‚Ù‚¤‚ւ̃Šƒ“ƒN‚ÍYukiWiki2‚ÖƒŠƒ_ƒCƒŒƒNƒgB + +*2002-04-14 +- [[YukiWiki2]]‚ðŽŸ‰ñ‚ÌC MAGAZINE‚̘AÚ‘èÞ‚É‚µ‚悤‚Æl—¶’†B +- [[YukiWiki2]]‚̃ƒS쬈˗Š’†B + +*2002-03-27 +- [[ˆêŒ¾ƒRƒƒ“ƒg‹@”\]]‚Å‘‚«ž‚ñ‚Å‚à[[XV—š—ð]]‚ªXV‚³‚ê‚È‚¢•s‹ï‡‚ÌC³B +- [[ˆêŒ¾ƒRƒƒ“ƒg‹t‡‹@”\]]‚ðŽŽ‚µ‚ÉŽÀ‘•‚·‚éB + +*2002-03-26 +- [[‘åã•Ù:TfWikiì‹Æ‹L˜^]]‚Æ‚¢‚¤‚Ì‚Í‚Ç‚¤‚Å‚µ‚傤‚©B[[‹Éˆ«]]‚³‚ñ‚Ì‚²Ð‰îB +- ‰æ‘œ‚̃ƒS‚Í•s—v‚©‚à‚µ‚ê‚È‚¢‚ªAƒŠƒ“ƒN—pƒoƒi[ƒAƒCƒRƒ“88x31‚Í‚ ‚Á‚Ä‚à‚¢‚¢‚©‚ÈB¡“x‚ÍŠ„‚ƃVƒƒ[ƒv‚ÈŠ´‚¶‚É‚µ‚½‚¢‚ÈB +- •ÒW‚̃Šƒ“ƒN‚ɉ摜‚ðŽg‚¤‚±‚Æ‚Í‚â‚ç‚È‚¢—\’èB‚ ‚ ‚¢‚¤ƒAƒCƒRƒ“‚Á‚Ä•ª‚©‚è‚É‚‚¢‚ÆŽv‚¤‚©‚çB +- ƒƒjƒ…[ƒo[‚ÍŠ¿Žš•\‹L‚É‚È‚Á‚Ä‚¢‚邯‚ê‚ÇAŽÀ‚̓XƒNƒŠƒvƒg’†‚É‚Í‚Ü‚Á‚½‚“ú–{Œê‚Í‚È‚¢‚Ì‚¾BƒŠƒ\[ƒXƒtƒ@ƒCƒ‹‚Æ‚µ‚ÄŠO•”ƒtƒ@ƒCƒ‹‰»‚µ‚Ä‚¢‚éB‚¾‚©‚ç‚â‚é‹C‚É‚È‚ê‚ÎAƒXƒNƒŠƒvƒg‚Í‚»‚Ì‚Ü‚Ü‚ÅA(ƒNƒbƒL[‚âCGI‚Ö“n‚·ˆø”‚È‚Ç‚Å)‰pŒê/“ú–{Œê‚Ì‘SØ‚è‘Ö‚¦‚à‰Â”\‚È‚Ì‚¾B +- ’m‚ç‚È‚¢‚¤‚¿‚É[[‰pŒê”Å:FrontPage]]‚à‚Å‚«‚»‚¤‚ÈŠ´‚¶BInterWikiName‚ɒljÁ‚µ‚Ä‚‚ꂽlA‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·B + +*2002-03-25 +- AdminEdit‚ł̃Gƒ“ƒR[ƒh–Y‚êC³B +- ƒ^ƒCƒgƒ‹‚ðŒŸõƒŠƒ“ƒN‚É‚µ‚½B +- TfWiki‚à‚¢‚¢‚¯‚ê‚ÇAYukiWiki‚ðƒo[ƒWƒ‡ƒ“ƒAƒbƒv‚µ‚½‚‚È‚Á‚Ä‚«‚½B +- ‹}‚É®Œ`ƒ‹[ƒ‹‚ð•ÏX‚µ‚Ä‚Ý‚éB“–‘R‚Ì‚²‚Æ‚‚ ‚¿‚±‚¿‚̃ŒƒCƒAƒEƒg‚ª‚¨‚©‚µ‚‚È‚é‚Ì‚Å‚ ‚Á‚½B‚Ђ¦[B +- ‚¾‚ñ‚¾‚ñTfWiki‚Å‚Í‚È‚AYukiWiki2.0‚ðì‚Á‚Ä‚¢‚é‹C•ª‚É‚È‚Á‚Ä‚«‚Ü‚µ‚½B +- [[ˆêŒ¾ƒRƒƒ“ƒg‹@”\]]‚ðŽÀ‘•‚µ‚Ü‚µ‚½B +- RecentChanges‚âˆêŒ¾ƒRƒƒ“ƒg‚Ì“ú•t‚¯‚Ímonospace‚É‚È‚é‚悤‚ɃXƒ^ƒCƒ‹Žw’èB +- ˆêŒ¾ƒRƒƒ“ƒg‚ð‚‚¯‚½‚Æ‚«‚É‚àRecentChanges‚ªXV‚³‚ê‚é‚悤‚ÉC³B +- PlugIn‹@”\‚ðŽÀ‘•‚µ‚Ä‚¢‚éWiki‚ª‚ ‚邯‚ê‚ÇAŽ„‚ÍPlugIn‚É‚Í‚ ‚Ü‚è‹»–¡‚È‚µB +- ‚Å‚«‚邾‚¯ƒVƒ“ƒvƒ‹‚ÉA‚Å‚à‚ ‚¿‚±‚¿‚ÌWikiClones‚ÅŽÀ‘•‚³‚ê‚Ä‚¢‚é•Ö—˜‚È‹@”\‚ÍŽæ‚èž‚ñ‚Å‚¢‚‚‚à‚èB +- ‚ÅA“K“–‚ȃ^ƒCƒ~ƒ“ƒO‚ÅŒ»Ý‚ÌYukiWikiƒŒƒ|ƒWƒgƒŠ‚ðEUC‚É•ÏŠ·‚µ‚ÄAYukiWiki‚̃o[ƒWƒ‡ƒ“ƒAƒbƒv‚ւƂ‚Ȃ°‚Ä‚¢‚±‚¤‚ÆŽv‚Á‚Ä‚¢‚éB +- [[YukiWiki2]]Œü‚¯‚̃ƒS‚àì‚肽‚¢‚ÈB +- ‚±‚̃y[ƒW‚ðŠÏŽ@‚µ‚Ä‚¢‚éƒy[ƒW‚𔌩(^_^) => http://www1.u-netsurf.ne.jp/~dune/wiki_2Epl.html? + +*2002-03-24 +- InterWiki‚ðŽÀŒ±“I‚ÉŽÀ‘•’†B[[google:Œ‹é_]] +InterWiki‚̓NƒŠƒbƒN‚³‚ꂽ‚Æ‚«‚É“WŠJ‚µ‚½‚Ù‚¤‚ª‚æ‚¢A‚Æ‚¢‚¤Žw“E‚ª‚ ‚è‚Ü‚µ‚½B +‚Å‚àA‚»‚ê‚Ù‚Ç‘å‚«‚È•‰’S‚Å‚Í‚È‚¢‚ÆŽv‚¤‚Ì‚ÅA‚Ü‚¸‚Í‚±‚Ì‚Ü‚Ü‚É‚µ‚Ä‚¨‚«‚Ü‚·B +- ƒ^ƒCƒ€ƒXƒ^ƒ“ƒv‚ÌXV‚ð‚â‚߂邱‚Æ‚à‰Â”\‚É‚µ‚Ü‚µ‚½B +- ƒ^ƒbƒ`ƒtƒ@ƒCƒ‹‚ð‚¢‚ê‚ÄAXVî•ñ‚Ń`ƒFƒbƒN‚µ‚â‚·‚‚µ‚Ü‚µ‚½B +- ŠÇ—ŽÒ‚Æ‚¢‚¤‘¶Ý‚ð“ü‚ê‚Ü‚µ‚½BŠO‚©‚ç‚ÍŒ©‚¦‚È‚¢‚¯‚ê‚ÇB +- [[“€Œ‹ƒy[ƒW‹@”\]]‚ðŽÀ‘•‚µ‚Ü‚µ‚½B‚¿‚È‚Ý‚É‚±‚̃y[ƒWŽ©g‚à“€Œ‹B +- “€Œ‹ƒy[ƒW‚Ìꇂɂ͉E‰º‚ÉAdminEdit‚̃Šƒ“ƒN‚ð—pˆÓ‚·‚é‚悤‚É‚µ‚½B + +*2002-03-23 +- “ú–{Œê‚ÌWikiName‚Í[[ ]]‚Å‚‚‚邱‚Æ‚É‚µ‚Ü‚µ‚½B +-- KbWiki‚̂悤‚Éu@@v‚É‚µ‚悤‚©‚ÈcB +-- ‚»‚êATiki‚Å‚»‚¤‚È‚Á‚Ä‚¢‚邯‚ÇA‚È‚É‚©‚Æ•s•Ö‚Å‚·dddB +-- ‚Ó‚¤‚ñA‚â‚Á‚Ï‚è“‚¢‚à‚Ì‚È‚Ì‚Å‚·‚ËB +-- Žv‚¢•t‚«‚Å‚·‚ªA"‚Ù‚°‚Ù‚°BB"‚Æ‚¢‚¤‚悤‚ÉA‚Ü‚é‚ð‚Q‚•t‚¯‚ê‚ÎWikiname‚É‚È‚é‚Æ‚¢‚¤‚Ì‚Ç‚¤‚Å‚µ‚傤‚©B‚¢‚¿‚¢‚¿AIME‚ðØ‘Ö‚¦‚È‚‚ÄŠy‚©‚à’m‚ê‚Ü‚¹‚ñB +-- ‚Ü‚½‚ÍA"”‚Ù‚°‚Ù‚°"‚̂悤‚ÉA‘SŠp‚Ì”‚ð•t‚¯‚½‚Æ‚«‚Æ‚©B”‚Í–Å‘½‚ÉŽg‚¢‚Ü‚¹‚ñ‚µB +-- ƒAƒCƒfƒBƒA‚Ç‚¤‚à‚Å‚·BEUC‚É‚·‚é‚Æ[[ ]]‚Å‚‚‚Á‚Ä‚à‚ ‚Ü‚è‚«‚É‚È‚ç‚È‚‚È‚Á‚¿‚á‚¢‚Ü‚µ‚½... + +- Փ˂̃`ƒFƒbƒNB +-- ‚¿‚È‚Ý‚ÉAՓ˂̃`ƒFƒbƒN‚ÍYukiWiki‚Ì‚Æ‚«‚Æ“¯‚¶‚悤‚Ƀy[ƒW‚̃nƒbƒVƒ…’l‚ðŽg‚¤B +-- Last modified‚Ìî•ñ‚ð“ü‚ê‚é +-- ‚±‚êA‚à‚¤‚µ”Ä—p‚É‚µ‚ÄAƒy[ƒW‚Ìuƒwƒbƒ_v‚ðì‚éBSubject‚à‚»‚±‚É“ü‚ê‚éB +-- Œ‹‹ÇAՓ˂̃`ƒFƒbƒN‚ÍLast-Modifed‚Ìî•ñ‚ð•Êƒf[ƒ^ƒx[ƒX‚É‚¢‚ꂽB +-- ƒy[ƒW‚̃wƒbƒ_‚͔ώG‚·‚¬‚é‚Ì‚Å‚â‚ßB + +*2002-03-22 +- ˆÈ~‚ÍAYukiWiki2‚Ìì‹Æ‹L˜^‚Å‚ ‚éB +- IndexPage, SearchPage, HelpPage‚È‚Ç‚ðì‚é +-- ‚±‚êAInterWiki‚Ì‹@”\‚ðŽg‚Á‚ÄŽÀŒ»‚Å‚«‚»‚¤‚¾‚ÈBŽ©•ªŽ©g‚ðƒT[ƒo‚Æ‚·‚éB + +*2002-03-06 +- Version 1.6.8B +- ƒXƒ^ƒCƒ‹ƒV[ƒg‚ð•Êƒtƒ@ƒCƒ‹‚Æ‚µ‚½($stylesheet)B +- Content-type‚ðo—Í‚·‚éÛ‚Écharset‚𖾎¦“I‚Éo‚·‚悤‚É‚µ‚½(print_header)B +- ƒvƒŒƒrƒ…[‰æ–Ê‚Å‚àXV‚ÌÕ“Ë‚ðƒ`ƒFƒbƒN‚·‚é‚悤‚ÉC³(check_conflict)B +- ·•ª•\Ž¦‚Ì‚Æ‚«Aƒ‚ƒmƒNƒ‚ȃuƒ‰ƒEƒU‚Å‚à•ª‚©‚é‚悤‚É•\Ž¦(do_diff)B + +*2002-03-01 +- Version 1.6.7B +- ƒpƒbƒP[ƒW‚ÉDiff.pm‚𓯫B + +*2001-10-20 +- Version 1.6.6B +- XV‚ÌÕ“Ë‘ÎôB +- Œ³ƒy[ƒW‚ÌŠÈ’P‚ȃ`ƒFƒbƒNƒTƒ€‚ðŽæ‚Á‚Ä‚¨‚«AXV‘O‚Ƀ`ƒFƒbƒNƒTƒ€‚ð”äŠr‚·‚éB +C³ŒÂŠ‚Ídigest‚Æ‚¢‚¤•¶Žš—ñ‚ðŒŸõ‚·‚ê‚Εª‚©‚éB +–{—ˆ‚ÍMD5‚È‚Ç‚Å‚¿‚á‚ñ‚Æ‚â‚Á‚½•û‚ª‚¢‚¢‚Ì‚¾‚¯‚ê‚ÇB +- Õ“ËŽž‚É•\Ž¦‚³‚ê‚郃bƒZ[ƒW‚È‚Ç‚Íu‹Éˆ«v‚³‚ñ‚̃y[ƒW‚ðŽQl‚É‚µ‚½B + +*2001-10-17 +- Version 1.6.5B +- ƒvƒŒƒrƒ…[‰æ–Ê‚ÅAXVƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚½‚Æ‚«‚É‘—M‚³‚ê‚é +ƒƒbƒZ[ƒW‚Ì“à—e‚ðinput—v‘f‚Ìtype="hidden"‚ðŽg‚Á‚Ä–„‚ßž‚Þ‚Ì‚ð‚â‚ß‚éB +‘ã‚í‚è‚ÉAtextarea—v‘f‚ðŽg‚¤B +- ăvƒŒƒrƒ…[—p‚Émyspecial_‚𓱓üB‚Å‚à‚«‚ê‚¢‚È‘Îô‚Å‚Í‚È‚¢B + +*2001-08-30 +- Version 1.6.4B +- URL‚Ń_ƒCƒŒƒNƒg‚Ƀy[ƒW–¼‚ðŽw’肵‚Ä‚àA +$WikiName‚Æ$BracketNameˆÈŠO‚̃y[ƒW‚ðì‚ê‚È‚¢‚悤‚É‚µ‚½B +(is_valid_name‚Æis_editableŽQÆ)B + +*2001-08-30 +- Version 1.6.3B +- RecentChanges‚ð•ÒWEÄ•ÒW•s‰Â‚Æ‚µ‚½B +- •ÒW•s‰Âƒy[ƒW‚Í@uneditable‚Ƀy[ƒW–¼‚ð“ü‚ê‚éB + +*2001-02-25 +- Version 1.6.1, 1.6.2B +- ·•ª‹@”\‚̃oƒOC³B +- do_preview‚Å'>'‚ªˆµ‚¦‚È‚¢ƒoƒO‚ðC³iƒ†[ƒU‚©‚ç‚ÌŽw“EjB + +*2001-02-22 +- Version 1.6.0B +- ·•ª‹@”\‚ðŽÀ‘•‚µ‚½B + +*2001-02-19 +- Version 1.5.4B +- ‰æ‘œƒtƒ@ƒCƒ‹‚ւ̃Šƒ“ƒN‚͉摜‚É‚µ‚Ä‚Ý‚½B + +*2001-02-19 +- Version 1.5.3B +- RecentChanges‚Ì’†‚É휂µ‚½ƒy[ƒW‚ª‚ ‚é‚Ì‚ð‚â‚ß‚½B +- use strict;‚ňø‚Á‚©‚©‚é•”•ª‚ð‚µ®—(Š®‘S‚Å‚Í‚È‚¢)B + +*2001-02-16 +- Version 1.5.2B +- textarea‚É•\Ž¦‚¨‚æ‚уvƒŒƒrƒ…[‚·‚é‘O‚É < ‚â > ‚ð < ‚â > ‚É•ÏŠ·‚µ‚½ +(do_preview, editpage, print_preview_buttons)B + +*2000-12-27 +- Version 1.5.1B +- ƒvƒŒƒrƒ…[‰æ–Ê‚ð®—‚µ‚½B + +*2000-12-22 +- Version 1.5.0B +- ‘S‘Ì“I‚É‚¸‚¢‚Ô‚ñ‘‚«’¼‚µ‚½B +- ˆê——‚ð•Ê“r쬂·‚é‚悤‚É‚µ‚½(do_list)B +- ‘‚«ž‚Þ‘O‚ÉŠm”F‰æ–Ê‚ðo‚·‚悤‚É‚µ‚½(do_preview)B +- ƒeƒLƒXƒg‚Ì‘‚«•û‚ð•ÒW‰æ–Ê‚É“ü‚ꂽ(do_edit, do_reedit)B +- WhatsNew¨RecentChangesATopPage¨FrontPage‚É•ÏX‚µ‚½B + +*2000-12-20 +- Version 1.1.0B +- tie‚ð—˜—p‚µ‚ÄAdbmopen‚ªŽg‚¦‚È‚¢ê‡‚Å‚à“®ì‚·‚é‚悤‚ÉC³B +- —˜—pŽÒ‚Ì1l‚Å‚ ‚éu‹Éˆ«v‚³‚ñ‚©‚ç‘—‚Á‚Ä‚¢‚½‚¾‚¢‚½ƒR[ƒh‚ðŒ³‚É‚µ‚Ä‚¢‚Ü‚·B + +*2000-09-05 +- Version 1.0.2B +- <body color=...> ¨ <body bgcolor=...> +- —˜—pŽÒ‚©‚ç‚ÌŽw“E‚É‚æ‚éBŠ´ŽÓB + +*2000-08-06 +- Version 1.0.1‚ðŒöŠJB +- C MAGAZINEiƒ\ƒtƒgƒoƒ“ƒNƒpƒuƒŠƒbƒVƒ“ƒOj2000”N10ŒŽ†˜AÚ‹LŽ–Œü‚¯ŒöŠJ”ÅB +- [[ ]] ‚ÌŌオu–]v‚̂悤‚ɃVƒtƒgJIS‚Å +- 0x5D‚É‚È‚éꇂ̉ñ”ð‚ðs‚È‚Á‚½B + +*2000-08-05 +- Version 1.0.0‚ðŒöŠJB + +*2000-07-23 +- Version 0.82‚ðŒöŠJB +- •ÒWŽž‚̃Šƒ“ƒNƒ~ƒXB +- <textarea>‚Ì‘®«•ÏXB + +*2000-07-22 +- Version 0.81‚ðŒöŠJB +- ƒƒS‚ð‘g‚Ýž‚ÞB + +*2000-07-21 +- Version 0.80‚ðŒöŠJB +- POD‚ðCGI’†‚É‘‚«ž‚ÞB + +*2000-07-19 +- Version 0.70‚ðŒöŠJB +- '''ƒCƒ^ƒŠƒbƒN'''‚âA--A---A>>A>>>‚È‚Ç‚ðŽÀ‘•B + +*2000-07-18 +- Version 0.60‚ðŒöŠJB +- *‘¾Žš*‚ð''‘¾Žš''‚É•ÏX + +*2000-07-17 +- Version 0.50‚ðŒöŠJB + +*2000-07-17 +- ‚³‚ç‚É‚¢‚ë‚¢‚ë’ljÁ‚·‚éB + +*2000-07-16 +- ‚¢‚ë‚¢‚ë’ljÁB + +*2000-07-15 +- ŒöŠJB
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jcode.pl Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,780 @@ +package jcode; +;###################################################################### +;# +;# jcode.pl: Perl library for Japanese character code conversion +;# +;# Copyright (c) 1995-1999 Kazumasa Utashiro <utashiro@iij.ad.jp> +;# Internet Initiative Japan Inc. +;# 3-13 Kanda Nishiki-cho, Chiyoda-ku, Tokyo 101-0054, Japan +;# +;# Copyright (c) 1992,1993,1994 Kazumasa Utashiro +;# Software Research Associates, Inc. +;# +;# Use and redistribution for ANY PURPOSE are granted as long as all +;# copyright notices are retained. Redistribution with modification +;# is allowed provided that you make your modified version obviously +;# distinguishable from the original one. THIS SOFTWARE IS PROVIDED +;# BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES ARE +;# DISCLAIMED. +;# +;# Original version was developed under the name of srekcah@sra.co.jp +;# February 1992 and it was called kconv.pl at the beginning. This +;# address was a pen name for group of individuals and it is no longer +;# valid. +;# +;# The latest version is available here: +;# +;# ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/ +;# +;; $rcsid = q$Id: jcode.pl,v 2.11 1999/12/26 17:16:47 utashiro Exp $; +;# +;###################################################################### +;# +;# PERL4 INTERFACE: +;# +;# &jcode'getcode(*line) +;# Return 'jis', 'sjis', 'euc' or undef according to +;# Japanese character code in $line. Return 'binary' if +;# the data has non-character code. +;# +;# When evaluated in array context, it returns a list +;# contains two items. First value is the number of +;# characters which matched to the expected code, and +;# second value is the code name. It is useful if and +;# only if the number is not 0 and the code is undef; +;# that case means it couldn't tell 'euc' or 'sjis' +;# because the evaluation score was exactly same. This +;# interface is too tricky, though. +;# +;# Code detection between euc and sjis is very difficult +;# or sometimes impossible or even lead to wrong result +;# when it includes JIS X0201 KANA characters. So JIS +;# X0201 KANA is ignored for automatic code detection. +;# +;# &jcode'convert(*line, $ocode [, $icode [, $option]]) +;# Convert the contents of $line to the specified +;# Japanese code given in the second argument $ocode. +;# $ocode can be any of "jis", "sjis" or "euc", or use +;# "noconv" when you don't want the code conversion. +;# Input code is recognized automatically from the line +;# itself when $icode is not supplied (JIS X0201 KANA is +;# ignored in code detection. See the above descripton +;# of &getcode). $icode also can be specified, but +;# xxx2yyy routine is more efficient when both codes are +;# known. +;# +;# It returns the code of input string in scalar context, +;# and a list of pointer of convert subroutine and the +;# input code in array context. +;# +;# Japanese character code JIS X0201, X0208, X0212 and +;# ASCII code are supported. X0212 characters can not be +;# represented in SJIS and they will be replased by +;# "geta" character when converted to SJIS. +;# +;# See next paragraph for $option parameter. +;# +;# &jcode'xxx2yyy(*line [, $option]) +;# Convert the Japanese code from xxx to yyy. String xxx +;# and yyy are any convination from "jis", "euc" or +;# "sjis". They return *approximate* number of converted +;# bytes. So return value 0 means the line was not +;# converted at all. +;# +;# Optional parameter $option is used to specify optional +;# conversion method. String "z" is for JIS X0201 KANA +;# to X0208 KANA, and "h" is for reverse. +;# +;# $jcode'convf{'xxx', 'yyy'} +;# The value of this associative array is pointer to the +;# subroutine jcode'xxx2yyy(). +;# +;# &jcode'to($ocode, $line [, $icode [, $option]]) +;# &jcode'jis($line [, $icode [, $option]]) +;# &jcode'euc($line [, $icode [, $option]]) +;# &jcode'sjis($line [, $icode [, $option]]) +;# These functions are prepared for easy use of +;# call/return-by-value interface. You can use these +;# funcitons in s///e operation or any other place for +;# convenience. +;# +;# &jcode'jis_inout($in, $out) +;# Set or inquire JIS start and end sequences. Default +;# is "ESC-$-B" and "ESC-(-B". If you supplied only one +;# character, "ESC-$" or "ESC-(" is prepended for each +;# character respectively. Acutually "ESC-(-B" is not a +;# sequence to end JIS code but a sequence to start ASCII +;# code set. So `in' and `out' are somewhat misleading. +;# +;# &jcode'get_inout($string) +;# Get JIS start and end sequences from $string. +;# +;# &jcode'cache() +;# &jcode'nocache() +;# &jcode'flush() +;# Usually, converted character is cached in memory to +;# avoid same calculations have to be done many times. +;# To disable this caching, call &jcode'nocache(). It +;# can be revived by &jcode'cache() and cache is flushed +;# by calling &jcode'flush(). &cache() and &nocache() +;# functions return previous caching state. +;# +;# --------------------------------------------------------------- +;# +;# &jcode'h2z_xxx(*line) +;# JIS X0201 KANA (so-called Hankaku-KANA) to X0208 KANA +;# (Zenkaku-KANA) code conversion routine. String xxx is +;# any of "jis", "sjis" and "euc". From the difficulty +;# of recognizing code set from 1-byte KATAKANA string, +;# automatic code recognition is not supported. +;# +;# &jcode'z2h_xxx(*line) +;# X0208 to X0201 KANA code conversion routine. String +;# xxx is any of "jis", "sjis" and "euc". +;# +;# $jcode'z2hf{'xxx'} +;# $jcode'h2zf{'xxx'} +;# These are pointer to the corresponding function just +;# as $jcode'convf. +;# +;# --------------------------------------------------------------- +;# +;# &jcode'tr(*line, $from, $to [, $option]) +;# &jcode'tr emulates tr operator for 2 byte code. Only 'd' +;# is interpreted as an option. +;# +;# Range operator like `A-Z' for 2 byte code is partially +;# supported. Code must be JIS or EUC, and first byte +;# have to be same on first and last character. +;# +;# CAUTION: Handling range operator is a kind of trick +;# and it is not perfect. So if you need to transfer `-' +;# character, please be sure to put it at the beginning +;# or the end of $from and $to strings. +;# +;# &jcode'trans($line, $from, $to [, $option) +;# Same as &jcode'tr but accept string and return string +;# after translation. +;# +;# --------------------------------------------------------------- +;# +;# &jcode'init() +;# Initialize the variables used in this package. You +;# don't have to call this when using jocde.pl by `do' or +;# `require' interface. Call it first if you embedded +;# the jcode.pl at the end of your script. +;# +;###################################################################### +;# +;# PERL5 INTERFACE: +;# +;# Current jcode.pl is written in Perl 4 but it is possible to use +;# from Perl 5 using `references'. Fully perl5 capable version is +;# future issue. +;# +;# Since lexical variable is not a subject of typeglob, *string style +;# call doesn't work if the variable is declared as `my'. Same thing +;# happens to special variable $_ if the perl is compiled to use +;# thread capability. So using reference is generally recommented to +;# avoid the mysterious error. +;# +;# jcode::getcode(\$line) +;# jcode::convert(\$line, $ocode [, $icode [, $option]]) +;# jcode::xxx2yyy(\$line [, $option]) +;# &{$jcode::convf{'xxx', 'yyy'}}(\$line) +;# jcode::to($ocode, $line [, $icode [, $option]]) +;# jcode::jis($line [, $icode [, $option]]) +;# jcode::euc($line [, $icode [, $option]]) +;# jcode::sjis($line [, $icode [, $option]]) +;# jcode::jis_inout($in, $out) +;# jcode::get_inout($string) +;# jcode::cache() +;# jcode::nocache() +;# jcode::flush() +;# jcode::h2z_xxx(\$line) +;# jcode::z2h_xxx(\$line) +;# &{$jcode::z2hf{'xxx'}}(\$line) +;# &{$jcode::h2zf{'xxx'}}(\$line) +;# jcode::tr(\$line, $from, $to [, $option]) +;# jcode::trans($line, $from, $to [, $option) +;# jcode::init() +;# +;###################################################################### +;# +;# SAMPLES +;# +;# Convert any Kanji code to JIS and print each line with code name. +;# +;# while (defined($s = <>)) { +;# $code = &jcode'convert(*s, 'jis'); +;# print $code, "\t", $s; +;# } +;# +;# Convert all lines to JIS according to the first recognized line. +;# +;# while (defined($s = <>)) { +;# print, next unless $s =~ /[\033\200-\377]/; +;# (*f, $icode) = &jcode'convert(*s, 'jis'); +;# print; +;# defined(&f) || next; +;# while (<>) { &f(*s); print; } +;# last; +;# } +;# +;# The safest way of JIS conversion. +;# +;# while (defined($s = <>)) { +;# ($matched, $icode) = &jcode'getcode(*s); +;# if (@buf == 0 && $matched == 0) { +;# print $s; +;# next; +;# } +;# push(@buf, $s); +;# next unless $icode; +;# while (defined($s = shift(@buf))) { +;# &jcode'convert(*s, 'jis', $icode); +;# print $s; +;# } +;# while (defined($s = <>)) { +;# &jcode'convert(*s, 'jis', $icode); +;# print $s; +;# } +;# last; +;# } +;# print @buf if @buf; +;# +;###################################################################### + +;# +;# Call initialize function if it is not called yet. This may sound +;# strange but it makes easy to embed the jcode.pl at the end of +;# script. Call &jcode'init at the beginning of the script in that +;# case. +;# +&init unless defined $version; + +;# +;# Initialize variables. +;# +sub init { + $version = $rcsid =~ /,v ([\d.]+)/ ? $1 : 'unkown'; + + $re_bin = '[\000-\006\177\377]'; + + $re_jis0208_1978 = '\e\$\@'; + $re_jis0208_1983 = '\e\$B'; + $re_jis0208_1990 = '\e&\@\e\$B'; + $re_jis0208 = "$re_jis0208_1978|$re_jis0208_1983|$re_jis0208_1990"; + $re_jis0212 = '\e\$\(D'; + $re_jp = "$re_jis0208|$re_jis0212"; + $re_asc = '\e\([BJ]'; + $re_kana = '\e\(I'; + + $esc_0208 = "\e\$B"; + $esc_0212 = "\e\$(D"; + $esc_asc = "\e(B"; + $esc_kana = "\e(I"; + + $re_sjis_c = '[\201-\237\340-\374][\100-\176\200-\374]'; + $re_sjis_kana = '[\241-\337]'; + + $re_euc_c = '[\241-\376][\241-\376]'; + $re_euc_kana = '\216[\241-\337]'; + $re_euc_0212 = '\217[\241-\376][\241-\376]'; + + # Use `geta' for undefined character code + $undef_sjis = "\x81\xac"; + + $cache = 1; + + # X0201 -> X0208 KANA conversion table. Looks weird? Not that + # much. This is simply JIS text without escape sequences. + ($h2z_high = $h2z = <<'__TABLE_END__') =~ tr/\041-\176/\241-\376/; +! !# $ !" % !& " !V # !W +^ !+ _ !, 0 !< +' %! ( %# ) %% * %' + %) +, %c - %e . %g / %C +1 %" 2 %$ 3 %& 4 %( 5 %* +6 %+ 7 %- 8 %/ 9 %1 : %3 +6^ %, 7^ %. 8^ %0 9^ %2 :^ %4 +; %5 < %7 = %9 > %; ? %= +;^ %6 <^ %8 =^ %: >^ %< ?^ %> +@ %? A %A B %D C %F D %H +@^ %@ A^ %B B^ %E C^ %G D^ %I +E %J F %K G %L H %M I %N +J %O K %R L %U M %X N %[ +J^ %P K^ %S L^ %V M^ %Y N^ %\ +J_ %Q K_ %T L_ %W M_ %Z N_ %] +O %^ P %_ Q %` R %a S %b +T %d U %f V %h +W %i X %j Y %k Z %l [ %m +\ %o ] %s & %r 3^ %t +__TABLE_END__ + %h2z = split(/\s+/, $h2z . $h2z_high); + %z2h = reverse %h2z; + + $convf{'jis' , 'jis' } = *jis2jis; + $convf{'jis' , 'sjis'} = *jis2sjis; + $convf{'jis' , 'euc' } = *jis2euc; + $convf{'euc' , 'jis' } = *euc2jis; + $convf{'euc' , 'sjis'} = *euc2sjis; + $convf{'euc' , 'euc' } = *euc2euc; + $convf{'sjis' , 'jis' } = *sjis2jis; + $convf{'sjis' , 'sjis'} = *sjis2sjis; + $convf{'sjis' , 'euc' } = *sjis2euc; + $h2zf{'jis' } = *h2z_jis; + $z2hf{'jis' } = *z2h_jis; + $h2zf{'euc' } = *h2z_euc; + $z2hf{'euc' } = *z2h_euc; + $h2zf{'sjis'} = *h2z_sjis; + $z2hf{'sjis'} = *z2h_sjis; +} + +;# +;# Set escape sequences which should be put before and after Japanese +;# (JIS X0208) string. +;# +sub jis_inout { + $esc_0208 = shift || $esc_0208; + $esc_0208 = "\e\$$esc_0208" if length($esc_0208) == 1; + $esc_asc = shift || $esc_asc; + $esc_asc = "\e\($esc_asc" if length($esc_asc) == 1; + ($esc_0208, $esc_asc); +} + +;# +;# Get JIS in and out sequences from the string. +;# +sub get_inout { + local($esc_0208, $esc_asc); + $_[$[] =~ /($re_jis0208)/o && ($esc_0208 = $1); + $_[$[] =~ /($re_asc)/o && ($esc_asc = $1); + ($esc_0208, $esc_asc); +} + +;# +;# Recognize character code. +;# +sub getcode { + local(*s) = @_; + local($matched, $code); + + if ($s !~ /[\e\200-\377]/) { # not Japanese + $matched = 0; + $code = undef; + } # 'jis' + elsif ($s =~ /$re_jp|$re_asc|$re_kana/o) { + $matched = 1; + $code = 'jis'; + } + elsif ($s =~ /$re_bin/o) { # 'binary' + $matched = 0; + $code = 'binary'; + } + else { # should be 'euc' or 'sjis' + local($sjis, $euc) = (0, 0); + + while ($s =~ /(($re_sjis_c)+)/go) { + $sjis += length($1); + } + while ($s =~ /(($re_euc_c|$re_euc_kana|$re_euc_0212)+)/go) { + $euc += length($1); + } + $matched = &max($sjis, $euc); + $code = ('euc', undef, 'sjis')[($sjis<=>$euc) + $[ + 1]; + } + wantarray ? ($matched, $code) : $code; +} +sub max { $_[ $[ + ($_[ $[ ] < $_[ $[ + 1 ]) ]; } + +;# +;# Convert any code to specified code. +;# +sub convert { + local(*s, $ocode, $icode, $opt) = @_; + return (undef, undef) unless $icode = $icode || &getcode(*s); + return (undef, $icode) if $icode eq 'binary'; + $ocode = 'jis' unless $ocode; + $ocode = $icode if $ocode eq 'noconv'; + local(*f) = $convf{$icode, $ocode}; + &f(*s, $opt); + wantarray ? (*f, $icode) : $icode; +} + +;# +;# Easy return-by-value interfaces. +;# +sub jis { &to('jis', @_); } +sub euc { &to('euc', @_); } +sub sjis { &to('sjis', @_); } +sub to { + local($ocode, $s, $icode, $opt) = @_; + &convert(*s, $ocode, $icode, $opt); + $s; +} +sub what { + local($s) = @_; + &getcode(*s); +} +sub trans { + local($s) = shift; + &tr(*s, @_); + $s; +} + +;# +;# SJIS to JIS +;# +sub sjis2jis { + local(*s, $opt, $n) = @_; + &sjis2sjis(*s, $opt) if $opt; + $s =~ s/(($re_sjis_c|$re_sjis_kana)+)/&_sjis2jis($1) . $esc_asc/geo; + $n; +} +sub _sjis2jis { + local($s) = shift; + $s =~ s/(($re_sjis_c)+|($re_sjis_kana)+)/&__sjis2jis($1)/geo; + $s; +} +sub __sjis2jis { + local($s) = shift; + if ($s =~ /^$re_sjis_kana/o) { + $n += $s =~ tr/\241-\337/\041-\137/; + $esc_kana . $s; + } else { + $n += $s =~ s/($re_sjis_c)/$s2e{$1}||&s2e($1)/geo; + $s =~ tr/\241-\376/\041-\176/; + $esc_0208 . $s; + } +} + +;# +;# EUC to JIS +;# +sub euc2jis { + local(*s, $opt, $n) = @_; + &euc2euc(*s, $opt) if $opt; + $s =~ s/(($re_euc_c|$re_euc_kana|$re_euc_0212)+)/ + &_euc2jis($1) . $esc_asc + /geo; + $n; +} +sub _euc2jis { + local($s) = shift; + $s =~ s/(($re_euc_c)+|($re_euc_kana)+|($re_euc_0212)+)/&__euc2jis($1)/geo; + $s; +} +sub __euc2jis { + local($s) = shift; + local($esc); + + if ($s =~ tr/\216//d) { + $esc = $esc_kana; + } elsif ($s =~ tr/\217//d) { + $esc = $esc_0212; + } else { + $esc = $esc_0208; + } + + $n += $s =~ tr/\241-\376/\041-\176/; + $esc . $s; +} + +;# +;# JIS to EUC +;# +sub jis2euc { + local(*s, $opt, $n) = @_; + $s =~ s/($re_jp|$re_asc|$re_kana)([^\e]*)/&_jis2euc($1,$2)/geo; + &euc2euc(*s, $opt) if $opt; + $n; +} +sub _jis2euc { + local($esc, $s) = @_; + if ($esc !~ /^$re_asc/o) { + $n += $s =~ tr/\041-\176/\241-\376/; + if ($esc =~ /^$re_kana/o) { + $s =~ s/([\241-\337])/\216$1/g; + } + elsif ($esc =~ /^$re_jis0212/o) { + $s =~ s/([\241-\376][\241-\376])/\217$1/g; + } + } + $s; +} + +;# +;# JIS to SJIS +;# +sub jis2sjis { + local(*s, $opt, $n) = @_; + &jis2jis(*s, $opt) if $opt; + $s =~ s/($re_jp|$re_asc|$re_kana)([^\e]*)/&_jis2sjis($1,$2)/geo; + $n; +} +sub _jis2sjis { + local($esc, $s) = @_; + if ($esc =~ /^$re_jis0212/o) { + $s =~ s/../$undef_sjis/g; + $n = length; + } + elsif ($esc !~ /^$re_asc/o) { + $n += $s =~ tr/\041-\176/\241-\376/; + if ($esc =~ /^$re_jp/o) { + $s =~ s/($re_euc_c)/$e2s{$1}||&e2s($1)/geo; + } + } + $s; +} + +;# +;# SJIS to EUC +;# +sub sjis2euc { + local(*s, $opt,$n) = @_; + $n = $s =~ s/($re_sjis_c|$re_sjis_kana)/$s2e{$1}||&s2e($1)/geo; + &euc2euc(*s, $opt) if $opt; + $n; +} +sub s2e { + local($c1, $c2, $code); + ($c1, $c2) = unpack('CC', $code = shift); + + if (0xa1 <= $c1 && $c1 <= 0xdf) { + $c2 = $c1; + $c1 = 0x8e; + } elsif (0x9f <= $c2) { + $c1 = $c1 * 2 - ($c1 >= 0xe0 ? 0xe0 : 0x60); + $c2 += 2; + } else { + $c1 = $c1 * 2 - ($c1 >= 0xe0 ? 0xe1 : 0x61); + $c2 += 0x60 + ($c2 < 0x7f); + } + if ($cache) { + $s2e{$code} = pack('CC', $c1, $c2); + } else { + pack('CC', $c1, $c2); + } +} + +;# +;# EUC to SJIS +;# +sub euc2sjis { + local(*s, $opt,$n) = @_; + &euc2euc(*s, $opt) if $opt; + $n = $s =~ s/($re_euc_c|$re_euc_kana|$re_euc_0212)/$e2s{$1}||&e2s($1)/geo; +} +sub e2s { + local($c1, $c2, $code); + ($c1, $c2) = unpack('CC', $code = shift); + + if ($c1 == 0x8e) { # SS2 + return substr($code, 1, 1); + } elsif ($c1 == 0x8f) { # SS3 + return $undef_sjis; + } elsif ($c1 % 2) { + $c1 = ($c1>>1) + ($c1 < 0xdf ? 0x31 : 0x71); + $c2 -= 0x60 + ($c2 < 0xe0); + } else { + $c1 = ($c1>>1) + ($c1 < 0xdf ? 0x30 : 0x70); + $c2 -= 2; + } + if ($cache) { + $e2s{$code} = pack('CC', $c1, $c2); + } else { + pack('CC', $c1, $c2); + } +} + +;# +;# JIS to JIS, SJIS to SJIS, EUC to EUC +;# +sub jis2jis { + local(*s, $opt) = @_; + $s =~ s/$re_jis0208/$esc_0208/go; + $s =~ s/$re_asc/$esc_asc/go; + &h2z_jis(*s) if $opt =~ /z/; + &z2h_jis(*s) if $opt =~ /h/; +} +sub sjis2sjis { + local(*s, $opt) = @_; + &h2z_sjis(*s) if $opt =~ /z/; + &z2h_sjis(*s) if $opt =~ /h/; +} +sub euc2euc { + local(*s, $opt) = @_; + &h2z_euc(*s) if $opt =~ /z/; + &z2h_euc(*s) if $opt =~ /h/; +} + +;# +;# Cache control functions +;# +sub cache { + ($cache, $cache = 1)[$[]; +} +sub nocache { + ($cache, $cache = 0)[$[]; +} +sub flushcache { + undef %e2s; + undef %s2e; +} + +;# +;# X0201 -> X0208 KANA conversion routine +;# +sub h2z_jis { + local(*s, $n) = @_; + if ($s =~ s/$re_kana([^\e]*)/$esc_0208 . &_h2z_jis($1)/geo) { + 1 while $s =~ s/(($re_jis0208)[^\e]*)($re_jis0208)/$1/o; + } + $n; +} +sub _h2z_jis { + local($s) = @_; + $n += $s =~ s/([\41-\137]([\136\137])?)/$h2z{$1}/g; + $s; +} + +sub h2z_euc { + local(*s) = @_; + $s =~ s/\216([\241-\337])(\216([\336\337]))?/$h2z{"$1$3"}/g; +} + +sub h2z_sjis { + local(*s, $n) = @_; + $s =~ s/(($re_sjis_c)+)|(([\241-\337])([\336\337])?)/ + $1 || ($n++, $e2s{$h2z{$3}} || &e2s($h2z{$3})) + /geo; + $n; +} + +;# +;# X0208 -> X0201 KANA conversion routine +;# +sub z2h_jis { + local(*s, $n) = @_; + $s =~ s/($re_jis0208)([^\e]+)/&_z2h_jis($2)/geo; + $n; +} +sub _z2h_jis { + local($s) = @_; + $s =~ s/((\%[!-~]|![\#\"&VW+,<])+|([^!%][!-~]|![^\#\"&VW+,<])+)/ + &__z2h_jis($1) + /ge; + $s; +} +sub __z2h_jis { + local($s) = @_; + return $esc_0208 . $s unless /^%/ || $s =~ /^![\#\"&VW+,<]/; + $n += length($s) / 2; + $s =~ s/(..)/$z2h{$1}/g; + $esc_kana . $s; +} + +sub z2h_euc { + local(*s, $n) = @_; + &init_z2h_euc unless defined %z2h_euc; + $s =~ s/($re_euc_c|$re_euc_kana)/ + $z2h_euc{$1} ? ($n++, $z2h_euc{$1}) : $1 + /geo; + $n; +} + +sub z2h_sjis { + local(*s, $n) = @_; + &init_z2h_sjis unless defined %z2h_sjis; + $s =~ s/($re_sjis_c)/$z2h_sjis{$1} ? ($n++, $z2h_sjis{$1}) : $1/geo; + $n; +} + +;# +;# Initializing JIS X0208 to X0201 KANA table for EUC and SJIS. This +;# can be done in &init but it's not worth doing. Similarly, +;# precalculated table is not worth to occupy the file space and +;# reduce the readability. The author personnaly discourages to use +;# X0201 Kana character in the any situation. +;# +sub init_z2h_euc { + local($k, $s); + while (($k, $s) = each %z2h) { + $s =~ s/([\241-\337])/\216$1/g && ($z2h_euc{$k} = $s); + } +} +sub init_z2h_sjis { + local($s, $v); + while (($s, $v) = each %z2h) { + $s =~ /[\200-\377]/ && ($z2h_sjis{&e2s($s)} = $v); + } +} + +;# +;# TR function for 2-byte code +;# +sub tr { + # $prev_from, $prev_to, %table are persistent variables + local(*s, $from, $to, $opt) = @_; + local(@from, @to); + local($jis, $n) = (0, 0); + + $jis++, &jis2euc(*s) if $s =~ /$re_jp|$re_asc|$re_kana/o; + $jis++ if $to =~ /$re_jp|$re_asc|$re_kana/o; + + if (!defined($prev_from) || $from ne $prev_from || $to ne $prev_to) { + ($prev_from, $prev_to) = ($from, $to); + undef %table; + &_maketable; + } + + $s =~ s/([\200-\377][\000-\377]|[\000-\377])/ + defined($table{$1}) && ++$n ? $table{$1} : $1 + /ge; + + &euc2jis(*s) if $jis; + + $n; +} + +sub _maketable { + local($ascii) = '(\\\\[\\-\\\\]|[\0-\133\135-\177])'; + + &jis2euc(*to) if $to =~ /$re_jp|$re_asc|$re_kana/o; + &jis2euc(*from) if $from =~ /$re_jp|$re_asc|$re_kana/o; + + grep(s/(([\200-\377])[\200-\377]-\2[\200-\377])/&_expnd2($1)/ge, + $from, $to); + grep(s/($ascii-$ascii)/&_expnd1($1)/geo, + $from, $to); + + @to = $to =~ /[\200-\377][\000-\377]|[\000-\377]/g; + @from = $from =~ /[\200-\377][\000-\377]|[\000-\377]/g; + push(@to, ($opt =~ /d/ ? '' : $to[$#to]) x (@from - @to)) if @to < @from; + @table{@from} = @to; +} + +sub _expnd1 { + local($s) = @_; + $s =~ s/\\(.)/$1/g; + local($c1, $c2) = unpack('CxC', $s); + if ($c1 <= $c2) { + for ($s = ''; $c1 <= $c2; $c1++) { + $s .= pack('C', $c1); + } + } + $s; +} + +sub _expnd2 { + local($s) = @_; + local($c1, $c2, $c3, $c4) = unpack('CCxCC', $s); + if ($c1 == $c3 && $c2 <= $c4) { + for ($s = ''; $c2 <= $c4; $c2++) { + $s .= pack('CC', $c1, $c2); + } + } + $s; +} + +1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugin.txt Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,60 @@ +YukiWikiƒvƒ‰ƒOƒCƒ“ + +------------------------------------------------- +¡‚Í‚¶‚ß‚É +------------------------------------------------- + +‚±‚Ì•¶‘‚ÍYukiWiki‚̃vƒ‰ƒOƒCƒ“‚ÉŠÖ‚·‚éî•ñ‚ð‚Ü‚Æ‚ß‚½‚à‚Ì‚Å‚·B + +------------------------------------------------- +¡ƒvƒ‰ƒOƒCƒ“‚Æ‚Í +------------------------------------------------- + +ƒvƒ‰ƒOƒCƒ“‚ÍAYukiWiki–{‘Ì‚ÉŽè‚ð“ü‚ê‚邱‚Æ‚È‚‹@”\Šg’£‚·‚邽‚ß‚Ì‹@\‚Å‚·B +ƒvƒ‰ƒOƒCƒ“‚Ì쬂ɂÍPerl‚Ì’mŽ¯‚ª•K—v‚Å‚·B + +YukiWiki‚̃vƒ‰ƒOƒCƒ“‹@”\‚ðŽÀŒ»‚µ‚Ä‚¢‚é‚Ì‚Í +Yuki::PluginManagerƒ‚ƒWƒ…[ƒ‹‚Å‚·B +YukiWiki–{‘Ì(wiki.cgi)‹N“®Žž‚ÉYuki::PluginManagerƒ‚ƒWƒ…[ƒ‹‚ª‰Šú‰»‚³‚êA +‚»‚̃^ƒCƒ~ƒ“ƒO‚ŃCƒ“ƒXƒg[ƒ‹Ï‚݂̃vƒ‰ƒOƒCƒ“‚ªƒ[ƒh‚³‚êA +—˜—p‰Â”\‚É‚È‚è‚Ü‚·B + +ŠÇ—ŽÒˆÈŠO‚ÌYukiWiki—˜—pŽÒ‚ªƒvƒ‰ƒOƒCƒ“‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñB + +------------------------------------------------- +¡ƒvƒ‰ƒOƒCƒ“‚ÌŽí•Ê +------------------------------------------------- + +ƒvƒ‰ƒOƒCƒ“‚ɂ͈ȉº‚ÌŽOŽí—Þ‚ª‚ ‚è‚Ü‚·B + +EƒCƒ“ƒ‰ƒCƒ“ƒ^ƒCƒv + &bold(‚±‚±‚𑾎š) ‚̂悤‚ÉWikiƒy[ƒW“à‚É‹Lq‚µ‚Ü‚·B + HTML‚̃Cƒ“ƒ‰ƒCƒ“—v‘f‚ɑΉž‚µ‚Ü‚·B +EƒuƒƒbƒNƒ^ƒCƒv + #recent() ‚̂悤‚ÉWikiƒy[ƒW“à‚É‹Lq‚µ‚Ü‚·B + HTML‚̃uƒƒbƒN—v‘f‚ɑΉž‚µ‚Ü‚·B +EƒtƒBƒ‹ƒ^ƒ^ƒCƒv + Wiki‚̃y[ƒW“à•”‚É‹Lq‚·‚é‚Ì‚Å‚Í‚È‚A + ƒRƒ“ƒeƒ“ƒc‘S‘Ì‚ð•ÏŠ·‚·‚é‚Æ‚«‚ÉŽg‚¢‚Ü‚·B + +------------------------------------------------- +¡ƒvƒ‰ƒOƒCƒ“‚̃tƒ@ƒCƒ‹ +------------------------------------------------- + +ƒvƒ‰ƒOƒCƒ“‚̃tƒ@ƒCƒ‹‚ÍA + + ƒvƒ‰ƒOƒCƒ“–¼.pl + +‚Æ‚¢‚¤–¼‘O‚É‚µ‚Ü‚·B“Á‚ɃtƒBƒ‹ƒ^ƒ^ƒCƒv‚̃vƒ‰ƒOƒCƒ“‚ÌꇂɂÍA + + filter_ƒvƒ‰ƒOƒCƒ“–¼.pl + +‚Æ‚¢‚¤–¼‘O‚É‚µ‚Ü‚·B +ƒvƒ‰ƒOƒCƒ“‚̃tƒ@ƒCƒ‹‚ÍPerl‚Å‹Lq‚µA +wiki.cgi‚Ì$modifier_dir_plugin‚ÅŽw’肵‚½ƒfƒBƒŒƒNƒgƒŠ‚É’u‚«‚Ü‚·B + +------------------------------------------------- +¡ƒvƒ‰ƒOƒCƒ“‚̃vƒƒOƒ‰ƒ~ƒ“ƒO +------------------------------------------------- + +YukiWiki‚É“¯«‚³‚ê‚Ä‚¢‚éƒvƒ‰ƒOƒCƒ“‚ðŽQl‚É‚µ‚Ä‚‚¾‚³‚¢B
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugin/link.pl Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,26 @@ +use strict; + +package link; + +sub plugin_inline { + my ($escaped_argument) = @_; + my ($caption, $url) = split(/,/, $escaped_argument); + if ($url =~ /^(mailto|http|https|ftp):/) { + return qq(<a href="$url">$caption</a>); + } else { + return qq(&link($escaped_argument)); + } +} + +sub plugin_usage { + return { + name => 'link', + version => '1.1', + author => 'Hiroshi Yuki <hyuki@hyuki.com>', + syntax => '&link(caption,url)', + description => 'Create link with given caption..', + example => "Please visit &link(Hiroshi Yuki,http://www.hyuki.com/).", + }; +} + +1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugin/recent.pl Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,26 @@ +use strict; + +package recent; + +sub plugin_block { + my ($escaped_argument, $context) = @_; + my ($count) = split(/,/, $escaped_argument); + my @raw_recent_changes = split(/\n/, $context->{database}->{RecentChanges}); + my @recent_changes = splice(@raw_recent_changes, 0, $count); + my $recent_changes = join("\n", @recent_changes); + my $result = &main::text_to_html($recent_changes, toc=>0); + return $result; +} + +sub plugin_usage { + return { + name => 'recent', + version => '1.0', + author => 'Hiroshi Yuki <hyuki@hyuki.com>', + syntax => '#recent(count)', + description => 'Show recent changes.', + example => '#recent(10)', + }; +} + +1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugin/ruby.pl Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,22 @@ +use strict; + +package ruby; + +sub plugin_inline { + my ($escaped_argument) = @_; + my ($string,$ruby) = split(/,/, $escaped_argument); + return qq(<ruby><rb>$string</rb><rp>(</rp><rt>$ruby</rt><rp>)</rp></ruby>); +} + +sub plugin_usage { + return { + name => 'ruby', + version => '1.0', + author => 'Hiroshi Yuki <hyuki@hyuki.com>', + syntax => '&ruby(string,ruby)', + description => 'Make ruby.', + example => '&ruby(KANJI,kana)', + }; +} + +1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugin/verb.pl Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,21 @@ +use strict; + +package verb; + +sub plugin_inline { + my ($escaped_argument) = @_; + return qq(<span class="verb">$escaped_argument</span>); +} + +sub plugin_usage { + return { + name => 'verb', + version => '1.0', + author => 'Hiroshi Yuki <hyuki@hyuki.com>', + syntax => '&verb(as-is string)', + description => 'Inline verbatim (hard).', + example => '&verb(ThisIsNotWikiName)', + }; +} + +1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/readme.txt Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,331 @@ +YukiWiki - Ž©—R‚Ƀy[ƒW‚ð’ljÁEíœE•ÒW‚Å‚«‚éWebƒy[ƒW\’zCGI + +------------------------------------------------- +¡ìŽÒ +------------------------------------------------- + +Copyright (C) 2000-2006 by Hiroshi Yuki. +Œ‹é_ <hyuki@hyuki.com> +http://www.hyuki.com/ +http://www.hyuki.com/yukiwiki/ + + +------------------------------------------------- +¡ÅVî•ñ +------------------------------------------------- + +ˆÈ‰º‚ÌURL‚ÅÅVî•ñ‚ð“üŽè‚µ‚Ä‚‚¾‚³‚¢B +http://www.hyuki.com/yukiwiki/ + + +------------------------------------------------- +¡‚Í‚¶‚ß‚É +------------------------------------------------- + +YukiWikiiŒ‹éƒEƒBƒLj‚ÍŽQ‰ÁŽÒ‚ªŽ©—R‚Ƀy[ƒW‚ð’ljÁEíœE•ÒW‚Å‚«‚é‚Æ‚¢‚¤ +•sŽv‹c‚ÈWebƒy[ƒWŒQ‚ðì‚éCGI‚Å‚·B +Web‚Å“®ì‚·‚éŒfŽ¦”‚Ƃ¿‚å‚Á‚ÆŽ—‚Ä‚¢‚Ü‚·‚ªA +WebŒfŽ¦”‚ª’P‚ɃƒbƒZ[ƒW‚ð’ljÁ‚·‚邾‚¯‚Ȃ̂ɑ΂µ‚ÄA +YukiWiki‚ÍAWebƒy[ƒW‘S‘Ì‚ðŽ©—R‚É•ÏX‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B + +YukiWiki‚ÍAWard Cunningham‚ÌWiki‚ÌŽd—l‚ðŽQl‚É‚µ‚Ä“ÆŽ©‚Éì‚ç‚ê‚Ü‚µ‚½B +‚±‚¤‚¢‚Á‚½CGI‚Í¢ŠE’†‚É–³”‚É‚ ‚èuWikiƒNƒ[ƒ“v‚ƌĂ΂ê‚Ä‚¢‚Ü‚·B +YukiWiki‚ÍWikiƒNƒ[ƒ“‚̈êŽí‚Å‚·B + +YukiWiki‚ÍPerl‚Å‘‚©‚ꂽCGIƒXƒNƒŠƒvƒg‚Æ‚µ‚ÄŽÀŒ»‚³‚ê‚Ä‚¢‚Ü‚·‚Ì‚ÅA +Perl‚ª“®ì‚·‚éWebƒT[ƒo‚È‚ç‚ΔäŠr“I—eˆÕ‚ÉÝ’u‚Å‚«‚Ü‚·B + +YukiWiki‚̓tƒŠ[ƒ\ƒtƒg‚Å‚·B +‚²Ž©—R‚É‚¨Žg‚¢‚‚¾‚³‚¢B + + +------------------------------------------------- +¡ƒ‰ƒCƒZƒ“ƒX +------------------------------------------------- + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +------------------------------------------------- +¡Ý’uŽè‡ +------------------------------------------------- + +(1) wiki.cgi‚̈ês–Ú‚ð‚ ‚È‚½‚̃T[ƒo‚ɇ‚킹‚ÄC³‚µ‚Ü‚·B + —á1 + #!/usr/bin/perl + + —á2:Windows‚ÌActivePerl‚Ìê‡ + #!perl + +(2) wiki.cgi‚Ì‚Í‚¶‚ß‚Ì•û‚É‚ ‚éA•Ï”$modifier_...‚Ì’l‚ðC³‚µ‚Ü‚·(•K{) + + my $modifier_mail + ŠÇ—ŽÒƒ[ƒ‹ƒAƒhƒŒƒX + + my $modifier_url + ŠÇ—ŽÒWebƒy[ƒW + + my $modifier_name + ŠÇ—ŽÒ–¼‘O + + my $modifier_dbtype + ƒf[ƒ^ƒx[ƒX‚ÌŽí—Þ(ˆÈ‰º‚Ì‚¢‚¸‚ê‚©) + 'YukiWikiDB' („§)“ü—Í‚³‚ꂽƒeƒLƒXƒg‚ð‚»‚Ì‚Ü‚Üƒtƒ@ƒCƒ‹‚Æ‚µ‚Ä•Û‘¶ + 'dbmopen' ƒT[ƒo‚É‚æ‚Á‚ÄŽg‚¦‚È‚¢ê‡‚ ‚è + 'AnyDBM_File' ƒT[ƒo‚É‚æ‚Á‚ÄŽg‚¦‚È‚¢ê‡‚ ‚è + + my $modifier_sendmail + YukiWiki‘‚«ž‚ÝŽž‚ÉŠÇ—ŽÒ‚Ƀ[ƒ‹‚𑗂邽‚ß‚Ì + sendmail‚̃Rƒ}ƒ“ƒhƒ‰ƒCƒ“ + '/usr/sbin/sendmail -t -n' ˆê—á + '' ƒ[ƒ‹‚ð‘—‚ç‚È‚¢/‘—‚ê‚È‚¢ê‡ + + my $modifier_dir_data + CGI‚ª“Ç‚Ý‘‚«‚·‚éƒf[ƒ^‚ð’u‚ƒfƒBƒŒƒNƒgƒŠB + + my $modifier_url_data + CSS‚â‰æ‘œƒtƒ@ƒCƒ‹‚ð’u‚ƒfƒBƒŒƒNƒgƒŠ‚ɑΉž‚µ‚½URLB + + my $modifier_rss_title + ƒ^ƒCƒgƒ‹(RSS—p) + + my $modifier_rss_link + Ý’u‚·‚éYukiWiki‚ÌURL(RSS—p) + + my $modifier_rss_about + RSSƒtƒB[ƒh‚ÌURL(RSS—p) + + my $modifier_rss_description + à–¾•¶(RSS—p) + + +(3) uƒtƒ@ƒCƒ‹ˆê——v‚É‚ ‚éƒtƒ@ƒCƒ‹‚ðƒT[ƒo‚É“]‘—‚µ‚Ü‚·B + “]‘—ƒ‚[ƒh‚âƒp[ƒ~ƒbƒVƒ‡ƒ“‚ð“KØ‚Éݒ肵‚Ü‚·B + +(4) ƒuƒ‰ƒEƒU‚ŃT[ƒoã‚Ìwiki.cgi‚ÌURL‚ɃAƒNƒZƒX‚µ‚Ü‚·B + +(5) FrontPage‚ª•\Ž¦‚³‚ꂽ‚çAAdminChangePassword‚Æ‚¢‚¤ƒŠƒ“ƒN‚ð‚½‚Ç‚Á‚ÄA + ŠÇ—ŽÒ—p‚̃pƒXƒ[ƒh‚ðݒ肵‚Ü‚·B + +(6) ݒ肪ςñ‚¾‚çAfrontpage.txtƒtƒ@ƒCƒ‹‚ð‘‚«Š·‚¦AÄ“x“]‘—‚µ‚Ü‚·B + + +------------------------------------------------- +¡ƒtƒ@ƒCƒ‹ˆê—— +------------------------------------------------- + +œà–¾•¶ + +ˆÈ‰º‚̃tƒ@ƒCƒ‹‚ÍA +WebƒT[ƒo‚É“]‘—‚·‚é•K—v‚Í‚ ‚è‚Ü‚¹‚ñB + ++-- readme.txt ‰ðà•¶‘i‚±‚̃tƒ@ƒCƒ‹j ++-- plugin.txt ƒvƒ‰ƒOƒCƒ“‰ðà ++-- history.txt ŠJ”‹L˜^ + + +œCGIŒQ + +ˆÈ‰º‚̃tƒ@ƒCƒ‹‚ÍCGI‚ªŽÀs‚Å‚«‚éƒfƒBƒŒƒNƒgƒŠ‚ÉFTP‚µ‚Ü‚·B + + “]‘—ƒ‚[ƒh ƒp[ƒ~ƒbƒVƒ‡ƒ“ à–¾ ++-- wiki.cgi TEXT 755 (rwxr-xr-x) CGI–{‘Ì ++-- jcode.pl TEXT 644 (rw-r--r--) •¶ŽšƒR[ƒh•ÏŠ·ƒ‰ƒCƒuƒ‰ƒŠ ++-- Yuki 755 (rwxr-xr-x) ƒfƒBƒŒƒNƒgƒŠ +| +-- YukiWikiDB.pm TEXT 644 (rw-r--r--) ƒtƒ@ƒCƒ‹ƒx[ƒX‚ÌDB—p +| +-- RSS.pm TEXT 644 (rw-r--r--) RSS—p +| +-- DiffText.pm TEXT 644 (rw-r--r--) ·•ª—p +| +-- PluginManager.pm TEXT 644 (rw-r--r--) ƒvƒ‰ƒOƒCƒ“—p ++-- Algorithm 755 (rwxr-xr-x) ƒfƒBƒŒƒNƒgƒŠ + +-- Diff.pm TEXT 644 (rw-r--r--) ·•ª—p + +œƒvƒ‰ƒOƒCƒ“ + +ˆÈ‰º‚̃tƒ@ƒCƒ‹‚ÍA +wiki.cgi“à‚Ì•Ï”$modifier_dir_plugin‚ÅŽw’è‚·‚éƒfƒBƒŒƒNƒgƒŠ‚É“]‘—‚µ‚Ü‚·B + ++-- plugin 755 (rwxr-xr-x) ƒfƒBƒŒƒNƒgƒŠ + +-- link.pl TEXT 644 (rw-r--r--) linkƒvƒ‰ƒOƒCƒ“ + +-- recent.pl TEXT 644 (rw-r--r--) recentƒvƒ‰ƒOƒCƒ“ + +-- ruby.pl TEXT 644 (rw-r--r--) rubyƒvƒ‰ƒOƒCƒ“ + +-- verb.pl TEXT 644 (rw-r--r--) verbƒvƒ‰ƒOƒCƒ“ + +œŽQƃtƒ@ƒCƒ‹ + +ˆÈ‰º‚̃tƒ@ƒCƒ‹‚ÍA +wiki.cgi“à‚Ì•Ï”$modifier_dir_data‚ÅŽw’è‚·‚éƒfƒBƒŒƒNƒgƒŠ‚É“]‘—‚µ‚Ü‚·B + + “]‘—ƒ‚[ƒh ƒp[ƒ~ƒbƒVƒ‡ƒ“ à–¾ ++-- rss.xml TEXT 666 (rw-rw-rw-) RSSƒtƒ@ƒCƒ‹ ++-- touched.txt TEXT 666 (rw-rw-rw-) •ÒWŽž‚ÌXVƒtƒ@ƒCƒ‹ ++-- frontpage.txt TEXT 644 (rw-r--r--) FrontPage‚̃eƒLƒXƒg ++-- resource.txt TEXT 644 (rw-r--r--) ƒŠƒ\[ƒXƒtƒ@ƒCƒ‹ ++-- conflict.txt TEXT 644 (rw-r--r--) XV‚ÌÕ“ËŽž‚̃eƒLƒXƒg ++-- format.txt TEXT 644 (rw-r--r--) ®Œ`ƒ‹[ƒ‹‚̃eƒLƒXƒg + +ƒvƒƒoƒCƒ_‚É‚æ‚Á‚Ä‚ÍA +CGI‚ð’u‚ƒfƒBƒŒƒNƒgƒŠ‚É‚ ‚éƒtƒ@ƒCƒ‹‚ÍACGI‚©‚çƒAƒNƒZƒX‚Å‚«‚È‚¢ê‡‚ª‚ ‚è‚Ü‚·B + +‚»‚ÌꇂɂÍA•Ï”$modifier_dir_data‚ðŽg‚Á‚ÄA +uCGI‚ª“Ç‚Ý‘‚«‚Å‚«‚éƒtƒ@ƒCƒ‹‚ð’u‚ƒfƒBƒŒƒNƒgƒŠv‚ðŽw’肵‚Ä‚¨‚«A +‚»‚̃fƒBƒŒƒNƒgƒŠ‚Éã‹L‚̃tƒ@ƒCƒ‹‚ð“]‘—‚µ‚Ü‚·B + +‚»‚̂悤‚ȧŒÀ‚ª‚È‚¢ê‡‚É‚ÍA +•Ï”$modifier_dir_data‚Å‚Íwiki.cgi‚ð“]‘—‚µ‚½ƒfƒBƒŒƒNƒgƒŠ‚ðŽw’肵A +“¯‚¶ƒfƒBƒŒƒNƒgƒŠ‚Éã‹Lƒtƒ@ƒCƒ‹‚ð“]‘—‚µ‚Ü‚·B + + +œƒXƒ^ƒCƒ‹ƒV[ƒg‚Ɖ摜ƒtƒ@ƒCƒ‹ + +ˆÈ‰º‚̃tƒ@ƒCƒ‹‚ÍA +wiki.cgi“à‚Ì•Ï”$modifier_url_data‚ÅŽw’è‚·‚éURL‚ɑΉž‚µ‚½ƒfƒBƒŒƒNƒgƒŠ‚É“]‘—‚µ‚Ü‚·B + ++-- wiki.css TEXT 644 (rw-r--r--) ƒXƒ^ƒCƒ‹ƒV[ƒg ++-- icon40x40.gif BINARY 644 (rw-r--r--) ƒAƒCƒRƒ“(¬) ++-- icon80x80.gif BINARY 644 (rw-r--r--) ƒAƒCƒRƒ“(‘å) + +ƒvƒƒoƒCƒ_‚É‚æ‚Á‚Ä‚ÍA +CGI‚ð’u‚ƒfƒBƒŒƒNƒgƒŠ‚ɃXƒ^ƒCƒ‹ƒV[ƒg‚â‰æ‘œƒtƒ@ƒCƒ‹‚ð’u‚¢‚Ä‚à +WebƒT[ƒo‚©‚çŽQÆ‚Å‚«‚È‚¢ê‡‚ª‚ ‚è‚Ü‚·B + +‚»‚ÌꇂɂÍA +WebƒT[ƒo‚©‚çŽQÆ‚Å‚«‚éꊂÌURL‚ð$modifier_url_data‚ðŽg‚Á‚ÄŽw’肵A +‚»‚̃fƒBƒŒƒNƒgƒŠ‚Éã‹Lƒtƒ@ƒCƒ‹‚ð“]‘—‚µ‚Ü‚·B + +‚»‚̂悤‚ȧŒÀ‚ª‚È‚¢ê‡‚É‚ÍA +•Ï”$modifier_url_data‚Å‚Íwiki.cgi‚ð“]‘—‚µ‚½ƒfƒBƒŒƒNƒgƒŠ‚ðŽw’肵A +“¯‚¶ƒfƒBƒŒƒNƒgƒŠ‚Éã‹Lƒtƒ@ƒCƒ‹‚ð“]‘—‚µ‚Ü‚·B + +œì¬‚³‚ê‚éƒf[ƒ^ + +ˆÈ‰º‚̃tƒ@ƒCƒ‹(deleteme.txt)‚ÍA“]‘—‚·‚é•K—v‚Í‚ ‚è‚Ü‚¹‚ñB +i“]‘—‚µ‚Ä‚à‚©‚Ü‚¢‚Ü‚¹‚ñj +wiki, diff, info‚̃fƒBƒŒƒNƒgƒŠ‚Í쬂µ‚Ä‚¨‚•K—v‚ª‚ ‚è‚Ü‚·B + ++-- wiki 777 (rwxrwxrwx) ƒfƒBƒŒƒNƒgƒŠ +| +-- deleteme.txt “]‘—•s—v +| ++-- diff 777 (rwxrwxrwx) ƒfƒBƒŒƒNƒgƒŠ +| +-- deleteme.txt “]‘—•s—v +| ++-- info 777 (rwxrwxrwx) ƒfƒBƒŒƒNƒgƒŠ +| +-- deleteme.txt “]‘—•s—v + + +ƒvƒƒoƒCƒ_‚É‚æ‚Á‚Ä‚ÍA +CGI‚ð’u‚ƒfƒBƒŒƒNƒgƒŠ‚É‚ ‚éƒtƒ@ƒCƒ‹‚ÍACGI‚©‚çƒAƒNƒZƒX‚Å‚«‚È‚¢ê‡‚ª‚ ‚è‚Ü‚·B + +‚»‚ÌꇂɂÍA•Ï”$modifier_dir_data‚ðŽg‚Á‚ÄA +uCGI‚ª“Ç‚Ý‘‚«‚Å‚«‚éƒtƒ@ƒCƒ‹‚ð’u‚ƒfƒBƒŒƒNƒgƒŠv‚ðŽw’肵‚Ä‚¨‚«A +‚»‚̃fƒBƒŒƒNƒgƒŠ‚Éã‹L‚Ìwiki, diff, infoƒfƒBƒŒƒNƒgƒŠ‚ðì‚è‚Ü‚·B + +‚»‚̂悤‚ȧŒÀ‚ª‚È‚¢ê‡‚É‚ÍA +•Ï”$modifier_dir_data‚Å‚Íwiki.cgi‚ð“]‘—‚µ‚½ƒfƒBƒŒƒNƒgƒŠ‚ðŽw’肵A +“¯‚¶ƒfƒBƒŒƒNƒgƒŠ‚Éã‹L‚Ìwiki, diff, infoƒfƒBƒŒƒNƒgƒŠ‚ðì‚è‚Ü‚·B + +------------------------------------------------- +¡ƒf[ƒ^‚̃oƒbƒNƒAƒbƒv•û–@ +------------------------------------------------- + +YukiWiki‚Å\’z‚³‚ꂽWebƒy[ƒW‚̃Rƒ“ƒeƒ“ƒc‚ÍA +wiki.cgi‚ªì‚èo‚·ƒf[ƒ^ƒx[ƒX“à‚É•ÛŽ‚³‚ê‚Ü‚·B + +ì‚ç‚ꂽƒf[ƒ^‚Í‚·‚×‚Ä +•Ï”$modifier_dir_data‚ÅŽw’肵‚½ƒfƒBƒŒƒNƒgƒŠˆÈ‰º‚Éì‚ç‚ê‚Ü‚·‚Ì‚ÅA +‚±‚̃fƒBƒŒƒNƒgƒŠ‚̉º‚ð‚·‚×‚ÄƒoƒbƒNƒAƒbƒv‚µ‚Ä‚¨‚¯‚΂悢‚Å‚µ‚傤B + +•Ï”$modifier_dbtype‚ð'YukiWikiDB'‚É‚µ‚½ê‡‚É‚ÍA +wiki, info, diff‚Æ‚¢‚¤3‚‚̃fƒBƒŒƒNƒgƒŠ‚ªì‚ç‚êA +‚»‚̉º‚Ƀy[ƒW‚²‚ƂɃtƒ@ƒCƒ‹‚ªì‚ç‚ê‚Ü‚·B +ƒoƒbƒNƒAƒbƒv‚à‚ꂪ‚È‚¢‚悤‚É’ˆÓ‚µ‚Ä‚‚¾‚³‚¢B + + +------------------------------------------------- +¡Šî–{“I‚ÈŽg‚¢•û +------------------------------------------------- + +œV‚µ‚¢ƒy[ƒW‚Ìì‚è•û + +1.uV‹Kì¬v‚Æ‚¢‚¤ƒŠƒ“ƒN‚ð‚½‚Ç‚è‚Ü‚·B +2. V‚µ‚¢ƒy[ƒW‚Ì–¼‘O‚ð“ü—Í‚µ‚Ü‚·B +3. ƒy[ƒW‚Ì“à—e‚ð“ü—Í‚µ‚Ü‚·B + +œƒeƒLƒXƒg®Œ`‚̃‹[ƒ‹ + +format.txt‚ðŽQÆ‚µ‚Ä‚‚¾‚³‚¢B + +œƒnƒCƒp[ƒŠƒ“ƒN + +LinkToSomePage‚âFrontPage‚̂悤‚ÉA +‰p’PŒê‚Ìʼn‚̈ꕶŽš‚ð‘啶Žš‚É‚µ‚½‚à‚Ì‚ª +“ñ‚ˆÈã˜A‘±‚µ‚½‚à‚Ì‚ÍYukiWiki‚̃y[ƒW–¼‚Æ‚È‚èA +‚»‚ꂪ•¶Í’†‚ÉŠÜ‚Ü‚ê‚é‚ƃŠƒ“ƒN‚É‚È‚è‚Ü‚·B + +“ñd‚Ì‘å‚©‚Á‚±[[ ]]‚Å‚‚‚Á‚½•¶Žš—ñ‚àA +YukiWiki‚̃y[ƒW–¼‚É‚È‚è‚Ü‚·B +‘å‚©‚Á‚±‚Ì’†‚ɂ̓Xƒy[ƒX‚ðŠÜ‚ß‚Ä‚Í‚¢‚¯‚Ü‚¹‚ñB +“ú–{Œê‚àŽg‚¦‚Ü‚·B + +http://www.hyuki.com/ +‚̂悤‚ÈURL‚ÍŽ©“®“I‚ɃŠƒ“ƒN‚É‚È‚è‚Ü‚·B + + +------------------------------------------------- +¡ŽÓŽ« +------------------------------------------------- + +–{‰Æ‚ÌWiki‚ðì‚Á‚½Ward Cunningham‚ÉŠ´ŽÓ‚µ‚Ü‚·B +http://c2.com/cgi/wiki + +YukiWiki‚ðŠy‚µ‚ñ‚ÅŽg‚Á‚Ä‚‚¾‚³‚éƒlƒbƒgã‚Ì•ûX‚ÉŠ´ŽÓ‚µ‚Ü‚·B + +‘½‚‚ÌWikiƒNƒ[ƒ“‚ÌìŽÒ‚³‚ñ‚½‚¿‚ÆA +YukiWiki‚̃†[ƒU‚³‚ñ‚½‚¿‚É[‚Š´ŽÓ‚µ‚Ü‚·B + +ŸPukiWiki (PHP) +http://pukiwiki.org/ +“Á‚ÉInterWiki, ˆêŒ¾ƒRƒƒ“ƒg‹@”\‚È‚Ç‚ÉŠ´ŽÓ‚µ‚Ü‚·B + +ŸTiki (Ruby) +http://www.todo.org/cgi-bin/jp/tiki.cgi + +ŸRWiki (Ruby) +http://www.jin.gr.jp/~nahi/RWiki/ + +ŸKbWiki (Perl + HTML::Template) +http://www.hippo2000.info/cgi-bin/KbWiki/KbWiki.pl + +Ÿu‹Éˆ«v‚³‚ñ‚Ìwiki (Perl) +http://hpcgi1.nifty.com/dune/gwiki.pl +“Á‚ÉAYukiWikiDB‚ÉŠ´ŽÓ‚µ‚Ü‚·B + +Ÿ’Ë–{–q¶‚³‚ñ‚ÌWalWiki (Perl) +http://digit.que.ne.jp/work/ +ƒe[ƒuƒ‹‹@”\‚¨‚æ‚ÑYukiWiki‚ɑ΂·‚鑽”‚̉ü—Ç‚ÉŠ´ŽÓ‚µ‚Ü‚·B + +YukiWiki‚̃ƒS‚ðƒfƒUƒCƒ“‚µ‚Ä‚‚¾‚³‚Á‚½‹´–{—ç“Þ‚³‚ñ +http://city.hokkai.or.jp/~reina/ +‚ÉŠ´ŽÓ‚µ‚Ü‚·B + + +------------------------------------------------- +¡ŠÖ˜AƒŠƒ“ƒN +------------------------------------------------- + +ŸŒ‹é_‚̃y[ƒW +http://www.hyuki.com/ + +ŸYukiWikiƒz[ƒ€ƒy[ƒW +http://www.hyuki.com/yukiwiki/ + +Ÿ‘ÐFŒ‹é_‚ÌWiki“ü–å +http://www.hyuki.com/wb/ + +Ÿ–{‰Æ‚ÌWiki +http://c2.com/cgi/wiki?WikiWikiWeb + +Ÿ“ú–{”‚ÌwikiƒNƒ[ƒ“ƒŠƒXƒg +http://www1.neweb.ne.jp/wa/yamdas/column/technique/clonelist.html + +Ÿ“ú–{”‚ÌwikiƒNƒ[ƒ“ƒŠƒXƒg2 +http://www1.neweb.ne.jp/wa/yamdas/column/technique/clonelist2.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/resource.txt Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,57 @@ +# +# Resource file +# +deleted=휂µ‚Ü‚µ‚½B +notfound=Œ©‚‚©‚è‚Ü‚¹‚ñB +invalidname=–¼‘O‚ª³‚µ‚‚ ‚è‚Ü‚¹‚ñB +editthispage=‚±‚̃y[ƒW‚ð•ÒW‚µ‚Ü‚· +admineditthispage=‚±‚̃y[ƒW‚ð•ÒW‚µ‚Ü‚·iƒpƒXƒ[ƒh‚ª•K—vj +cantchange=‚±‚̃y[ƒW‚Í•ÏX‚Å‚«‚Ü‚¹‚ñB +newpagename=V‚µ‚¢ƒy[ƒW‚Ì–¼‘O‚ð“ü—Í‚µ‚Ä‚‚¾‚³‚¢B +touch=ƒ^ƒCƒ€ƒXƒ^ƒ“ƒv‚ðXV +savebutton=•Û‘¶‚·‚é +createbutton=쬂·‚é +frozenbutton=“€Œ‹‚·‚é +notfrozenbutton=“€Œ‹‚µ‚È‚¢ +frozenpassword=ƒpƒXƒ[ƒh +passworderror=ƒpƒXƒ[ƒh‚ªŒë‚Á‚Ä‚¢‚Ü‚·B +changepasswordbutton=ƒpƒXƒ[ƒh•ÏX +oldpassword=ŒÃ‚¢ƒpƒXƒ[ƒh +newpassword=V‚µ‚¢ƒpƒXƒ[ƒh +newpassword2=V‚µ‚¢ƒpƒXƒ[ƒh(Ä“ü—Í) +passwordmismatcherror=V‚µ‚¢ƒpƒXƒ[ƒh‚ªˆê’v‚µ‚Ä‚¢‚Ü‚¹‚ñB +passwordchanged=ƒpƒXƒ[ƒh‚ð•ÏX‚µ‚Ü‚µ‚½B +changepassword=ƒpƒXƒ[ƒh•ÏX +success=Š®—¹‚µ‚Ü‚µ‚½ +passwordneeded=ƒy[ƒW‚𓀌‹‚·‚é‚ɂ̓pƒXƒ[ƒh‚ª•K—v‚Å‚·B +searchbutton=ŒŸõ +saved=•Û‘¶‚µ‚Ü‚µ‚½B +continuereading=ŽŸ‚̃Šƒ“ƒN‚ð‚½‚Ç‚Á‚Ä‚‚¾‚³‚¢: +searchthispage=‚±‚̃y[ƒW‚ðŒŸõ +recentchangesbutton=XV—š—ð +indexbutton=ˆê—— +createbutton=V‹Kì¬ +editbutton=•ÒW +admineditbutton=•ÒW(ŠÇ—ŽÒ—p) +yourname=‚ ‚È‚½‚Ì–¼‘O: +commentbutton=ƒRƒƒ“ƒg’ljÁ +difftitle=·•ª•\Ž¦ +diffnotice=<ul><li>ÅŒã‚ÌXV‚ŒljÁ‚³‚ꂽs‚Í<b class="added">‚±‚̂悤‚É</b>•\Ž¦‚µ‚Ü‚·B</li><li>ÅŒã‚ÌXV‚Å휂³‚ꂽs‚Í<s class="deleted">‚±‚̂悤‚É</s>•\Ž¦‚µ‚Ü‚·B</li></ul><hr /> +diffbutton=·•ª +rssbutton=RSS +previewtitle=ƒvƒŒƒrƒ…[ +previewnotice=<p>ˆÈ‰º‚̃vƒŒƒrƒ…[‚ðŠm”F‚µ‚ÄA‚悯‚ê‚΃y[ƒW‰º•”‚̃{ƒ^ƒ“‚Å•Û‘¶‚µ‚Ä‚‚¾‚³‚¢B</p><hr /> +previewempty=<p>iƒy[ƒW‚Ì“à—e‚Í‹ó‚Å‚·B•Û‘¶‚·‚é‚Æ‚±‚̃y[ƒW‚Í<b>íœ</b>‚³‚ê‚Ü‚·Bj</p> +previewbutton=ƒvƒŒƒrƒ…[ +bulkreadnotice=<p>ˆÈ‰º‚̃eƒLƒXƒgƒGƒŠƒA‚Ì’†‚É‘Sƒy[ƒW‚Ì“à—e‚ª“WŠJ‚³‚ê‚Ä‚¢‚Ü‚·B</p> +anydbmfileerror=<p>AnyDBM_File‚ÍŽg‚¦‚Ü‚¹‚ñB\$modifier_dbtype‚ð'YukiWikiDB'‚É•ÏX‚µ‚Ä‚‚¾‚³‚¢B</p> +table_of_contents=–ÚŽŸ +pluginerror=<p>ƒvƒ‰ƒOƒCƒ“‚ŃGƒ‰[‚ª‹N‚«‚Ü‚µ‚½B</p> +available_plugins=—˜—p‚Å‚«‚éƒvƒ‰ƒOƒCƒ“ +plugin_usage_name=–¼‘O +plugin_usage_version=Ver. +plugin_usage_author=ìŽÒ +plugin_usage_syntax=‹L–@ +plugin_usage_description=‰ðà +plugin_usage_example=ŽÀ—á +toolongpost=ƒƒbƒZ[ƒW‚ª’·‚·‚¬‚Ü‚·BÅ‘å:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rss.xml Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="euc-jp" ?> + +<rdf:RDF + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns="http://purl.org/rss/1.0/" + xmlns:dc="http://purl.org/dc/elements/1.1/" +> + +<channel rdf:about="http://www.hyuki.com/yukiwiki/rss.xml"> + <title>YukiWiki 2.1.3</title> + <link>http://www.hyuki.com/yukiwiki/wiki.cgi</link> + <description>This is YukiWiki, yet another Wiki clone</description> + <items> + <rdf:Seq> + <rdf:li rdf:resource="http://www.hyuki.com/yukiwiki/wiki.cgi?FrontPage" /> + <rdf:li rdf:resource="http://www.hyuki.com/yukiwiki/wiki.cgi?hogehoge" /> + <rdf:li rdf:resource="http://www.hyuki.com/yukiwiki/wiki.cgi?%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2" /> + + </rdf:Seq> + </items> +</channel> + + <item rdf:about="http://www.hyuki.com/yukiwiki/wiki.cgi?FrontPage"> + <title>FrontPage</title> + <link>http://www.hyuki.com/yukiwiki/wiki.cgi?FrontPage</link> + <description>FrontPage - YukiWiki on Cassandra</description> + <dc:date>2010-06-06T21:50:42+09:00</dc:date> + </item> + + <item rdf:about="http://www.hyuki.com/yukiwiki/wiki.cgi?hogehoge"> + <title>hogehoge</title> + <link>http://www.hyuki.com/yukiwiki/wiki.cgi?hogehoge</link> + <description>hogehoge - ¤Ã¤Ã¤Ã¤Ã¤Ã¤Ã¤Ã¤Ã¤Ã¤Ã¤Ã£ó</description> + <dc:date>2010-06-06T18:27:11+09:00</dc:date> + </item> + + <item rdf:about="http://www.hyuki.com/yukiwiki/wiki.cgi?%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2"> + <title>¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢</title> + <link>http://www.hyuki.com/yukiwiki/wiki.cgi?%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2%a4%a2</link> + <description>¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢ - ¤¦¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢¤¢</description> + <dc:date>2010-06-06T18:25:40+09:00</dc:date> + </item> + +</rdf:RDF>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/touched.txt Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,1 @@ +Sun Jun 6 21:50:42 2010
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wiki.cgi Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,1435 @@ +#!/usr/bin/perl -X +#!perl -X +# +# wiki.cgi - YukiWiki on Cassandra +# Shoshi TAMAKI +# +############################## +# +# wiki.cgi - This is YukiWiki, yet another Wiki clone. +# +# Copyright (C) 2000-2004 by Hiroshi Yuki. +# <hyuki@hyuki.com> +# http://www.hyuki.com/yukiwiki/ +# +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +# +############################## +# Libraries. +use strict; +use lib qw(.); +use CGI qw(:standard); +use CGI::Carp qw(fatalsToBrowser); +use Yuki::RSS; +use Yuki::DiffText qw(difftext); +use Yuki::YukiWikiDB; +use Yuki::PluginManager; +use Cassandra::CassHash; +require 'jcode.pl'; +# use Jcode; +use Fcntl; +# Check if the server can use 'AnyDBM_File' or not. +# eval 'use AnyDBM_File'; +# my $error_AnyDBM_File = $@; +my $version = '2.1.3'; +############################## +# +# You MUST modify following '$modifier_...' variables. +# +my $modifier_mail = 'hyuki@hyuki.com'; +my $modifier_url = 'http://www.hyuki.com/'; +my $modifier_name = 'Hiroshi Yuki'; +my $modifier_dir_data = '.'; # Your data directory (not URL, but DIRECTORY). +my $modifier_url_data = '.'; # Your data URL (not DIRECTORY, but URL). +my $modifier_rss_title = "YukiWiki $version"; +my $modifier_rss_link = 'http://www.hyuki.com/yukiwiki/wiki.cgi'; +my $modifier_rss_about = 'http://www.hyuki.com/yukiwiki/rss.xml'; +my $modifier_rss_description = 'This is YukiWiki, yet another Wiki clone'; +my $modifier_rss_timezone = '+09:00'; +############################## +# +# You MAY modify following variables. +# +#my $modifier_dbtype = 'YukiWikiDB'; +my $modifier_dbtype = 'Cassandra::CassHash'; +my $modifier_sendmail = ''; +# my $modifier_sendmail = '/usr/sbin/sendmail -t -n'; +my $modifier_dir_plugin = './plugin'; +############################## +# +# You MAY modify following variables. +# +my $file_touch = "$modifier_dir_data/touched.txt"; +my $file_resource = "$modifier_dir_data/resource.txt"; +my $file_FrontPage = "$modifier_dir_data/frontpage.txt"; +my $file_conflict = "$modifier_dir_data/conflict.txt"; +my $file_format = "$modifier_dir_data/format.txt"; +my $file_rss = "$modifier_dir_data/rss.xml"; +my $url_cgi = 'wiki.cgi'; +my $url_stylesheet = "$modifier_url_data/wiki.css"; +my $icontag = qq(<img src="$modifier_url_data/icon40x40.gif" alt="*" width="40" height="40" />); +my $maxrecent = 50; +my $max_message_length = 500_000; # -1 for unlimited. +my $cols = 80; +my $rows = 20; +############################## +# +# You MAY modify following variables. +# +my $dataname = "$modifier_dir_data/wiki"; +my $infoname = "$modifier_dir_data/info"; +my $diffname = "$modifier_dir_data/diff"; +my $editchar = '?'; +my $subject_delimiter = ' - '; +my $use_autoimg = 1; # automatically convert image URL into <img> tag. +my $use_exists = 0; # If you can use 'exists' method for your DB. +my $use_FixedFrontPage = 0; +############################## +my $InterWikiName = 'InterWikiName'; +my $RecentChanges = 'RecentChanges'; +my $AdminChangePassword = 'AdminChangePassword'; +my $CompletedSuccessfully = 'CompletedSuccessfully'; +my $FrontPage = 'FrontPage'; +my $IndexPage = 'IndexPage'; +my $SearchPage = 'SearchPage'; +my $CreatePage = 'CreatePage'; +my $ErrorPage = 'ErrorPage'; +my $RssPage = 'RssPage'; +my $AdminSpecialPage = 'Admin Special Page'; # must include spaces. +############################## +my $wiki_name = '\b([A-Z][a-z]+([A-Z][a-z]+)+)\b'; +my $bracket_name = '\[\[(\S+?)\]\]'; +my $embedded_name = '\[\[(#\S+?)\]\]'; +my $interwiki_definition = '\[\[(\S+?)\ (\S+?)\]\]'; +my $interwiki_name = '([^:]+):([^:].*)'; +# Sorry for wierd regex. +my $inline_plugin = '\&(\w+)\((([^()]*(\([^()]*\))?)*)\)'; +############################## +my $embed_comment = '[[#comment]]'; +my $embed_rcomment = '[[#rcomment]]'; +############################## +my $info_ConflictChecker = 'ConflictChecker'; +my $info_LastModified = 'LastModified'; +my $info_IsFrozen = 'IsFrozen'; +my $info_AdminPassword = 'AdminPassword'; +############################## +my $kanjicode = 'euc'; +my $charset = 'euc-jp'; +my $lang = 'ja'; +my %fixedpage = ( + $IndexPage => 1, + $CreatePage => 1, + $ErrorPage => 1, + $RssPage => 1, + $RecentChanges => 1, + $SearchPage => 1, + $AdminChangePassword => 1, + $CompletedSuccessfully => 1, + $FrontPage => $use_FixedFrontPage, +); +my %form; +my %database; +my %infobase; +my %diffbase; +my %resource; +my %interwiki; +my $plugin_manager; +my $plugin_context = { + debug => 0, + database => \%database, + infobase => \%infobase, + resource => \%resource, + form => \%form, + interwiki => \%interwiki, + url_cgi => $url_cgi, +}; +############################## +my %page_command = ( + $IndexPage => 'index', + $SearchPage => 'searchform', + $CreatePage => 'create', + $RssPage => 'rss', + $AdminChangePassword => 'adminchangepasswordform', + $FrontPage => 'FrontPage', +); +my %command_do = ( + read => \&do_read, + edit => \&do_edit, + adminedit => \&do_adminedit, + adminchangepasswordform => \&do_adminchangepasswordform, + adminchangepassword => \&do_adminchangepassword, + write => \&do_write, + index => \&do_index, + searchform => \&do_searchform, + search => \&do_search, + create => \&do_create, + createresult => \&do_createresult, + FrontPage => \&do_FrontPage, + comment => \&do_comment, + rss => \&do_rss, + diff => \&do_diff, +); +############################## +# &test_convert; +&main; +exit(0); +############################## + +sub main { + &init_resource; + # &check_modifiers; + &open_db; + &init_form; + &init_InterWikiName; + &init_plugin; + if ($command_do{$form{mycmd}}) { + &{$command_do{$form{mycmd}}}; + } else { + &do_FrontPage; + } + &close_db; +} + +sub do_read { + &print_header($form{mypage}); + &print_content($database{$form{mypage}}); + &print_footer($form{mypage}); +} + +sub do_edit { + my ($page) = &unarmor_name(&armor_name($form{mypage})); + &print_header($page); + if (not &is_editable($page)) { + &print_message($resource{cantchange}); + } elsif (&is_frozen($page)) { + &print_message($resource{cantchange}); + } else { + &print_editform($database{$page}, &get_info($page, $info_ConflictChecker), admin=>0); + } + &print_footer($page); +} + +sub do_adminedit { + my ($page) = &unarmor_name(&armor_name($form{mypage})); + &print_header($page); + if (not &is_editable($page)) { + &print_message($resource{cantchange}); + } else { + &print_message($resource{passwordneeded}); + &print_editform($database{$page}, &get_info($page, $info_ConflictChecker), admin=>1); + } + &print_footer($page); +} + +sub do_adminchangepasswordform { + &print_header($AdminChangePassword); + &print_passwordform; + &print_footer($AdminChangePassword); +} + +sub do_adminchangepassword { + if ($form{mynewpassword} ne $form{mynewpassword2}) { + &print_error($resource{passwordmismatcherror}); + } + my ($validpassword_crypt) = &get_info($AdminSpecialPage, $info_AdminPassword); + if ($validpassword_crypt) { + if (not &valid_password($form{myoldpassword})) { + &send_mail_to_admin(<<"EOD", "AdminChangePassword"); +myoldpassword=$form{myoldpassword} +mynewpassword=$form{mynewpassword} +mynewpassword2=$form{mynewpassword2} +EOD + &print_error($resource{passworderror}); + } + } + my ($sec, $min, $hour, $day, $mon, $year, $weekday) = localtime(time); + my (@token) = ('0'..'9', 'A'..'Z', 'a'..'z'); + my $salt1 = $token[(time | $$) % scalar(@token)]; + my $salt2 = $token[($sec + $min*60 + $hour*60*60) % scalar(@token)]; + my $crypted = crypt($form{mynewpassword}, "$salt1$salt2"); + &set_info($AdminSpecialPage, $info_AdminPassword, $crypted); + + &print_header($CompletedSuccessfully); + &print_message($resource{passwordchanged}); + &print_footer($CompletedSuccessfully); +} + +sub do_index { + &print_header($IndexPage); + print qq(<ul>); + foreach my $page (sort keys %database) { + if (&is_editable($page)) { + print qq(<li><a href="$url_cgi?@{[&encode($page)]}">@{[&escape($page)]}</a>@{[&escape(&get_subjectline($page))]}</li>); + # print qq(<li>@{[&get_info($page, $info_IsFrozen)]}</li>); + # print qq(<li>@{[0 + &is_frozen($page)]}</li>); + } + } + print qq(</ul>); + &print_footer($IndexPage); +} + +sub do_write { + if (&keyword_reject()) { + return; + } + + if (&frozen_reject()) { + return; + } + + if (&length_reject()) { + return; + } + + if (not &is_editable($form{mypage})) { + &print_header($form{mypage}); + &print_message($resource{cantchange}); + &print_footer($form{mypage}); + return; + } + + if (&conflict($form{mypage}, $form{mymsg})) { + return; + } + + # Making diff + if (1) { + &open_diff; + my @msg1 = split(/\r?\n/, $database{$form{mypage}}); + my @msg2 = split(/\r?\n/, $form{mymsg}); + $diffbase{$form{mypage}} = &difftext(\@msg1, \@msg2); + &close_diff; + } + + if ($form{mymsg}) { + $database{$form{mypage}} = $form{mymsg}; + &send_mail_to_admin($form{mypage}, "Modify"); + &set_info($form{mypage}, $info_ConflictChecker, '' . localtime); + if ($form{mytouch}) { + &set_info($form{mypage}, $info_LastModified, '' . localtime); + &update_recent_changes; + } + &set_info($form{mypage}, $info_IsFrozen, 0 + $form{myfrozen}); + &print_header($CompletedSuccessfully); + &print_message($resource{saved}); + &print_content("$resource{continuereading} @{[&armor_name($form{mypage})]}"); + &print_footer($CompletedSuccessfully); + } else { + &send_mail_to_admin($form{mypage}, "Delete"); + delete $database{$form{mypage}}; + delete $infobase{$form{mypage}}; + if ($form{mytouch}) { + &update_recent_changes; + } + &print_header($form{mypage}); + &print_message($resource{deleted}); + &print_footer($form{mypage}); + } +} + +sub do_searchform { + &print_header($SearchPage); + &print_searchform(""); + &print_footer($SearchPage); +} + +sub do_search { + my $word = &escape($form{mymsg}); + &print_header($SearchPage); + &print_searchform($word); + my $counter = 0; + foreach my $page (sort keys %database) { + next if $page =~ /^$RecentChanges$/; + if ($database{$page} =~ /\Q$form{mymsg}\E/ or $page =~ /\Q$form{mymsg}\E/) { + if ($counter == 0) { + print qq|<ul>|; + } + print qq(<li><a href ="$url_cgi?@{[&encode($page)]}">@{[&escape($page)]}</a>@{[&escape(&get_subjectline($page))]}</li>); + $counter++; + } + } + if ($counter == 0) { + &print_message($resource{notfound}); + } else { + print qq|</ul>|; + } + &print_footer($SearchPage); +} + +sub do_create { + &print_header($CreatePage); + print <<"EOD"; +<form action="$url_cgi" method="post"> + <input type="hidden" name="mycmd" value="edit"> + <strong>$resource{newpagename}</strong><br> + <input type="text" name="mypage" value="" size="20"> + <input type="submit" value="$resource{createbutton}"><br> +</form> +EOD + &print_footer($CreatePage); +} + +sub do_FrontPage { + if ($fixedpage{$FrontPage}) { + open(FILE, $file_FrontPage) or &print_error("($file_FrontPage)"); + my $content = join('', <FILE>); + &code_convert(\$content, $kanjicode); + close(FILE); + &print_header($FrontPage); + &print_content($content); + &print_footer($FrontPage); + } else { + $form{mycmd} = 'read'; + $form{mypage} = $FrontPage; + &do_read; + } +} + +sub print_error { + my ($msg) = @_; + &print_header($ErrorPage); + print qq(<p><strong class="error">$msg</strong></p>); + &print_plugin_log; + &print_footer($ErrorPage); + exit(0); +} + +sub print_header { + my ($page) = @_; + my $bodyclass = "normal"; + my $editable = 0; + my $admineditable = 0; + if (&is_frozen($page) and $form{mycmd} =~ /^(read|write)$/) { + $editable = 0; + $admineditable = 1; + $bodyclass = "frozen"; + } elsif (&is_editable($page) and $form{mycmd} =~ /^(read|write)$/) { + $admineditable = 1; + $editable = 1; + } else { + $editable = 0; + } + my $cookedpage = &encode($page); + my $escapedpage = &escape($page); + print <<"EOD"; +Content-type: text/html; charset=$charset + +<!DOCTYPE html + PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> +<html lang="$lang"> +<head> + <meta http-equiv="Content-Language" content="$lang"> + <meta http-equiv="Content-Type" content="text/html; charset=$charset"> + <title>$escapedpage @{[&escape(&get_subjectline($page))]}</title> + <link rel="index" href="$url_cgi?$IndexPage"> + <link rev="made" href="mailto:$modifier_mail"> + <link rel="stylesheet" type="text/css" href="$url_stylesheet"> + <link rel="alternate" type="application/rss+xml" title="RSS" href="$modifier_rss_about" /> +</head> +<body class="$bodyclass"> +<div class="tools"> + @{[ $admineditable + ? qq(<a title="$resource{admineditthispage}" href="$url_cgi?mycmd=adminedit&mypage=$cookedpage">$resource{admineditbutton}</a> | ) + : qq() + ]} + @{[ $editable + ? qq(<a title="$resource{editthispage}" href="$url_cgi?mycmd=edit&mypage=$cookedpage">$resource{editbutton}</a> | ) + : qq() + ]} + @{[ $admineditable + ? qq(<a href="$url_cgi?mycmd=diff&mypage=$cookedpage">$resource{diffbutton}</a> | ) + : qq() + ]} + <a href="$url_cgi?$CreatePage">$resource{createbutton}</a> | + <a href="$url_cgi?$IndexPage">$resource{indexbutton}</a> | + <a href="$modifier_rss_about">$resource{rssbutton}</a> | + <a href="$url_cgi?$FrontPage">$FrontPage</a> | + <a href="$url_cgi?$SearchPage">$resource{searchbutton}</a> | + <a href="$url_cgi?$RecentChanges">$resource{recentchangesbutton}</a> +</div> +<h1 class="header"><a + title="$resource{searchthispage}" + href="$url_cgi?mycmd=search&mymsg=$cookedpage">@{[&escape($page)]}</a>@{[&escape(&get_subjectline($page))]}</h1> +EOD +} + +sub print_footer { + my ($page) = @_; + print <<"EOD"; +<hr> +<address class="footer"> + Powered by <a href="http://www.hyuki.com/yukiwiki/">YukiWiki</a> $version <br /> + Modified by <a href="$modifier_url">$modifier_name</a>. +</address> +<p class="footer"> + <a href="http://www.hyuki.com/yukiwiki/">$icontag</a> +</p> +</body> +</html> +EOD +} + +sub escape { + my $s = shift; + $s =~ s|\r\n|\n|g; + $s =~ s|\&|&|g; + $s =~ s|<|<|g; + $s =~ s|>|>|g; + $s =~ s|"|"|g; + return $s; +} + +sub unescape { + my $s = shift; + # $s =~ s|\n|\r\n|g; + $s =~ s|\&|\&|g; + $s =~ s|\<|\<|g; + $s =~ s|\>|\>|g; + $s =~ s|\"|\"|g; + return $s; +} + +sub print_content { + my ($rawcontent) = @_; + print &text_to_html($rawcontent, toc=>1); +} + +sub text_to_html { + my ($txt, %option) = @_; + my (@txt) = split(/\r?\n/, $txt); + my (@toc); + my $verbatim; + my $tocnum = 0; + my (@saved, @result); + unshift(@saved, "</p>"); + push(@result, "<p>"); + foreach (@txt) { + chomp; + + # verbatim. + if ($verbatim->{func}) { + if (/^\Q$verbatim->{done}\E$/) { + undef $verbatim; + push(@result, splice(@saved)); + } else { + push(@result, $verbatim->{func}->($_)); + } + next; + } + + # non-verbatim follows. + push(@result, shift(@saved)) if (@saved and $saved[0] eq '</pre>' and /^[^ \t]/); + if (/^(\*{1,3})(.+)/) { + # $hn = 'h2', 'h3' or 'h4' + my $hn = "h" . (length($1) + 1); + push(@toc, '-' x length($1) . qq( <a href="#i$tocnum">) . &remove_tag(&inline($2)) . qq(</a>\n)); + push(@result, splice(@saved), qq(<$hn><a name="i$tocnum"> </a>) . &inline($2) . qq(</$hn>)); + $tocnum++; + } elsif (/^(-{2,3})\($/) { + if ($& eq '--(') { + $verbatim = { func => \&inline, done => '--)', class => 'verbatim-soft' }; + } else { + $verbatim = { func => \&escape, done => '---)', class => 'verbatim-hard' }; + } + &back_push('pre', 1, \@saved, \@result, " class='$verbatim->{class}'"); + } elsif (/^----/) { + push(@result, splice(@saved), '<hr>'); + } elsif (/^(-{1,3})(.+)/) { + &back_push('ul', length($1), \@saved, \@result); + push(@result, '<li>' . &inline($2) . '</li>'); + } elsif (/^:([^:]+):(.+)/) { + &back_push('dl', 1, \@saved, \@result); + push(@result, '<dt>' . &inline($1) . '</dt>', '<dd>' . &inline($2) . '</dd>'); + } elsif (/^(>{1,3})(.+)/) { + &back_push('blockquote', length($1), \@saved, \@result); + push(@result, &inline($2)); + } elsif (/^$/) { + push(@result, splice(@saved)); + unshift(@saved, "</p>"); + push(@result, "<p>"); + } elsif (/^(\s+.*)$/) { + &back_push('pre', 1, \@saved, \@result); + push(@result, &escape($1)); # Not &inline, but &escape + } elsif (/^\,(.*?)[\x0D\x0A]*$/) { + &back_push('table', 1, \@saved, \@result, ' border="1"'); + ####### + # This part is taken from Mr. Ohzaki's Perl Memo and Makio Tsukamoto's WalWiki. + # XXXXX + my $tmp = "$1,"; + my @value = map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_} ($tmp =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g); + my @align = map {(s/^\s+//) ? ((s/\s+$//) ? ' align="center"' : ' align="right"') : ''} @value; + my @colspan = map {($_ eq '==') ? 0 : 1} @value; + for (my $i = 0; $i < @value; $i++) { + if ($colspan[$i]) { + while ($i + $colspan[$i] < @value and $value[$i + $colspan[$i]] eq '==') { + $colspan[$i]++; + } + $colspan[$i] = ($colspan[$i] > 1) ? sprintf(' colspan="%d"', $colspan[$i]) : ''; + $value[$i] = sprintf('<td%s%s>%s</td>', $align[$i], $colspan[$i], &inline($value[$i])); + } else { + $value[$i] = ''; + } + } + push(@result, join('', '<tr>', @value, '</tr>')); + # XXXXX + ####### + } elsif (/^\#(\w+)(\((.*)\))?/) { + # BlockPlugin. + my $original_line = $_; + my $plugin_name = $1; + my $argument = &escape($3); + my $result = $plugin_manager->call($plugin_name, 'block', $argument); + if (defined($result)) { + push(@result, splice(@saved)); + } else { + $result = $original_line; + } + push(@result, $result); + } else { + push(@result, &inline($_)); + } + } + push(@result, splice(@saved)); + + if ($option{toc}) { + # Convert @toc (table of contents) to HTML. + # This part is taken from Makio Tsukamoto's WalWiki. + my (@tocsaved, @tocresult); + foreach (@toc) { + if (/^(-{1,3})(.*)/) { + &back_push('ul', length($1), \@tocsaved, \@tocresult); + push(@tocresult, '<li>' . $2 . '</li>'); + } + } + push(@tocresult, splice(@tocsaved)); + + # Insert "table of contents". + if (@tocresult) { + unshift(@tocresult, qq(<h2>$resource{table_of_contents}</h2>)); + } + + return join("\n", @tocresult, @result); + } else { + return join("\n", @result); + } +} + +sub back_push { + my ($tag, $level, $savedref, $resultref, $attr) = @_; + while (@$savedref > $level) { + push(@$resultref, shift(@$savedref)); + } + if ($savedref->[0] ne "</$tag>") { + push(@$resultref, splice(@$savedref)); + } + while (@$savedref < $level) { + unshift(@$savedref, "</$tag>"); + push(@$resultref, "<$tag$attr>"); + } +} + +sub remove_tag { + my ($line) = @_; + $line =~ s|\<\/?[A-Za-z][^>]*?\>||g; + return $line; +} + +sub inline { + my ($line) = @_; + $line = &escape($line); + $line =~ s|'''([^']+?)'''|<i>$1</i>|g; # Italic + $line =~ s|''([^']+?)''|<b>$1</b>|g; # Bold + $line =~ s|(\d\d\d\d-\d\d-\d\d \(\w\w\w\) \d\d:\d\d:\d\d)|<span class="date">$1</span>|g; # Date + $line =~ s! + ( + ((mailto|http|https|ftp):([^\x00-\x20()<>\x7F-\xFF])*) # Direct http://... + | + ($bracket_name) # [[likethis]], [[#comment]], [[Friend:remotelink]] + | + ($interwiki_definition) # [[Friend http://somewhere/?q=sjis($1)]] + | + ($wiki_name) # LocalLinkLikeThis + | + ($inline_plugin) # &user_defined_plugin(123,hello) + ) + ! + &make_link($1) + !gex; + return $line; +} + +sub make_link { + my $chunk = shift; + if ($chunk =~ /^(http|https|ftp):/) { + if ($use_autoimg and $chunk =~ /\.(gif|png|jpeg|jpg)$/) { + return qq(<a href="$chunk"><img src="$chunk"></a>); + } else { + return qq(<a href="$chunk">$chunk</a>); + } + } elsif ($chunk =~ /^(mailto):(.*)/) { + return qq(<a href="$chunk">$2</a>); + } elsif ($chunk =~ /^$interwiki_definition$/) { + return qq(<span class="InterWiki">$chunk</span>); + } elsif ($chunk =~ /^$embedded_name$/) { + return &embedded_to_html($chunk); + } elsif ($chunk =~ /^$inline_plugin$/) { + # InlinePlugin. + my $plugin_name = $1; + my $argument = $2; + my $result = $plugin_manager->call($plugin_name, 'inline', $argument); + if (defined($result)) { + return $result; + } else { + return $chunk; + } + } else { + $chunk = &unarmor_name($chunk); + $chunk = &unescape($chunk); # To treat '&' or '>' or '<' correctly. + my $cookedchunk = &encode($chunk); + my $escapedchunk = &escape($chunk); + if ($chunk =~ /^$interwiki_name$/) { + my ($intername, $localname) = ($1, $2); + my $remoteurl = $interwiki{$intername}; + if ($remoteurl =~ /^(http|https|ftp):\/\//) { # Check if scheme if valid. + $remoteurl =~ s/\b(euc|sjis|ykwk|asis)\(\$1\)/&interwiki_convert($1, $localname)/e; + return qq(<a href="$remoteurl">$escapedchunk</a>); + } else { + return $escapedchunk; + } + } elsif ($database{$chunk}) { + my $subject = &escape(&get_subjectline($chunk, delimiter => '')); + return qq(<a title="$subject" href="$url_cgi?$cookedchunk">$escapedchunk</a>); + } elsif ($page_command{$chunk}) { + return qq(<a title="$escapedchunk" href="$url_cgi?$cookedchunk">$escapedchunk</a>); + } else { + return qq($escapedchunk<a title="$resource{editthispage}" class="editlink" href="$url_cgi?mycmd=edit&mypage=$cookedchunk">$editchar</a>); + } + } +} + +sub print_message { + my ($msg) = @_; + print qq(<p><strong>$msg</strong></p>); +} + +sub init_form { + if (param()) { + foreach my $var (param()) { + $form{$var} = param($var); + } + } else { + $ENV{QUERY_STRING} = $FrontPage; + } + + my $query = &decode($ENV{QUERY_STRING}); + if ($page_command{$query}) { + $form{mycmd} = $page_command{$query}; + $form{mypage} = $query; + } elsif ($query =~ /^($wiki_name)$/) { + $form{mycmd} = 'read'; + $form{mypage} = $1; + } elsif ($database{$query}) { + $form{mycmd} = 'read'; + $form{mypage} = $query; + } + + # mypreview_edit -> do_edit, with preview. + # mypreview_adminedit -> do_adminedit, with preview. + # mypreview_write -> do_write, without preview. + foreach (keys %form) { + if (/^mypreview_(.*)$/) { + $form{mycmd} = $1; + $form{mypreview} = 1; + } + } + + # + # $form{mycmd} is frozen here. + # + + $form{mymsg} = &code_convert(\$form{mymsg}, $kanjicode); + $form{myname} = &code_convert(\$form{myname}, $kanjicode); +} + +sub update_recent_changes { + my $update = "- @{[&get_now]} @{[&armor_name($form{mypage})]} @{[&get_subjectline($form{mypage})]}"; + my @oldupdates = split(/\r?\n/, $database{$RecentChanges}); + my @updates; + foreach (@oldupdates) { + /^\- \d\d\d\d\-\d\d\-\d\d \(...\) \d\d:\d\d:\d\d (\S+)/; # date format. + my $name = &unarmor_name($1); + if (&is_exist_page($name) and ($name ne $form{mypage})) { + push(@updates, $_); + } + } + if (&is_exist_page($form{mypage})) { + unshift(@updates, $update); + } + splice(@updates, $maxrecent + 1); + $database{$RecentChanges} = join("\n", @updates); + if ($file_touch) { + open(FILE, "> $file_touch"); + print FILE localtime() . "\n"; + close(FILE); + } + if ($file_rss) { + &update_rssfile; + } +} + +sub get_subjectline { + my ($page, %option) = @_; + if (not &is_editable($page)) { + return ""; + } else { + # Delimiter check. + my $delim = $subject_delimiter; + if (defined($option{delimiter})) { + $delim = $option{delimiter}; + } + + # Get the subject of the page. + my $subject = $database{$page}; + $subject =~ s/\r?\n.*//s; + return "$delim$subject"; + } +} + +sub send_mail_to_admin { + my ($page, $mode) = @_; + return unless $modifier_sendmail; + my $message = <<"EOD"; +To: $modifier_mail +From: $modifier_mail +Subject: [Wiki/$mode] +MIME-Version: 1.0 +Content-Type: text/plain; charset=ISO-2022-JP +Content-Transfer-Encoding: 7bit + +-------- +MODE = $mode +REMOTE_ADDR = $ENV{REMOTE_ADDR} +REMOTE_HOST = $ENV{REMOTE_HOST} +-------- +$page +-------- +$database{$page} +-------- +EOD + &code_convert(\$message, 'jis'); + open(MAIL, "| $modifier_sendmail"); + print MAIL $message; + close(MAIL); +} + +sub open_db { + if ($modifier_dbtype eq 'dbmopen') { + dbmopen(%database, $dataname, 0666) or &print_error("(dbmopen) $dataname"); + dbmopen(%infobase, $infoname, 0666) or &print_error("(dbmopen) $infoname"); + } elsif ($modifier_dbtype eq 'AnyDBM_File') { + tie(%database, "AnyDBM_File", $dataname, O_RDWR|O_CREAT, 0666) or &print_error("(tie AnyDBM_File) $dataname"); + tie(%infobase, "AnyDBM_File", $infoname, O_RDWR|O_CREAT, 0666) or &print_error("(tie AnyDBM_File) $infoname"); + } elsif ($modifier_dbtype eq 'Cassandra::CassHash') { + #use cassandra + tie(%database, "Cassandra::CassHash","localhost",9161,"Keyspace1","Standard1","yukiwiki3") or &print_error("(tie Cassandra::CassHash) $dataname"); + tie(%infobase, "Cassandra::CassHash","localhost",9161,"Keyspace1","Standard1","yukiwiki5") or &print_error("(tie Cassandra::CassHash) $infoname"); + } else { + tie(%database, "Yuki::YukiWikiDB", $dataname) or &print_error("(tie Yuki::YukiWikiDB) $dataname"); + tie(%infobase, "Yuki::YukiWikiDB", $infoname) or &print_error("(tie Yuki::YukiWikiDB) $infoname"); + } +} + +sub close_db { + if ($modifier_dbtype eq 'dbmopen') { + dbmclose(%database); + dbmclose(%infobase); + } elsif ($modifier_dbtype eq 'AnyDBM_File') { + untie(%database); + untie(%infobase); + } else { + untie(%database); + untie(%infobase); + } +} + +sub open_diff { + if ($modifier_dbtype eq 'dbmopen') { + dbmopen(%diffbase, $diffname, 0666) or &print_error("(dbmopen) $diffname"); + } elsif ($modifier_dbtype eq 'AnyDBM_File') { + tie(%diffbase, "AnyDBM_File", $diffname) or &print_error("(tie AnyDBM_File) $diffname"); + } elsif ($modifier_dbtype eq 'Cassandra::CassHash') { + #use cassandra + tie(%diffbase, "Cassandra::CassHash","localhost",9161,"Keyspace1","Standard1","yukiwiki4") or &print_error("(tie Cassandra::CassHash) $diffname"); + } else { + tie(%diffbase, "Yuki::YukiWikiDB", $diffname) or &print_error("(tie Yuki::YukiWikiDB) $diffname"); + } +} + +sub close_diff { + if ($modifier_dbtype eq 'dbmopen') { + dbmclose(%diffbase); + } elsif ($modifier_dbtype eq 'AnyDBM_File') { + untie(%diffbase); + } else { + untie(%diffbase); + } +} + +sub print_searchform { + my ($word) = @_; + print <<"EOD"; +<form action="$url_cgi" method="get"> + <input type="hidden" name="mycmd" value="search"> + <input type="text" name="mymsg" value="$word" size="20"> + <input type="submit" value="$resource{searchbutton}"> +</form> +EOD +} + +sub print_editform { + my ($mymsg, $conflictchecker, %mode) = @_; + my $frozen = &is_frozen($form{mypage}); + + if ($form{mypreview}) { + if ($form{mymsg}) { + unless ($mode{conflict}) { + print qq(<h3>$resource{previewtitle}</h3>\n); + print qq($resource{previewnotice}\n); + print qq(<div class="preview">\n); + &print_content($form{mymsg}); + print qq(</div>\n); + } + } else { + print qq($resource{previewempty}); + } + $mymsg = &escape($form{mymsg}); + } else { + $mymsg = &escape($mymsg); + } + + my $edit = $mode{admin} ? 'adminedit' : 'edit'; + my $escapedmypage = &escape($form{mypage}); + my $escapedmypassword = &escape($form{mypassword}); + + print <<"EOD"; +<form action="$url_cgi" method="post"> + @{[ $mode{admin} ? qq($resource{frozenpassword} <input type="password" name="mypassword" value="$escapedmypassword" size="10"><br>) : "" ]} + <input type="hidden" name="myConflictChecker" value="$conflictchecker"> + <input type="hidden" name="mypage" value="$escapedmypage"> + <textarea cols="$cols" rows="$rows" name="mymsg"> +$mymsg</textarea><br> +@{[ + $mode{admin} ? + qq( + <input type="radio" name="myfrozen" value="1" @{[$frozen ? qq(checked="checked") : ""]}>$resource{frozenbutton} + <input type="radio" name="myfrozen" value="0" @{[$frozen ? "" : qq(checked="checked")]}>$resource{notfrozenbutton}<br>) + : "" +]} +@{[ + $mode{conflict} ? "" : + qq( + <input type="checkbox" name="mytouch" value="on" checked="checked">$resource{touch}<br> + <input type="submit" name="mypreview_$edit" value="$resource{previewbutton}"> + <input type="submit" name="mypreview_write" value="$resource{savebutton}"><br> + ) +]} +</form> +EOD + unless ($mode{conflict}) { + # Show the format rule. + open(FILE, $file_format) or &print_error("($file_format)"); + my $content = join('', <FILE>); + &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"; +<form action="$url_cgi" method="post"> + <input type="hidden" name="mycmd" value="adminchangepassword"> + $resource{oldpassword} <input type="password" name="myoldpassword" size="10"><br> + $resource{newpassword} <input type="password" name="mynewpassword" size="10"><br> + $resource{newpassword2} <input type="password" name="mynewpassword2" size="10"><br> + <input type="submit" value="$resource{changepasswordbutton}"><br> +</form> +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 (<FILE>) { + 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('', <FILE>); + &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"; +<form action="$url_cgi" method="post"> + <input type="hidden" name="mycmd" value="comment"> + <input type="hidden" name="mypage" value="$escapedmypage"> + <input type="hidden" name="myConflictChecker" value="$conflictchecker"> + <input type="hidden" name="mytouch" value="on"> + $resource{yourname} + <input type="text" name="myname" value="" size="10"> + <input type="text" name="mymsg" value="" size="40"> + <input type="submit" value="$resource{commentbutton}"> +</form> +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(<h3>$resource{difftitle}</h3>); + print qq($resource{diffnotice}); + print qq(<pre class="diff">); + foreach (split(/\n/, $_)) { + if (/^\+(.*)/) { + print qq(<b class="added">$1</b>\n); + } elsif (/^\-(.*)/) { + print qq(<s class="deleted">$1</s>\n); + } elsif (/^\=(.*)/) { + print qq(<span class="same">$1</span>\n); + } else { + print qq|??? $_\n|; + } + } + print qq(</pre>); + print qq(<hr>); + &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 "<pre>(print_plugin_log)\n", join("\n", @{$plugin_manager->{log}}), "</pre>"; + } +} + +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 <hyuki@hyuki.com> 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
--- /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; + } +} +