You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by je...@apache.org on 2014/11/29 19:08:48 UTC

thrift git commit: THRIFT-2860 Delphi server closes connection on unexpected exceptions Client: Delphi Patch: Jens Geyer

Repository: thrift
Updated Branches:
  refs/heads/master eed6a6d65 -> 406e7956c


THRIFT-2860 Delphi server closes connection on unexpected exceptions
Client: Delphi
Patch: Jens Geyer


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

Branch: refs/heads/master
Commit: 406e7956c1a5ac83b74e12cce52f7159ed708211
Parents: eed6a6d
Author: Jens Geyer <je...@apache.org>
Authored: Sat Nov 29 18:41:07 2014 +0100
Committer: Jens Geyer <je...@apache.org>
Committed: Sat Nov 29 19:05:46 2014 +0100

----------------------------------------------------------------------
 compiler/cpp/src/generate/t_delphi_generator.cc | 72 ++++++++++++--------
 1 file changed, 43 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/thrift/blob/406e7956/compiler/cpp/src/generate/t_delphi_generator.cc
----------------------------------------------------------------------
diff --git a/compiler/cpp/src/generate/t_delphi_generator.cc b/compiler/cpp/src/generate/t_delphi_generator.cc
index 682c18d..b7667b8 100644
--- a/compiler/cpp/src/generate/t_delphi_generator.cc
+++ b/compiler/cpp/src/generate/t_delphi_generator.cc
@@ -2351,6 +2351,7 @@ void t_delphi_generator::generate_process_function(t_service* tservice, t_functi
   if (!tfunction->is_oneway()) {
     indent_impl(s_service_impl) << "msg: Thrift.Protocol.IMessage;" << endl;
     indent_impl(s_service_impl) << "ret: " << result_intfnm << ";" << endl;
+    indent_impl(s_service_impl) << "appx : TApplicationException;" << endl;
   }
 
   indent_down_impl();
@@ -2375,10 +2376,8 @@ void t_delphi_generator::generate_process_function(t_service* tservice, t_functi
     indent_impl(s_service_impl) << "ret := " << result_clsnm << "Impl.Create;" << endl;
   }
 
-  if (events_ || (!tfunction->is_oneway() && xceptions.size() > 0)) {
-    indent_impl(s_service_impl) << "try" << endl;
-    indent_up_impl();
-  }
+  indent_impl(s_service_impl) << "try" << endl;
+  indent_up_impl();
 
   t_struct* arg_struct = tfunction->get_arglist();
   const std::vector<t_field*>& fields = arg_struct->get_members();
@@ -2405,37 +2404,52 @@ void t_delphi_generator::generate_process_function(t_service* tservice, t_functi
                                 << " := " << empty_value((*f_iter)->get_type()) << ";" << endl;
   }
 
-  if (events_ || (!tfunction->is_oneway() && xceptions.size() > 0)) {
-    indent_down_impl();
-    indent_impl(s_service_impl) << "except" << endl;
+  indent_down_impl();
+  indent_impl(s_service_impl) << "except" << endl;
+  indent_up_impl();
+
+  for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
+    indent_impl(s_service_impl) << "on E: " << type_name((*x_iter)->get_type(), true, true)
+                                << " do begin" << endl;
     indent_up_impl();
-    for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
-      indent_impl(s_service_impl) << "on E: " << type_name((*x_iter)->get_type(), true, true)
-                                  << " do" << endl;
-      indent_impl(s_service_impl) << "begin" << endl;
-      indent_up_impl();
-      if (!tfunction->is_oneway()) {
-        string factory_name = normalize_clsnm((*x_iter)->get_type()->get_name(), "", true)
-                              + "Factory";
-        indent_impl(s_service_impl) << "ret." << prop_name(*x_iter) << " := E." << factory_name
-                                    << ";" << endl;
-      }
-      indent_down_impl();
-      indent_impl(s_service_impl) << "end;" << endl;
-    }
-    if (events_) {
-      indent_impl(s_service_impl) << "on E: Exception do" << endl;
-      indent_impl(s_service_impl) << "begin" << endl;
-      indent_up_impl();
-      indent_impl(s_service_impl) << "if events <> nil then events.UnhandledError(E);" << endl;
-      indent_impl(s_service_impl) << "raise; // let it bubble up" << endl;
-      indent_down_impl();
-      indent_impl(s_service_impl) << "end;" << endl;
+    if (!tfunction->is_oneway()) {
+      string factory_name = normalize_clsnm((*x_iter)->get_type()->get_name(), "", true)
+                            + "Factory";
+      indent_impl(s_service_impl) << "ret." << prop_name(*x_iter) << " := E." << factory_name
+                                  << ";" << endl;
     }
     indent_down_impl();
     indent_impl(s_service_impl) << "end;" << endl;
   }
 
+  indent_impl(s_service_impl) << "on E: Exception do begin" << endl;
+  indent_up_impl();
+  indent_impl(s_service_impl) << "if events <> nil then events.UnhandledError(E);" << endl;
+  if (!tfunction->is_oneway()) {
+    indent_impl(s_service_impl) << "appx := TApplicationException.Create( TApplicationException.TExceptionType.InternalError, E.Message);" << endl;
+    indent_impl(s_service_impl) << "try" << endl;
+    indent_up_impl();
+    indent_impl(s_service_impl) << "if events <> nil then events.PreWrite;" << endl;
+    indent_impl(s_service_impl) << "msg := Thrift.Protocol.TMessageImpl.Create('" << tfunction->get_name() << "', TMessageType.Exception, seqid);" << endl;
+    indent_impl(s_service_impl) << "oprot.WriteMessageBegin( msg);" << endl;
+    indent_impl(s_service_impl) << "appx.Write(oprot);" << endl;
+    indent_impl(s_service_impl) << "oprot.WriteMessageEnd();" << endl;
+    indent_impl(s_service_impl) << "oprot.Transport.Flush();" << endl;
+    indent_impl(s_service_impl) << "if events <> nil then events.PostWrite;" << endl;
+    indent_impl(s_service_impl) << "Exit;" << endl;
+    indent_down_impl();
+    indent_impl(s_service_impl) << "finally" << endl;
+    indent_up_impl();
+    indent_impl(s_service_impl) << "appx.Free;" << endl;
+    indent_down_impl();
+    indent_impl(s_service_impl) << "end;" << endl;
+  }
+  indent_down_impl();
+  indent_impl(s_service_impl) << "end;" << endl;
+
+  indent_down_impl();
+  indent_impl(s_service_impl) << "end;" << endl;
+
   if (!tfunction->is_oneway()) {
     if (events_) {
       indent_impl(s_service_impl) << "if events <> nil then events.PreWrite;" << endl;