Perl Tutorial

Introduction

All Apache Thrift tutorials require that you have:

  1. The Apache Thrift Compiler and Libraries, see Download and Building from Source for more details.
  2. Generated the tutorial.thrift and shared.thrift files:
    thrift -r --gen perl tutorial.thrift
  3. Followed all prerequisites listed below.

Prerequisites

Client

#

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();

Server

#

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();

Additional Information