You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by ro...@apache.org on 2013/04/27 23:10:59 UTC

git commit: THRIFT-1906 ocaml: add tutorial example to parallel that for other languages Patch: Chet Murthy

Updated Branches:
  refs/heads/master 1c9563642 -> 9a3a5642b


THRIFT-1906 ocaml: add tutorial example to parallel that for other languages
Patch: Chet Murthy


Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/9a3a5642
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/9a3a5642
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/9a3a5642

Branch: refs/heads/master
Commit: 9a3a5642b867498470f4c722738f1b12c10b970b
Parents: 1c95636
Author: Roger Meier <ro...@apache.org>
Authored: Sat Apr 27 23:09:40 2013 +0200
Committer: Roger Meier <ro...@apache.org>
Committed: Sat Apr 27 23:09:40 2013 +0200

----------------------------------------------------------------------
 tutorial/ocaml/CalcClient.ml |   74 ++++++++++++++++++++++++++++++
 tutorial/ocaml/CalcServer.ml |   89 +++++++++++++++++++++++++++++++++++++
 tutorial/ocaml/README        |   15 ++++++
 tutorial/ocaml/_oasis        |   32 +++++++++++++
 4 files changed, 210 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/thrift/blob/9a3a5642/tutorial/ocaml/CalcClient.ml
----------------------------------------------------------------------
diff --git a/tutorial/ocaml/CalcClient.ml b/tutorial/ocaml/CalcClient.ml
new file mode 100755
index 0000000..5a8467b
--- /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();;

http://git-wip-us.apache.org/repos/asf/thrift/blob/9a3a5642/tutorial/ocaml/CalcServer.ml
----------------------------------------------------------------------
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();;

http://git-wip-us.apache.org/repos/asf/thrift/blob/9a3a5642/tutorial/ocaml/README
----------------------------------------------------------------------
diff --git a/tutorial/ocaml/README b/tutorial/ocaml/README
new file mode 100644
index 0000000..f68e835
--- /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).

http://git-wip-us.apache.org/repos/asf/thrift/blob/9a3a5642/tutorial/ocaml/_oasis
----------------------------------------------------------------------
diff --git a/tutorial/ocaml/_oasis b/tutorial/ocaml/_oasis
new file mode 100644
index 0000000..4cab080
--- /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 <de...@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