THRIFT-1906 ocaml: add tutorial example to parallel that for other languages
Patch: Chet Murthy
diff --git a/tutorial/ocaml/CalcServer.ml b/tutorial/ocaml/CalcServer.ml
new file mode 100755
index 0000000..24d7d03
--- /dev/null
+++ b/tutorial/ocaml/CalcServer.ml
@@ -0,0 +1,89 @@
+(*
+ 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.
+*)
+
+open Arg
+open Thrift
+open Tutorial_types
+open Shared_types
+
+exception Die;;
+let sod = function
+    Some v -> v
+  | None -> raise Die;;
+
+class calc_handler =
+object (self)
+  inherit Calculator.iface
+  val log = Hashtbl.create 23
+  method ping  = Printf.printf "ping()\n" ; flush stdout
+  method add a b =
+    Printf.printf"add(%ld,%ld)\n" (sod a) (sod b); flush stdout ;
+    Int32.add (sod a) (sod b)
+  method calculate logid w =
+    let w = sod w in
+      Printf.printf "calculate(%ld,{%ld,%ld,%ld})\n" (sod logid) (Operation.to_i w#grab_op) w#grab_num1 w#grab_num2; flush stdout ;
+    let rv =
+      match w#grab_op with
+	  Operation.ADD ->
+	    Int32.add w#grab_num1 w#grab_num2
+	| Operation.SUBTRACT ->
+	    Int32.sub w#grab_num1 w#grab_num2
+	| Operation.MULTIPLY ->
+	    Int32.mul w#grab_num1 w#grab_num2
+	| Operation.DIVIDE ->
+	    if w#grab_num2 = Int32.zero then
+	      let io = new invalidOperation in
+		io#set_what (Operation.to_i w#grab_op) ;
+		io#set_why "Cannot divide by 0" ;
+		raise (InvalidOperation io)
+	    else
+	      Int32.div w#grab_num1 w#grab_num2 in
+
+    let ss = new sharedStruct in
+      ss#set_key (sod logid) ;
+    let buffer = Int32.to_string rv in
+      ss#set_value buffer ;
+      Hashtbl.add log (sod logid) ss ;
+      rv
+
+  method zip =
+    Printf.printf "zip()\n"; flush stdout
+
+  method getStruct logid =
+    Printf.printf "getStruct(%ld)\n" (sod logid) ; flush stdout ;
+    Hashtbl.find log (sod logid)
+
+end
+
+let doserver () =
+  let h = new calc_handler in
+  let proc = new Calculator.processor h in
+  let port = 9090 in
+  let pf = new TBinaryProtocol.factory in
+  let server = new TThreadedServer.t
+		 proc
+		 (new TServerSocket.t port)
+		 (new Transport.factory)
+		 pf
+		 pf
+  in
+    server#serve
+;;
+
+doserver();;