[ 
https://issues.apache.org/jira/browse/THRIFT-4285?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16318804#comment-16318804
 ] 

ASF GitHub Bot commented on THRIFT-4285:
----------------------------------------

Github user johnboiles commented on a diff in the pull request:

    https://github.com/apache/thrift/pull/1382#discussion_r160477076
  
    --- Diff: compiler/cpp/src/thrift/generate/t_go_generator.cc ---
    @@ -1953,177 +1960,75 @@ void 
t_go_generator::generate_service_client(t_service* tservice) {
         f_types_ << indent() << "func (p *" << serviceName << "Client) "
                    << function_signature_if(*f_iter, "", true) << " {" << endl;
         indent_up();
    -    /*
    -    f_types_ <<
    -      indent() << "p.SeqId += 1" << endl;
    -    if (!(*f_iter)->is_oneway()) {
    -      f_types_ <<
    -        indent() << "d := defer.Deferred()" << endl <<
    -        indent() << "p.Reqs[p.SeqId] = d" << endl;
    -    }
    -    */
    -    f_types_ << indent() << "if err = p.send" << funname << "(";
    -    bool first = true;
    -
    -    for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
    -      if (first) {
    -        first = false;
    -      } else {
    -        f_types_ << ", ";
    -      }
     
    -      f_types_ << variable_name_to_go_name((*fld_iter)->get_name());
    -    }
    -
    -    f_types_ << "); err != nil { return }" << endl;
    -
    -    if (!(*f_iter)->is_oneway()) {
    -      f_types_ << indent() << "return p.recv" << funname << "()" << endl;
    -    } else {
    -      f_types_ << indent() << "return" << endl;
    -    }
    -
    -    indent_down();
    -    f_types_ << indent() << "}" << endl << endl;
    -    f_types_ << indent() << "func (p *" << serviceName << "Client) send"
    -               << function_signature(*f_iter) << "(err error) {" << endl;
    -    indent_up();
    -    std::string argsname = publicize((*f_iter)->get_name() + "_args", 
true);
    -    // Serialize the request header
    -    f_types_ << indent() << "oprot := p.OutputProtocol" << endl;
    -    f_types_ << indent() << "if oprot == nil {" << endl;
    -    f_types_ << indent() << "  oprot = 
p.ProtocolFactory.GetProtocol(p.Transport)" << endl;
    -    f_types_ << indent() << "  p.OutputProtocol = oprot" << endl;
    -    f_types_ << indent() << "}" << endl;
    -    f_types_ << indent() << "p.SeqId++" << endl;
    -    f_types_ << indent() << "if err = oprot.WriteMessageBegin(\"" << 
(*f_iter)->get_name()
    -               << "\", " << ((*f_iter)->is_oneway() ? "thrift.ONEWAY" : 
"thrift.CALL")
    -               << ", p.SeqId); err != nil {" << endl;
    -    indent_up();
    -    f_types_ << indent() << "  return" << endl;
    -    indent_down();
    -    f_types_ << indent() << "}" << endl;
    -    f_types_ << indent() << "args := " << argsname << "{" << endl;
    +    std::string method = (*f_iter)->get_name();
    +    std::string argsType = publicize(method + "_args", true);
    +    std::string argsName = tmp("_args");
    +    f_types_ << indent() << "var " << argsName << " " << argsType << endl;
     
         for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
    -      f_types_ << indent() << publicize((*fld_iter)->get_name()) << " : "
    -                 << variable_name_to_go_name((*fld_iter)->get_name()) << 
"," << endl;
    +      f_types_ << indent() << argsName << "." << 
publicize((*fld_iter)->get_name())
    +               << " = " << 
variable_name_to_go_name((*fld_iter)->get_name()) << endl;
         }
    -    f_types_ << indent() << "}" << endl;
    -
    -    // Write to the stream
    -    f_types_ << indent() << "if err = args." << write_method_name_ << 
"(oprot); err != nil {" << endl;
    -    indent_up();
    -    f_types_ << indent() << "  return" << endl;
    -    indent_down();
    -    f_types_ << indent() << "}" << endl;
    -    f_types_ << indent() << "if err = oprot.WriteMessageEnd(); err != nil 
{" << endl;
    -    indent_up();
    -    f_types_ << indent() << "  return" << endl;
    -    indent_down();
    -    f_types_ << indent() << "}" << endl;
    -    f_types_ << indent() << "return oprot.Flush()" << endl;
    -    indent_down();
    -    f_types_ << indent() << "}" << endl << endl;
     
         if (!(*f_iter)->is_oneway()) {
    -      std::string resultname = publicize((*f_iter)->get_name() + 
"_result", true);
    -      // Open function
    -      f_types_ << endl << indent() << "func (p *" << serviceName << 
"Client) recv"
    -                 << publicize((*f_iter)->get_name()) << "() (";
    +      std::string resultName = tmp("_result");
    +      std::string resultType = publicize(method + "_result", true);
    +      f_types_ << indent() << "var " << resultName << " " << resultType << 
endl;
    +      f_types_ << indent() << "if err = p.c.Call(ctx, \""
    --- End diff --
    
    When using one of the now-deprecated initializers, this line will cause a 
panic, since `p.c` is nil. The deprecated initializers create the `TClient` at 
`p.BaseMyServiceClient.c`


> Pull generated send/recv into library to allow behaviour to be customised
> -------------------------------------------------------------------------
>
>                 Key: THRIFT-4285
>                 URL: https://issues.apache.org/jira/browse/THRIFT-4285
>             Project: Thrift
>          Issue Type: Improvement
>          Components: Go - Compiler, Go - Library
>            Reporter: Chris Bannister
>            Assignee: Can Celasun
>             Fix For: 0.11.0
>
>         Attachments: 0001-go-pull-generated-send-recv-into-lib-v6.patch, 
> 0001-go-pull-generated-send-recv-into-lib-v7.patch
>
>
> Currently it is difficult to change how thrift writes messages onto the 
> transport because they are in the generated code. Instead the generated 
> send/recv methods should be in the library. This will greatly simplify the 
> client code and remove many duplicate methods whilst allowing users more 
> flexibility to implement connection pools and other features such as THeader.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to