1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
#!/usr/bin/env perl
#
# 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 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();
$log->key($logid);
$log->value(int($val));
$self->{log}->{$logid} = $log;
return $val;
}
sub getStruct
{
my($self, $key) = @_;
printf("getStruct(%d)\n", $key);
return $self->{log}->{$key};
}
sub zip
{
my($self) = @_;
print "zip()\n";
}
eval {
my $handler = CalculatorHandler->new();
my $processor = tutorial::CalculatorProcessor->new($handler);
my $serversocket = Thrift::ServerSocket->new(9090);
my $forkingserver = Thrift::ForkingServer->new($processor, $serversocket);
print "Starting the server...\n";
$forkingserver->serve();
print "done.\n";
}; if ($@) {
if ($@ =~ m/TException/ and exists $@->{message}) {
my $message = $@->{message};
my $code = $@->{code};
my $out = $code . ':' . $message;
die $out;
} else {
die $@;
}
}
|