All Apache Thrift tutorials require that you have:
thrift -r --gen perl tutorial.thrift
#
use strict;
use warnings;
use lib '../../lib/perl/lib';
use lib 'gen-perl';
use Thrift;
use Thrift::BinaryProtocol;
use Thrift::Socket;
use Thrift::BufferedTransport;
use shared::SharedService;
use tutorial::Calculator;
use shared::Types;
use tutorial::Types;
use Data::Dumper;
my $socket = Thrift::Socket->new('localhost',9090);
my $transport = Thrift::BufferedTransport->new($socket,1024,1024);
my $protocol = Thrift::BinaryProtocol->new($transport);
my $client = tutorial::CalculatorClient->new($protocol);
eval{
$transport->open();
$client->ping();
print "ping()\n";
my $sum = $client->add(1,1);
print "1+1=$sum\n";
my $work = tutorial::Work->new();
$work->op(tutorial::Operation::DIVIDE);
$work->num1(1);
$work->num2(0);
eval {
$client->calculate(1, $work);
print "Whoa! We can divide by zero?\n";
}; if($@) {
warn 'InvalidOperation: '.Dumper($@);
}
$work->op(tutorial::Operation::SUBTRACT);
$work->num1(15);
$work->num2(10);
my $diff = $client->calculate(1, $work);
print "15-10=$diff\n";
my $log = $client->getStruct(1);
print "Log: $log->{value}\n";
$transport->close();
#
use strict;
use lib '../../lib/perl/lib';
use lib 'gen-perl';
use Thrift::Socket;
use Thrift::Server;
use Thrift::ServerSocket;
use tutorial::Calculator;
package CalculatorHandler;
use base qw(tutorial::CalculatorIf);
sub new {
my $classname = shift;
my $self = {};
return bless($self,$classname);
}
sub ping
{
print "ping()\n";
}
sub add
{
my($self, $n1, $n2) = @_;
printf("add(%d,%d)\n", $n1, $n2);
return $n1 + $n2;
}
sub calculate
{
my($self, $logid, $work) = @_;
my $op = $work->{op};
my $num1 = $work->{num1};
my $num2 = $work->{num2};
printf("calculate(%d, %d %d %d)\n", $logid, $num1, $num2, $op);
my $val;
if ($op == tutorial::Operation::ADD) {
$val = $num1 + $num2;
} elsif ($op == tutorial::Operation::SUBTRACT) {
$val = $num1 - $num2;
} elsif ($op == tutorial::Operation::MULTIPLY) {
$val = $num1 * $num2;
} elsif ($op == tutorial::Operation::DIVIDE) {
if ($num2 == 0)
{
my $x = tutorial::InvalidOperation->new();
$x->whatOp($op);
$x->why('Cannot divide by 0');
die $x;
}
$val = $num1 / $num2;
} else {
my $x = tutorial::InvalidOperation->new();
$x->whatOp($op);
$x->why('Invalid operation');
die $x;
}
my $log = shared::SharedStruct->new();