private NameValueCollection DescribeSingleProc(string dadName, string procName) { NameValueCollection procParams = _opc.GetParamsFromCache(dadName, procName); if (procParams.Count == 0) { logger.Debug("Procedure metadata not in cache, looking it up from database..."); OracleObjectInfo ooi = ResolveName(procName); if (_lastError != "") { return(procParams); } procParams = GetProcParams(ooi.SchemaName, ooi.PackageName, ooi.ObjectName); if (_lastError != "") { return(procParams); } _opc.SetParamsInCache(dadName, procName, procParams); } else { logger.Debug("Found procedure metadata in cache."); } return(procParams); }
public bool GenerateWsdl(string serverName, string moduleName, string dadName, string procName) { OracleObjectInfo ooi = ResolveName(procName); List <string> functionList = new List <string>(); string serviceName = ""; if (ooi.PackageName.Length > 0 && ooi.ObjectName.Length == 0) { // get all the functions in the package, and get their parameters functionList = GetPackageFunctions(ooi.SchemaName, ooi.PackageName); serviceName = StringUtil.PrettyStr(ooi.PackageName); } else { functionList.Add(ooi.ObjectName); serviceName = StringUtil.PrettyStr(procName) + "Service"; } NameValueCollection procParams = null; StringBuilder sb = new StringBuilder(); sb.Append("<?xml version='1.0' encoding='utf-8'?>"); sb.AppendFormat("<wsdl:definitions xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/' xmlns:mime='http://schemas.xmlsoap.org/wsdl/mime/' xmlns:tns='{0}' xmlns:s='http://www.w3.org/2001/XMLSchema' xmlns:soap12='http://schemas.xmlsoap.org/wsdl/soap12/' xmlns:http='http://schemas.xmlsoap.org/wsdl/http/' targetNamespace='{0}' xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' >", _dadConfig.SoapTargetNamespace); sb.Append("<wsdl:types>"); sb.AppendFormat("<s:schema elementFormDefault='qualified' targetNamespace='{0}'>", _dadConfig.SoapTargetNamespace); foreach (string functionName in functionList) { string prettyProcName = StringUtil.PrettyStr(functionName); procParams = _opc.GetParamsFromCache(dadName, ooi.PackageName + "." + functionName); if (procParams.Count == 0) { procParams = GetProcParams(ooi.SchemaName, ooi.PackageName, functionName); _opc.SetParamsInCache(dadName, ooi.PackageName + "." + functionName, procParams); } sb.AppendFormat("<s:element name='{0}'>", prettyProcName); sb.Append("<s:complexType>"); sb.Append("<s:sequence>"); foreach (string s in procParams) { sb.AppendFormat("<s:element minOccurs='1' maxOccurs='1' name='{0}' type='s:{1}' />", s.ToLower(), GetSoapDataType(procParams.GetValues(s)[0])); } sb.Append("</s:sequence>"); sb.Append("</s:complexType>"); sb.Append("</s:element>"); sb.AppendFormat("<s:element name='{0}Response'>", prettyProcName); sb.Append("<s:complexType>"); sb.Append("<s:sequence>"); // for now, we only support returning one (string) value sb.AppendFormat("<s:element minOccurs='1' maxOccurs='1' name='{0}Result' nillable='true' type='s:string' />", prettyProcName); sb.Append("</s:sequence>"); sb.Append("</s:complexType>"); sb.Append("</s:element>"); } sb.Append("</s:schema>"); sb.Append("</wsdl:types>"); foreach (string functionName in functionList) { string prettyProcName = StringUtil.PrettyStr(functionName); sb.AppendFormat("<wsdl:message name='{0}SoapIn'>", prettyProcName); sb.AppendFormat("<wsdl:part name='parameters' element='tns:{0}' />", prettyProcName); sb.Append("</wsdl:message>"); sb.AppendFormat("<wsdl:message name='{0}SoapOut'>", prettyProcName); sb.AppendFormat("<wsdl:part name='parameters' element='tns:{0}Response' />", prettyProcName); sb.Append("</wsdl:message>"); } sb.AppendFormat("<wsdl:portType name='{0}Soap'>", serviceName); foreach (string functionName in functionList) { string prettyProcName = StringUtil.PrettyStr(functionName); sb.AppendFormat("<wsdl:operation name='{0}'>", prettyProcName); sb.AppendFormat("<wsdl:input message='tns:{0}SoapIn' />", prettyProcName); sb.AppendFormat("<wsdl:output message='tns:{0}SoapOut' />", prettyProcName); sb.Append("</wsdl:operation>"); } sb.Append("</wsdl:portType>"); sb.AppendFormat("<wsdl:binding name='{0}Soap' type='tns:{0}Soap'>", serviceName); foreach (string functionName in functionList) { string prettyProcName = StringUtil.PrettyStr(functionName); sb.Append("<soap:binding transport='http://schemas.xmlsoap.org/soap/http' />"); sb.AppendFormat("<wsdl:operation name='{0}'>", prettyProcName); sb.AppendFormat("<soap:operation soapAction='{0}/{1}' style='document' />", _dadConfig.SoapTargetNamespace, prettyProcName); sb.Append("<wsdl:input>"); sb.Append("<soap:body use='literal' />"); sb.Append("</wsdl:input>"); sb.Append("<wsdl:output>"); sb.Append("<soap:body use='literal' />"); sb.Append("</wsdl:output>"); sb.Append("</wsdl:operation>"); } sb.Append("</wsdl:binding>"); sb.AppendFormat("<wsdl:service name='{0}'>", serviceName); sb.AppendFormat("<wsdl:port name='{0}Soap' binding='tns:{0}Soap'>", serviceName); if (ooi.PackageName.Length > 0) { sb.AppendFormat("<soap:address location='http://{0}/{1}/{2}/{3}' />", serverName, moduleName, dadName, ooi.PackageName.ToLower()); } else { sb.AppendFormat("<soap:address location='http://{0}/{1}/{2}/{3}' />", serverName, moduleName, dadName, procName); } sb.Append("</wsdl:port>"); sb.Append("</wsdl:service>"); sb.Append("</wsdl:definitions>"); _wsdlBody = sb.ToString(); return(true); }
private OracleObjectInfo ResolveName(string procName) { OracleObjectInfo ooi = new OracleObjectInfo(); logger.Debug("Attempting to resolve name " + procName); string sql = "begin dbms_utility.name_resolve (:p_name, 1, :p_schema, :p_part1, :p_part2, :p_dblink, :p_part1_type, :p_object_number); end;"; OracleCommand cmd = new OracleCommand(sql, _conn); OracleParameter p1 = cmd.Parameters.Add("p_name", OracleDbType.Varchar2, ParameterDirection.Input); p1.Value = procName; OracleParameter p2 = cmd.Parameters.Add("p_schema", OracleDbType.Varchar2, ParameterDirection.Output); p2.Size = 30; OracleParameter p3 = cmd.Parameters.Add("p_part1", OracleDbType.Varchar2, ParameterDirection.Output); p3.Size = 30; OracleParameter p4 = cmd.Parameters.Add("p_part2", OracleDbType.Varchar2, ParameterDirection.Output); p4.Size = 30; OracleParameter p5 = cmd.Parameters.Add("p_dblink", OracleDbType.Varchar2, ParameterDirection.Output); p5.Size = 30; OracleParameter p6 = cmd.Parameters.Add("p_part1_type", OracleDbType.Varchar2, ParameterDirection.Output); p6.Size = 30; OracleParameter p7 = cmd.Parameters.Add("p_object_number", OracleDbType.Int32, ParameterDirection.Output); logger.Debug("Executing SQL: " + cmd.CommandText); try { cmd.ExecuteNonQuery(); _lastError = ""; if (p2.Status == OracleParameterStatus.NullFetched) { ooi.SchemaName = ""; } else { ooi.SchemaName = (string)(OracleString)p2.Value; } if (p3.Status == OracleParameterStatus.NullFetched) { ooi.PackageName = ""; } else { ooi.PackageName = (string)(OracleString)p3.Value; } if (p4.Status == OracleParameterStatus.NullFetched) { ooi.ObjectName = ""; } else { ooi.ObjectName = (string)(OracleString)p4.Value; } ooi.ObjectType = (string)(OracleString)p6.Value; ooi.ObjectId = (int)(OracleDecimal)p7.Value; } catch (OracleException e) { logger.Error("Command failed: " + e.Message); _lastError = e.Message; } return(ooi); }