summaryrefslogtreecommitdiff
path: root/tutorial/ocaml
diff options
context:
space:
mode:
authorRoger Meier <roger@apache.org>2013-04-27 23:09:40 +0200
committerRoger Meier <roger@apache.org>2013-04-27 23:09:40 +0200
commit9a3a5642b867498470f4c722738f1b12c10b970b (patch)
tree1a6934a143d9d6e1c24a275955e8d27b4324d8b0 /tutorial/ocaml
parent1c9563642973a2b0af91e150383745c540c5765a (diff)
downloadthrift-9a3a5642b867498470f4c722738f1b12c10b970b.tar.gz
THRIFT-1906 ocaml: add tutorial example to parallel that for other languages
Patch: Chet Murthy
Diffstat (limited to 'tutorial/ocaml')
-rwxr-xr-xtutorial/ocaml/CalcClient.ml74
-rwxr-xr-xtutorial/ocaml/CalcServer.ml89
-rw-r--r--tutorial/ocaml/README15
-rw-r--r--tutorial/ocaml/_oasis32
4 files changed, 210 insertions, 0 deletions
diff --git a/tutorial/ocaml/CalcClient.ml b/tutorial/ocaml/CalcClient.ml
new file mode 100755
index 000000000..5a8467be2
--- /dev/null
+++ b/tutorial/ocaml/CalcClient.ml
@@ -0,0 +1,74 @@
+(*
+ 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;;
+
+type connection = {
+ trans : Transport.t ;
+ proto : Thrift.Protocol.t;
+ calc : Calculator.client ;
+}
+
+let connect ~host port =
+ let tx = new TSocket.t host port in
+ let proto = new TBinaryProtocol.t tx in
+ let calc = new Calculator.client proto proto in
+ tx#opn;
+ { trans = tx ; proto = proto; calc = calc }
+;;
+
+let doclient () =
+ let cli = connect ~host:"127.0.0.1" 9090 in
+ try
+ cli.calc#ping ;
+ Printf.printf "ping()\n" ; flush stdout ;
+ (let sum = cli.calc#add (Int32.of_int 1) (Int32.of_int 1) in
+ Printf.printf "1+1=%ld\n" sum ;
+ flush stdout) ;
+ (let w = new work in
+ w#set_op Operation.DIVIDE ;
+ w#set_num1 (Int32.of_int 1) ;
+ w#set_num2 (Int32.of_int 0) ;
+ try
+ let quotient = cli.calc#calculate (Int32.of_int 1) w in
+ Printf.printf "Whoa? We can divide by zero!\n" ; flush stdout
+ with InvalidOperation io ->
+ Printf.printf "InvalidOperation: %s\n" io#grab_why ; flush stdout) ;
+ (let w = new work in
+ w#set_op Operation.SUBTRACT ;
+ w#set_num1 (Int32.of_int 15) ;
+ w#set_num2 (Int32.of_int 10) ;
+ let diff = cli.calc#calculate (Int32.of_int 1) w in
+ Printf.printf "15-10=%ld\n" diff ; flush stdout) ;
+ (let ss = cli.calc#getStruct (Int32.of_int 1) in
+ Printf.printf "Check log: %s\n" ss#grab_value ; flush stdout) ;
+ cli.trans#close
+ with Transport.E (_,what) ->
+ Printf.printf "ERROR: %s\n" what ; flush stdout
+;;
+
+doclient();;
diff --git a/tutorial/ocaml/CalcServer.ml b/tutorial/ocaml/CalcServer.ml
new file mode 100755
index 000000000..24d7d0364
--- /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();;
diff --git a/tutorial/ocaml/README b/tutorial/ocaml/README
new file mode 100644
index 000000000..f68e83525
--- /dev/null
+++ b/tutorial/ocaml/README
@@ -0,0 +1,15 @@
+
+This is the ocaml tutorial example. It assumes that you've already
+built and installed the thrift ocaml runtime libraries in lib/ocaml.
+
+To compile this, you will need to generate the Thrift sources for
+ocaml in this directory (due to limitations in the OASIS build-tool):
+
+ % thrift -r --gen ocaml ../tutorial.thrift
+ % oasis setup
+ % make
+
+This will produce two executables Calc{Server,Client}.<type> where
+<type> is one of "byte" or "native", depending on your ocaml
+installation. Just run the server in the background, then the client
+(as you would do for the C++ example).
diff --git a/tutorial/ocaml/_oasis b/tutorial/ocaml/_oasis
new file mode 100644
index 000000000..4cab08063
--- /dev/null
+++ b/tutorial/ocaml/_oasis
@@ -0,0 +1,32 @@
+Name: tutorial
+Version: 1.0
+OASISFormat: 0.3
+Synopsis: OCaml Tutorial example
+Authors: Apache Thrift Developers <dev@thrift.apache.org>
+License: Apache-2.0
+Homepage: http://thrift.apache.org
+BuildTools: ocamlbuild
+Plugins: META (0.3),
+ DevFiles (0.3)
+
+Library tutorial_thrift
+ Path: gen-ocaml
+ FindlibName: tutorial_thrift
+ buildTools: ocamlbuild
+ BuildDepends: threads,thrift
+ Modules: Calculator,Shared_consts,Tutorial_consts,SharedService,Shared_types,Tutorial_types
+ XMETARequires: threads
+
+Executable CalcClient
+ Path: .
+ MainIs: CalcClient.ml
+ Build$: true
+ CompiledObject: best
+ BuildDepends: thrift, tutorial_thrift, threads
+
+Executable CalcServer
+ Path: .
+ MainIs: CalcServer.ml
+ Build$: true
+ CompiledObject: best
+ BuildDepends: thrift, tutorial_thrift, threads