THRIFT-2343 Fix tutotial code and codegen for methods without exceptions
authorJens Geyer <jensg@apache.org>
Tue, 4 Feb 2014 22:56:39 +0000 (23:56 +0100)
committerJens Geyer <jensg@apache.org>
Tue, 4 Feb 2014 22:56:39 +0000 (23:56 +0100)
Patch: Jens Geyer

compiler/cpp/src/generate/t_go_generator.cc
tutorial/go/src/client.go
tutorial/go/src/handler.go
tutorial/go/src/server.go

index 29b1411..6b90cab 100644 (file)
@@ -1717,7 +1717,7 @@ void t_go_generator::generate_service_client(t_service* tservice)
                        indent() << "  return" << endl <<
                        indent() << "}" << endl <<
                        indent() << "if p.SeqId != seqId {" << endl <<
-                       indent() << "  err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, \"ping failed: out of sequence response\")" << endl <<
+                       indent() << "  err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, \"" << (*f_iter)->get_name() << " failed: out of sequence response\")" << endl <<
                        indent() << "  return" << endl <<
                        indent() << "}" << endl <<
                        indent() << result << " := New" << publicize(resultname) << "()" << endl <<
@@ -2351,28 +2351,37 @@ void t_go_generator::generate_process_function(t_service* tservice,
         f_service_ << "args." << publicize(variable_name_to_go_name((*f_iter)->get_name()));
     }
 
-    f_service_ << "); err2 != nil {" << endl <<
-               indent() << "switch v := err2.(type) {" << endl;
-
+    f_service_ << "); err2 != nil {" << endl;
+    
     t_struct* exceptions = tfunction->get_xceptions();
     const vector<t_field*>& x_fields = exceptions->get_members();
-    vector<t_field*>::const_iterator xf_iter;
+       if( ! x_fields.empty()) {
+        f_service_ << indent() << "switch v := err2.(type) {" << endl;
 
-    for (xf_iter = x_fields.begin(); xf_iter != x_fields.end(); ++xf_iter) {
-        f_service_ <<
-                    indent() << "  case *" << type_name((*xf_iter)->get_type()) << ":" << endl <<
-                    indent() << "result." << publicize(variable_name_to_go_name((*xf_iter)->get_name())) << " = v" << endl;
+        vector<t_field*>::const_iterator xf_iter;
+
+        for (xf_iter = x_fields.begin(); xf_iter != x_fields.end(); ++xf_iter) {
+            f_service_ <<
+                        indent() << "  case *" << type_name((*xf_iter)->get_type()) << ":" << endl <<
+                        indent() << "result." << publicize(variable_name_to_go_name((*xf_iter)->get_name())) << " = v" << endl;
+        }
+        
+               f_service_ <<
+                   indent() << "  default:" << endl;
     }
 
     f_service_ <<
-               indent() << "  default:" << endl <<
                indent() << "  x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing " << escape_string(tfunction->get_name()) << ": \" + err.Error())" << endl <<
                indent() << "  oprot.WriteMessageBegin(\"" << escape_string(tfunction->get_name()) << "\", thrift.EXCEPTION, seqId)" << endl <<
                indent() << "  x.Write(oprot)" << endl <<
                indent() << "  oprot.WriteMessageEnd()" << endl <<
                indent() << "  oprot.Flush()" << endl <<
-               indent() << "  return false, err2" << endl <<
-               indent() << "}" << endl;
+               indent() << "  return false, err2" << endl ;
+                          
+    if( ! x_fields.empty()) {
+           f_service_ <<
+                   indent() << "}" << endl;
+    }                     
 
     f_service_ <<
                indent() << "}" << endl <<
index 543d7fb..31376f8 100644 (file)
@@ -20,10 +20,10 @@ package main
  */
 
 import (
+       "crypto/tls"
        "fmt"
        "git.apache.org/thrift.git/lib/go/thrift"
        "tutorial"
-       "crypto/tls"
 )
 
 func handleClient(client *tutorial.CalculatorClient) (err error) {
@@ -37,12 +37,12 @@ func handleClient(client *tutorial.CalculatorClient) (err error) {
        work.Op = tutorial.Operation_DIVIDE
        work.Num1 = 1
        work.Num2 = 0
-       quotient, ouch, err := client.Calculate(1, work)
+       quotient, err := client.Calculate(1, work)
        if err != nil {
                fmt.Println("Error during operation:", err)
                return err
-       } else if ouch != nil {
-               fmt.Println("Invalid operation:", ouch)
+       //} else if ouch != nil {
+       //      fmt.Println("Invalid operation:", ouch)
        } else {
                fmt.Println("Whoa we can divide by 0 with new value:", quotient)
        }
@@ -50,12 +50,12 @@ func handleClient(client *tutorial.CalculatorClient) (err error) {
        work.Op = tutorial.Operation_SUBTRACT
        work.Num1 = 15
        work.Num2 = 10
-       diff, ouch, err := client.Calculate(1, work)
+       diff, err := client.Calculate(1, work)
        if err != nil {
                fmt.Println("Error during operation:", err)
                return err
-       } else if ouch != nil {
-               fmt.Println("Invalid operation:", ouch)
+       //} else if ouch != nil {
+       //      fmt.Println("Invalid operation:", ouch)
        } else {
                fmt.Print("15-10=", diff, "\n")
        }
index 3d4c18c..fb0daef 100644 (file)
@@ -44,7 +44,7 @@ func (p *CalculatorHandler) Add(num1 int32, num2 int32) (retval17 int32, err err
        return num1 + num2, nil
 }
 
-func (p *CalculatorHandler) Calculate(logid int32, w *tutorial.Work) (val int32, ouch *tutorial.InvalidOperation, err error) {
+func (p *CalculatorHandler) Calculate(logid int32, w *tutorial.Work) (val int32, err error) {
        fmt.Print("calculate(", logid, ", {", w.Op, ",", w.Num1, ",", w.Num2, "})\n")
        switch w.Op {
        case tutorial.Operation_ADD:
@@ -58,17 +58,19 @@ func (p *CalculatorHandler) Calculate(logid int32, w *tutorial.Work) (val int32,
                break
        case tutorial.Operation_DIVIDE:
                if w.Num2 == 0 {
-                       ouch = tutorial.NewInvalidOperation()
+                       ouch := tutorial.NewInvalidOperation()
                        ouch.What = int32(w.Op)
                        ouch.Why = "Cannot divide by 0"
+                       err = ouch
                        return
                }
                val = w.Num1 / w.Num2
                break
        default:
-               ouch = tutorial.NewInvalidOperation()
+               ouch := tutorial.NewInvalidOperation()
                ouch.What = int32(w.Op)
                ouch.Why = "Unknown operation"
+               err = ouch
                return
        }
        entry := shared.NewSharedStruct()
@@ -84,7 +86,7 @@ func (p *CalculatorHandler) Calculate(logid int32, w *tutorial.Work) (val int32,
           }
        */
        p.log[k] = entry
-       return val, ouch, err
+       return val, err
 }
 
 func (p *CalculatorHandler) GetStruct(key int32) (*shared.SharedStruct, error) {
index ebcfe5b..e4c4b97 100644 (file)
@@ -20,10 +20,10 @@ package main
  */
 
 import (
+       "crypto/tls"
        "fmt"
        "git.apache.org/thrift.git/lib/go/thrift"
        "tutorial"
-       "crypto/tls"
 )
 
 func runServer(transportFactory thrift.TTransportFactory, protocolFactory thrift.TProtocolFactory, addr string, secure bool) error {