diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 18:45:59 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 18:45:59 +0000 |
commit | 19fcec84d8d7d21e796c7624e521b60d28ee21ed (patch) | |
tree | 42d26aa27d1e3f7c0b8bd3fd14e7d7082f5008dc /src/jaegertracing/thrift/tutorial/ocaml | |
parent | Initial commit. (diff) | |
download | ceph-upstream/16.2.11+ds.tar.xz ceph-upstream/16.2.11+ds.zip |
Adding upstream version 16.2.11+ds.upstream/16.2.11+dsupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rwxr-xr-x | src/jaegertracing/thrift/tutorial/ocaml/CalcClient.ml | 74 | ||||
-rwxr-xr-x | src/jaegertracing/thrift/tutorial/ocaml/CalcServer.ml | 89 | ||||
-rw-r--r-- | src/jaegertracing/thrift/tutorial/ocaml/README.md | 15 | ||||
-rw-r--r-- | src/jaegertracing/thrift/tutorial/ocaml/_oasis | 32 |
4 files changed, 210 insertions, 0 deletions
diff --git a/src/jaegertracing/thrift/tutorial/ocaml/CalcClient.ml b/src/jaegertracing/thrift/tutorial/ocaml/CalcClient.ml new file mode 100755 index 000000000..5a8467be2 --- /dev/null +++ b/src/jaegertracing/thrift/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/src/jaegertracing/thrift/tutorial/ocaml/CalcServer.ml b/src/jaegertracing/thrift/tutorial/ocaml/CalcServer.ml new file mode 100755 index 000000000..b5facb79b --- /dev/null +++ b/src/jaegertracing/thrift/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_whatOp (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/src/jaegertracing/thrift/tutorial/ocaml/README.md b/src/jaegertracing/thrift/tutorial/ocaml/README.md new file mode 100644 index 000000000..f68e83525 --- /dev/null +++ b/src/jaegertracing/thrift/tutorial/ocaml/README.md @@ -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/src/jaegertracing/thrift/tutorial/ocaml/_oasis b/src/jaegertracing/thrift/tutorial/ocaml/_oasis new file mode 100644 index 000000000..4a4f337b3 --- /dev/null +++ b/src/jaegertracing/thrift/tutorial/ocaml/_oasis @@ -0,0 +1,32 @@ +Name: tutorial +Version: 0.13.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 |