From 5c854619950879aefdb14451357a1dee65bb08e7 Mon Sep 17 00:00:00 2001 From: Roger Meier Date: Mon, 9 Apr 2012 16:31:42 +0000 Subject: [PATCH] THRIFT-1555 Delphi version of the tutorial code Patch: Jens Geyer git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1311313 13f79535-47bb-0310-9956-ffa450edef68 --- tutorial/delphi/DelphiClient/DelphiClient.dpr | 114 ++++++++++++ .../delphi/DelphiClient/DelphiClient.dproj | 119 ++++++++++++ tutorial/delphi/DelphiServer/DelphiServer.dpr | 173 ++++++++++++++++++ .../delphi/DelphiServer/DelphiServer.dproj | 118 ++++++++++++ tutorial/delphi/Tutorial.groupproj | 48 +++++ 5 files changed, 572 insertions(+) create mode 100644 tutorial/delphi/DelphiClient/DelphiClient.dpr create mode 100644 tutorial/delphi/DelphiClient/DelphiClient.dproj create mode 100644 tutorial/delphi/DelphiServer/DelphiServer.dpr create mode 100644 tutorial/delphi/DelphiServer/DelphiServer.dproj create mode 100644 tutorial/delphi/Tutorial.groupproj diff --git a/tutorial/delphi/DelphiClient/DelphiClient.dpr b/tutorial/delphi/DelphiClient/DelphiClient.dpr new file mode 100644 index 00000000..0f380b0a --- /dev/null +++ b/tutorial/delphi/DelphiClient/DelphiClient.dpr @@ -0,0 +1,114 @@ +(* + * 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. + *) +program DelphiClient; + +{$APPTYPE CONSOLE} +{$D 'Copyright (c) 2012 The Apache Software Foundation'} + +uses + SysUtils, + Generics.Collections, + Thrift in '..\..\..\lib\delphi\src\Thrift.pas', + Thrift.Collections in '..\..\..\lib\delphi\src\Thrift.Collections.pas', + Thrift.Console in '..\..\..\lib\delphi\src\Thrift.Console.pas', + Thrift.Utils in '..\..\..\lib\delphi\src\Thrift.Utils.pas', + Thrift.Stream in '..\..\..\lib\delphi\src\Thrift.Stream.pas', + Thrift.Protocol in '..\..\..\lib\delphi\src\Thrift.Protocol.pas', + Thrift.Server in '..\..\..\lib\delphi\src\Thrift.Server.pas', + Thrift.Transport in '..\..\..\lib\delphi\src\Thrift.Transport.pas', + Shared in '..\..\gen-delphi\Shared.pas', + Tutorial in '..\..\gen-delphi\Tutorial.pas'; + + +type + DelphiTutorialClient = class + public + class procedure Main; + end; + + +//--- DelphiTutorialClient --------------------------------------- + + +class procedure DelphiTutorialClient.Main; +var transport : ITransport; + protocol : IProtocol; + client : TCalculator.Iface; + work : IWork; + sum, quotient, diff : Integer; + log : ISharedStruct; +begin + try + transport := TSocketImpl.Create( 'localhost', 9090); + protocol := TBinaryProtocolImpl.Create( transport); + client := TCalculator.TClient.Create( protocol); + + transport.Open; + + client.ping; + Console.WriteLine('ping()'); + + sum := client.add( 1, 1); + Console.WriteLine( Format( '1+1=%d', [sum])); + + work := TWorkImpl.Create; + + work.Op := TOperation.DIVIDE; + work.Num1 := 1; + work.Num2 := 0; + try + quotient := client.calculate(1, work); + Console.WriteLine( 'Whoa we can divide by 0'); + Console.WriteLine( Format('1/0=%d',[quotient])); + except + on io: TInvalidOperation + do Console.WriteLine( 'Invalid operation: ' + io.Why); + end; + + work.Op := TOperation.SUBTRACT; + work.Num1 := 15; + work.Num2 := 10; + try + diff := client.calculate( 1, work); + Console.WriteLine( Format('15-10=%d', [diff])); + except + on io: TInvalidOperation + do Console.WriteLine( 'Invalid operation: ' + io.Why); + end; + + log := client.getStruct(1); + Console.WriteLine( Format( 'Check log: %s', [log.Value])); + + transport.Close(); + + except + on e : Exception + do Console.WriteLine( e.ClassName+': '+e.Message); + end; +end; + + +begin + try + DelphiTutorialClient.Main; + except + on E: Exception do + Writeln(E.ClassName, ': ', E.Message); + end; +end. diff --git a/tutorial/delphi/DelphiClient/DelphiClient.dproj b/tutorial/delphi/DelphiClient/DelphiClient.dproj new file mode 100644 index 00000000..ab0a1c1f --- /dev/null +++ b/tutorial/delphi/DelphiClient/DelphiClient.dproj @@ -0,0 +1,119 @@ + + + {2B8FB3A1-2F9E-4883-8C53-0F56220B34F6} + DelphiClient.dpr + 12.3 + True + Debug + Win32 + Console + None + DCC32 + + + true + + + true + Base + true + + + true + Base + true + + + ..\..\..\lib\delphi\src;$(DCC_UnitSearchPath) + 00400000 + .\dcu\$(Config)\$(Platform) + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;$(DCC_UnitAlias) + ..\bin\$(Config)\$(Platform) + false + false + false + false + false + + + DEBUG;$(DCC_Define) + false + true + + + false + RELEASE;$(DCC_Define) + 0 + false + + + + MainSource + + + + + + + + + + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + + + Delphi.Personality.12 + + + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + Thrift Tutorial + 1.0.0.0 + DelphiClient + Copyright © 2012 The Apache Software Foundation + + DelphiClient.exe + Thrift + 1.0.0.0 + + + + DelphiClient.dpr + + + + True + + + 12 + + diff --git a/tutorial/delphi/DelphiServer/DelphiServer.dpr b/tutorial/delphi/DelphiServer/DelphiServer.dpr new file mode 100644 index 00000000..9d54a2e6 --- /dev/null +++ b/tutorial/delphi/DelphiServer/DelphiServer.dpr @@ -0,0 +1,173 @@ +(* + * 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. + *) +program DelphiServer; + +{$APPTYPE CONSOLE} +{$D 'Copyright (c) 2012 The Apache Software Foundation'} + +{$Q+} // throws exceptions on numeric overflows + +uses + SysUtils, + Generics.Collections, + Thrift in '..\..\..\lib\delphi\src\Thrift.pas', + Thrift.Collections in '..\..\..\lib\delphi\src\Thrift.Collections.pas', + Thrift.Console in '..\..\..\lib\delphi\src\Thrift.Console.pas', + Thrift.Utils in '..\..\..\lib\delphi\src\Thrift.Utils.pas', + Thrift.Stream in '..\..\..\lib\delphi\src\Thrift.Stream.pas', + Thrift.Protocol in '..\..\..\lib\delphi\src\Thrift.Protocol.pas', + Thrift.Server in '..\..\..\lib\delphi\src\Thrift.Server.pas', + Thrift.Transport in '..\..\..\lib\delphi\src\Thrift.Transport.pas', + Shared in '..\..\gen-delphi\Shared.pas', + Tutorial in '..\..\gen-delphi\Tutorial.pas'; + + +type + TCalculatorHandler = class( TInterfacedObject, TCalculator.Iface) + protected + FLog : TDictionary< Integer, ISharedStruct>; + + // TSharedService.Iface + function getStruct(key: Integer): ISharedStruct; + + // TCalculator.Iface + procedure ping(); + function add(num1: Integer; num2: Integer): Integer; + function calculate(logid: Integer; const w: IWork): Integer; + procedure zip(); + + public + constructor Create; + destructor Destroy; override; + + end; + + DelphiTutorialServer = class + public + class procedure Main; + end; + + +//--- TCalculatorHandler --------------------------------------------------- + + +constructor TCalculatorHandler.Create; +begin + inherited Create; + FLog := TDictionary< Integer, ISharedStruct>.Create(); +end; + + +destructor TCalculatorHandler.Destroy; +begin + try + FreeAndNil( FLog); + finally + inherited Destroy; + end; +end; + + +procedure TCalculatorHandler.ping; +begin + Console.WriteLine( 'ping()'); +end; + + +function TCalculatorHandler.add(num1: Integer; num2: Integer): Integer; +begin + Console.WriteLine( Format( 'add( %d, %d)', [num1, num2])); + result := num1 + num2; +end; + + +function TCalculatorHandler.calculate(logid: Integer; const w: IWork): Integer; +var entry : ISharedStruct; +begin + try + Console.WriteLine( Format('calculate( %d, [%d,%d,%d])', [logid, Ord(w.Op), w.Num1, w.Num2])); + + case w.Op of + TOperation.ADD : result := w.Num1 + w.Num2; + TOperation.SUBTRACT : result := w.Num1 - w.Num2; + TOperation.MULTIPLY : result := w.Num1 * w.Num2; + TOperation.DIVIDE : result := Round( w.Num1 / w.Num2); + else + raise TInvalidOperation.Create( Ord(w.Op), 'Unknown operation'); + end; + + except + on e:Thrift.TException do raise; // let Thrift Exceptions pass through + on e:Exception do raise TInvalidOperation.Create( Ord(w.Op), e.Message); // repackage all other + end; + + entry := TSharedStructImpl.Create; + entry.Key := logid; + entry.Value := IntToStr( result); + FLog.AddOrSetValue( logid, entry); +end; + + +function TCalculatorHandler.getStruct(key: Integer): ISharedStruct; +begin + Console.WriteLine( Format( 'getStruct(%d)', [key])); + result := FLog[key]; +end; + + +procedure TCalculatorHandler.zip; +begin + Console.WriteLine( 'zip()'); +end; + + +//--- DelphiTutorialServer ---------------------------------------------------------------------- + + +class procedure DelphiTutorialServer.Main; +var handler : TCalculator.Iface; + processor : IProcessor; + transport : IServerTransport; + server : IServer; +begin + try + handler := TCalculatorHandler.Create; + processor := TCalculator.TProcessorImpl.Create( handler); + transport := TServerSocketImpl.Create( 9090); + server := TSimpleServer.Create( processor, transport); + + Console.WriteLine( 'Starting the server...'); + server.Serve(); + + except + on e: Exception do Console.WriteLine( e.Message); + end; + + Console.WriteLine('done.'); +end; + + +begin + try + DelphiTutorialServer.Main; + except + on E: Exception do + Writeln(E.ClassName, ': ', E.Message); + end; +end. diff --git a/tutorial/delphi/DelphiServer/DelphiServer.dproj b/tutorial/delphi/DelphiServer/DelphiServer.dproj new file mode 100644 index 00000000..c5071a3f --- /dev/null +++ b/tutorial/delphi/DelphiServer/DelphiServer.dproj @@ -0,0 +1,118 @@ + + + {2B8FB3A1-2F9E-4883-8C53-0F56220B34F6} + DelphiServer.dpr + 12.3 + True + Debug + Win32 + Console + None + DCC32 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + .\dcu\$(Config)\$(Platform) + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;$(DCC_UnitAlias) + ..\bin\$(Config)\$(Platform) + false + false + false + false + false + + + DEBUG;$(DCC_Define) + false + true + + + false + RELEASE;$(DCC_Define) + 0 + false + + + + MainSource + + + + + + + + + + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + + + Delphi.Personality.12 + + + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + Thrift Tutorial + 1.0.0.0 + DelphiServer + Copyright © 2012 The Apache Software Foundation + + DelphiServer.exe + Thrift + 1.0.0.0 + + + + DelphiServer.dpr + + + + True + + + 12 + + diff --git a/tutorial/delphi/Tutorial.groupproj b/tutorial/delphi/Tutorial.groupproj new file mode 100644 index 00000000..486e6127 --- /dev/null +++ b/tutorial/delphi/Tutorial.groupproj @@ -0,0 +1,48 @@ + + + {3D042C7F-3EF2-4574-8304-AB7FB79F814C} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- 2.17.1