// // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. // using System; using System.Xml; using System.Collections; using System.Diagnostics; namespace Microsoft.SqlTools.ServiceLayer.Management { /// /// SqlTools Parameters, used to define what goes into starting up a Workbench Form /// AKA a dbCommander, AKA a "dialog" /// These parameters are xml snippets /// public class STParameters { public XmlDocument m_doc; /// /// The data type we are interested in /// public enum STType { eNULL, eInt, eLong, eString }; /// /// default constructor /// public STParameters() { // // TODO: Add constructor logic here // } /// /// Constructor /// /// The xml snippet used to control the dbCommander public STParameters(XmlDocument xmlDoc) { m_doc = xmlDoc; } /// /// Changing the xml snippet we are using /// /// the new xml snippet public void SetDocument(XmlDocument xmlDoc) { m_doc = xmlDoc; } /// /// Access to the xml we are using for dbCommander parameters /// /// our current parameters public XmlDocument GetDocument() { return m_doc; } /// /// Search for an xml tag, and return its value /// /// the xml tag name /// the value of that tag /// flag that is true if the data was found, false if not public bool GetBaseParam(string parameterName, ref object value) { XmlNodeList nodeList = null; bool parameterExists; if (m_doc == null) return false; parameterExists = false; nodeList = m_doc.GetElementsByTagName(parameterName); if (nodeList.Count > 1) { value = null; } else if (nodeList.Count != 0) // anything there? { try { XmlNode node = nodeList.Item(0); if (null != node) { value = node.InnerText as object; parameterExists = true; } } catch (Exception /*e*/) { } } return parameterExists; } /// /// Finds an existing xml tag, and sets it to a new value, or if the tag is not found /// create it and set it's value /// /// tag name /// new value /// flag that is true if the tag was set, false if not public bool SetBaseParam(string parameterName, object value) { XmlNodeList nodeList; bool success = false; nodeList = m_doc.GetElementsByTagName(parameterName); if (nodeList.Count == 1) { try { nodeList.Item(0).InnerText = (string)value; success = true; } catch (InvalidCastException /*e*/) { success = false; } } if (nodeList.Count == 0) { try { XmlElement xmlElement = m_doc.CreateElement(parameterName); XmlNode root = m_doc.DocumentElement; nodeList = m_doc.GetElementsByTagName("params"); if (nodeList.Count == 1 && value is string) { xmlElement.InnerText = (string)value; nodeList.Item(0).InsertAfter(xmlElement, nodeList.Item(0).LastChild); success = true; } } catch (Exception e) { string sz = e.ToString(); success = false; } } return success; } /// /// Get back an interger parameter. /// NOTE: if the tag exists, but it contains non-numeric data, this will throw /// An exception of type 'System.FormatException' /// with Additional information: Could not find any parsible digits. /// /// xml tag name for the parameter of interest /// out value of parameter /// flag that is true if the data was found, false if not public bool GetParam(string parameterName, out int value) { bool parameterExists = false; value = 0; try { object oAux = null; if (parameterExists = GetBaseParam(parameterName, ref oAux)) { try { value = Convert.ToInt32((string)oAux, 10); // data is always a string, it is the value of XmlNode.InnerText } catch (FormatException e) { Debug.WriteLine(String.Format(System.Globalization.CultureInfo.CurrentCulture, "Non numeric data in tag: {0}", parameterName)); Debug.WriteLine(e.Message); throw; } } } catch (InvalidCastException /*e*/) { } return parameterExists; } /// /// Accessor for a boolean parameter /// NOTE: if the tag exists, but it contains non-numeric data, this will throw /// An exception of type 'System.FormatException' /// with Additional information: Could not find any parsible digits. /// /// xml tag name for the parameter of interest /// out value of parameter /// flag that is true if the data was found, false if not public bool GetParam(string parameterName, ref bool value) { bool parameterExists = false; value = false; try { object oAux = null; if (parameterExists = GetBaseParam(parameterName, ref oAux)) { try { value = Convert.ToBoolean((string)oAux, System.Globalization.CultureInfo.InvariantCulture); // data is always a string, it is the value of XmlNode.InnerText } catch (FormatException e) { Debug.WriteLine(String.Format(System.Globalization.CultureInfo.CurrentCulture, "Non boolean data in tag: {0}", parameterName)); Debug.WriteLine(e.Message); throw; } } } catch (InvalidCastException /*e*/) { } return parameterExists; } /// /// Accessor to a string parameter /// /// xml tag name for the parameter of interest /// out value of parameter /// flag that is true if the data was found, false if not public bool GetParam(string parameterName, ref string value) { bool parameterExists; value = ""; parameterExists = false; try { object oAux = null; if (parameterExists = GetBaseParam(parameterName, ref oAux)) { value = (string)oAux; } } catch (InvalidCastException /*e*/) { } return parameterExists; } /// /// Accessor to long parameter (Int64) /// NOTE: if the tag exists, but it contains non-numeric data, this will throw /// An exception of type 'System.FormatException' /// with Additional information: Could not find any parsible digits. /// /// xml tag name for the parameter of interest /// out value of parameter /// flag that is true if the data was found, false if not public bool GetParam(string parameterName, out long value) { bool parameterExists = false; value = 0; try { object oAux = null; if (parameterExists = GetBaseParam(parameterName, ref oAux)) { try { value = Convert.ToInt64((string)oAux, 10); // data is always a string, it is the value of XmlNode.InnerText } catch (FormatException e) { Debug.WriteLine(String.Format(System.Globalization.CultureInfo.CurrentCulture, "Non numeric data in tag: {0}", parameterName)); Debug.WriteLine(e.Message); throw; } } } catch (InvalidCastException /*e*/) { } return parameterExists; } /// /// Set an int (Int32) parameter /// /// tag name for parameter /// integer value /// true if set was successful, false if not public bool SetParam(string parameterName, int value) { bool success; success = SetBaseParam(parameterName, (object)value); return success; } /// /// Set a string parameter /// /// tag name for parameter /// string value /// true if set was successful, false if not public bool SetParam(string parameterName, string value) { bool success; success = SetBaseParam(parameterName, (object)value); return success; } /// /// Set a long (Int64) parameter /// /// tag name for parameter /// long value /// true if set was successful, false if not public bool SetParam(string parameterName, long value) { bool success; success = SetBaseParam(parameterName, (object)value); return success; } /// /// Get a string collection parameter /// /// name of collection /// collection that gets filled up with parameters /// true if we want to get at inner nodes, false if not /// true if parameter(s) exist public bool GetParam(string parameterName, System.Collections.Specialized.StringCollection list, bool getInnerXml) { /// necessary for OALP objects path that is in an XML form if (true == getInnerXml) { XmlNodeList nodeList; bool parameterExists; long lCount; parameterExists = false; nodeList = m_doc.GetElementsByTagName(parameterName); list.Clear(); lCount = nodeList.Count; if (lCount > 0) { parameterExists = true; for (long i = 0; i < lCount; i++) { list.Add(nodeList.Item((int)i).InnerXml); } } else { parameterExists = false; } return parameterExists; } else { return GetParam(parameterName, list); } } /// /// Access to a collection of parameters /// /// name of collection /// list to fill with parameters /// parameter(s) exist public bool GetParam(string parameterName, System.Collections.Specialized.StringCollection list) { XmlNodeList nodeList; bool parameterExists; long lCount; parameterExists = false; nodeList = m_doc.GetElementsByTagName(parameterName); list.Clear(); lCount = nodeList.Count; if (lCount > 0) { parameterExists = true; for (long i = 0; i < lCount; i++) { list.Add(nodeList.Item((int)i).InnerText); } } else { parameterExists = false; } return parameterExists; } public bool GetParam(string parameterName, ref ArrayList list) { System.Collections.Specialized.StringCollection stringList = new System.Collections.Specialized.StringCollection(); bool parameterExists = GetParam(parameterName, stringList); list.Clear(); if (!parameterExists) { return false; } else { for (int i = 0; i < stringList.Count; i++) { list.Add(stringList[i]); } return true; } } /// /// This function does nothing but return false /// /// ignored /// ignored /// always false public bool GetParamType(string parameterName, STType type) { bool whatever = false; return whatever; } /// /// This function does nothing but return false /// /// ignored /// ignored /// always false public bool SetParamType(string parameterName, STType type) { bool whatever = false; return whatever; } } }