From aff9f8e3cf6e672066d8bc5db8d1970f72daba37 Mon Sep 17 00:00:00 2001 From: Mark Slee Date: Thu, 7 Sep 2006 21:18:27 +0000 Subject: [PATCH] Thrift: generate python dictionaries and STL maps for server side process function lookups Reviewed By: aditya git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@664793 13f79535-47bb-0310-9956-ffa450edef68 --- compiler/cpp/src/generate/t_cpp_generator.cc | 65 +++++++++++++++----- compiler/cpp/src/generate/t_py_generator.cc | 21 ++++++- 2 files changed, 68 insertions(+), 18 deletions(-) diff --git a/compiler/cpp/src/generate/t_cpp_generator.cc b/compiler/cpp/src/generate/t_cpp_generator.cc index 56980e42..ce93926b 100644 --- a/compiler/cpp/src/generate/t_cpp_generator.cc +++ b/compiler/cpp/src/generate/t_cpp_generator.cc @@ -835,20 +835,7 @@ void t_cpp_generator::generate_service_server(t_service* tservice) { // Generate the header portion f_header_ << "class " << service_name_ << "Server : " << - "public facebook::thrift::TProcessor {" << endl << - " public: " << endl; - indent_up(); - f_header_ << - indent() << - service_name_ << "Server(boost::shared_ptr<" << service_name_ << "If> iface, boost::shared_ptr prot) : " << - "_iface(iface), _iprot(prot), _oprot(prot) {}" << endl << - indent() << - service_name_ << "Server(boost::shared_ptr<" << service_name_ << "If> iface, boost::shared_ptr iprot, boost::shared_ptr oprot) : " << - "_iface(iface), _iprot(iprot), _oprot(oprot) {}" << endl << - indent() << "bool process(boost::shared_ptr _itrans, " << - "boost::shared_ptr _otrans);" << endl << - indent() << "virtual ~" << service_name_ << "Server() {}" << endl; - indent_down(); + "public facebook::thrift::TProcessor {" << endl; // Protected data members f_header_ << @@ -857,7 +844,8 @@ void t_cpp_generator::generate_service_server(t_service* tservice) { f_header_ << indent() << "boost::shared_ptr<" << service_name_ << "If> _iface;" << endl << indent() << "boost::shared_ptr _iprot;" << endl << - indent() << "boost::shared_ptr _oprot;" << endl; + indent() << "boost::shared_ptr _oprot;" << endl << + indent() << "std::map, boost::shared_ptr)> _processMap;" << endl; indent_down(); // Process function declarations @@ -870,9 +858,40 @@ void t_cpp_generator::generate_service_server(t_service* tservice) { "(int32_t seqid, boost::shared_ptr _itrans, boost::shared_ptr _otrans);" << endl; } indent_down(); + + indent_up(); + string declare_map = ""; + indent_up(); + for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { + declare_map += indent(); + declare_map += "_processMap[\""; + declare_map += (*f_iter)->get_name(); + declare_map += "\"] = &"; + declare_map += service_name_; + declare_map += "Server::process_"; + declare_map += (*f_iter)->get_name(); + declare_map += ";\n"; + } + indent_down(); + + f_header_ << + " public: " << endl << + indent() << service_name_ << "Server(boost::shared_ptr<" << service_name_ << "If> iface, boost::shared_ptr prot) : " << + "_iface(iface), _iprot(prot), _oprot(prot) {" << endl << + declare_map << + indent() << "}" << endl << + indent() << service_name_ << "Server(boost::shared_ptr<" << service_name_ << "If> iface, boost::shared_ptr iprot, boost::shared_ptr oprot) : " << + "_iface(iface), _iprot(iprot), _oprot(oprot) {" << endl << + declare_map << + indent() << "}" << endl << + endl << + indent() << "bool process(boost::shared_ptr _itrans, boost::shared_ptr _otrans);" << endl << + indent() << "virtual ~" << service_name_ << "Server() {}" << endl; + indent_down(); f_header_ << "};" << endl << endl; + // Generate the server implementation f_service_ << "bool " << service_name_ << "Server::" << @@ -891,7 +910,19 @@ void t_cpp_generator::generate_service_server(t_service* tservice) { indent() << " throw facebook::thrift::Exception(\"Unexpected message type\");" << endl << indent() << "}" << endl << endl; - + + // HOT: member function pointer map + f_service_ << + indent() << "std::map, boost::shared_ptr)>::iterator pfn;" << endl << + indent() << "pfn = _processMap.find(fname);" << endl << + indent() << "if (pfn == _processMap.end()) {" << endl << + indent() << " throw facebook::thrift::Exception(\"Unknown function name: '\"+fname+\"'\");" << endl << + indent() << "} else {" << endl << + indent() << " (this->*(pfn->second))(seqid, itrans, otrans);" << endl << + indent() << "}" << endl; + + // DEPRECATED: if else if bullshit + /* bool first = true; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { if (!first) { @@ -917,6 +948,7 @@ void t_cpp_generator::generate_service_server(t_service* tservice) { indent_down(); indent(f_service_) << "}" << endl; + */ // Read end of args field, the T_STOP, and the struct close f_service_ << @@ -931,6 +963,7 @@ void t_cpp_generator::generate_service_server(t_service* tservice) { for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { generate_process_function(tservice, *f_iter); } + } /** diff --git a/compiler/cpp/src/generate/t_py_generator.cc b/compiler/cpp/src/generate/t_py_generator.cc index 522ce381..a8f66ad5 100644 --- a/compiler/cpp/src/generate/t_py_generator.cc +++ b/compiler/cpp/src/generate/t_py_generator.cc @@ -583,7 +583,15 @@ void t_py_generator::generate_service_server(t_service* tservice) { indent() << "if oprot == None:" << endl << indent() << " self.__oprot = iprot" << endl << indent() << "else:" << endl << - indent() << " self.__oprot = oprot" << endl; + indent() << " self.__oprot = oprot" << endl << + indent() << "self.__processMap = {" << endl; + for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { + f_service_ << + indent() << " \"" << (*f_iter)->get_name() << "\" : Server.process_" << (*f_iter)->get_name() << "," << endl; + } + f_service_ << + indent() << "}" << endl; + indent_down(); f_service_ << endl; @@ -597,6 +605,14 @@ void t_py_generator::generate_service_server(t_service* tservice) { // TODO(mcslee): validate message + // HOT: dictionary lookup + f_service_ << + indent() << "if name not in self.__processMap:" << endl << + indent() << " print 'Unknown function %s' % (name)" << endl << + indent() << "else:" << endl << + indent() << " self.__processMap[name](self, seqid, itrans, otrans)" << endl; + // DEPRECATED: if else if bullshit + /* bool first = true; for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { if (!first) { @@ -616,7 +632,8 @@ void t_py_generator::generate_service_server(t_service* tservice) { indent() << "else:" << endl << indent() << " print 'Unknown function %s' % (name)" << endl; f_service_ << endl; - + */ + // Read end of args field, the T_STOP, and the struct close f_service_ << indent() << "return True" << endl; -- 2.17.1