/// <summary>
        /// Parse query result for multiple values.
        /// </summary>
        /// <param name="scriptInstance">script reference</param>
        /// <param name="attributeNames">attribute</param>
        /// <param name="queryOutput">Output</param>
        private static void MultiValueHandler
            (WindowsOracleInstanceStaticScript scriptInstance, String attributeNames, String queryOutput)
        {
            IDictionary <string, string> patterns = new Dictionary <string, string>();

            foreach (String name in attributeNames.Split(new String[] { "<BDNA>" }, StringSplitOptions.RemoveEmptyEntries))
            {
                if (!String.IsNullOrEmpty(name))
                {
                    patterns[name] = @"<BDNA>" + name.Trim() + @"<BDNA>(.*?)<BDNA>";
                }
            }

            StringBuilder logData = new StringBuilder();

            foreach (string line in queryOutput.Split('\n', '\r'))
            {
                foreach (KeyValuePair <string, string> pattern in patterns)
                {
                    Regex r = new Regex(pattern.Value);
                    if (r.IsMatch(line))
                    {
                        string name   = pattern.Key;
                        string result = matchFirstGroup(line, r);
                        scriptInstance.BuildDataRow(name, result);
                        logData.AppendFormat("{0}: {1}\n", name, result);
                    }
                }
            }
            Lib.Logger.TraceEvent(TraceEventType.Verbose,
                                  0,
                                  "Task Id {0}: Multiple value parser results:\n{1}",
                                  scriptInstance.m_taskId,
                                  logData.ToString());
        }
        /// <summary>
        /// Parse query result for a single value.
        /// </summary>
        /// <param name="scriptInstance">script reference</param>
        /// <param name="attributeNames">attribute</param>
        /// <param name="queryOutput">Output</param>
        private static void SingleValueHandler
            (WindowsOracleInstanceStaticScript scriptInstance, String attributeName, String queryOutput)
        {
            string        value   = null;
            StringBuilder logData = new StringBuilder();
            Regex         r       = new Regex(@"^<BDNA>" + attributeName + @"<BDNA>(.*?)<BDNA>$");

            foreach (String line in queryOutput.Split('\n', '\r'))
            {
                if (r.IsMatch(line))
                {
                    value = matchFirstGroup(line, r);
                    logData.AppendFormat("{0}: {1}\n", attributeName, value);
                    break;
                }
            }
            Lib.Logger.TraceEvent(TraceEventType.Verbose,
                                  0,
                                  "Task Id {0}: Parse query results for attribute {1}:\n{2}",
                                  scriptInstance.m_taskId,
                                  attributeName,
                                  logData.ToString());
            if (!String.IsNullOrEmpty(value))
            {
                scriptInstance.BuildDataRow(attributeName, value);
            }
        }
        /// <summary>
        /// Result parser for v$parameter table.
        /// </summary>
        /// <param name="scriptInstance">script reference</param>
        /// <param name="attributeNames">attribute</param>
        /// <param name="queryOutput">Output</param>
        private static void tableVOptionHandler
            (WindowsOracleInstanceStaticScript scriptInstance, String attributeName, String queryOutput)
        {
            string RACEnabled = "0", Partitioning = "0";

            foreach (String line in queryOutput.Split('\n', '\r'))
            {
                if (s_realCluster.IsMatch(line))
                {
                    RACEnabled = "1";
                }

                if (s_partioningRegex.IsMatch(line))
                {
                    Partitioning = "1";
                }
            }
            scriptInstance.BuildDataRow("RACEnabled", RACEnabled);
            scriptInstance.BuildDataRow("Partitioning", Partitioning);
            Lib.Logger.TraceEvent(TraceEventType.Verbose,
                                  0,
                                  "Task Id {0}: RACEnabled: {1}, Partitioning: {2}",
                                  scriptInstance.m_taskId,
                                  RACEnabled,
                                  Partitioning);
        }
        /// <summary>
        /// Result parser for v$dba_tab_partitions table.
        /// </summary>
        /// <param name="scriptInstance">script reference</param>
        /// <param name="attributeNames">attribute</param>
        /// <param name="queryOutput">Output</param>
        private static void tableDBA_TAB_PARTITIONS_Handler
            (WindowsOracleInstanceStaticScript scriptInstance, String attributeName, String queryOutput)
        {
            StringBuilder strPartitionSchema = new StringBuilder();

            foreach (String line in queryOutput.Split('\n', '\r'))
            {
                if (s_tabPartionRegex.IsMatch(line))
                {
                    MatchCollection matches = s_tabPartionRegex.Matches(line);
                    foreach (Match m in matches)
                    {
                        if (m.Groups.Count > 1)
                        {
                            string owner = m.Groups[1].ToString().Trim();
                            string count = m.Groups[2].ToString().Trim();
                            if (strPartitionSchema.Length > 0)
                            {
                                strPartitionSchema.Append(BdnaDelimiters.DELIMITER_TAG);
                            }
                            //strPartitionSchema.Append(owner).Append(@", ").Append(count);
                            strPartitionSchema.Append(owner).Append(BdnaDelimiters.DELIMITER_TAG).Append(count);
                        }
                    }
                }
            }
            if (strPartitionSchema.Length > 0)
            {
                scriptInstance.BuildDataRow("partitionedSchemas", strPartitionSchema.ToString());
                scriptInstance.BuildDataRow("PartitioningApplied", "1");
            }
            else
            {
                scriptInstance.BuildDataRow("PartitioningApplied", "0");
            }
            Lib.Logger.TraceEvent(TraceEventType.Verbose,
                                  0,
                                  "Task Id {0}: PartitioningSchema {1}.",
                                  scriptInstance.m_taskId,
                                  strPartitionSchema);
        }
        /// <summary>
        /// Result parser for v$parameter table.
        /// </summary>
        /// <param name="scriptInstance">script reference</param>
        /// <param name="attributeNames">attribute</param>
        /// <param name="queryOutput">Output</param>
        private static void tableVParameterHandler
            (WindowsOracleInstanceStaticScript scriptInstance, String attributeNames, String queryOutput)
        {
            IDictionary <string, string> result = new Dictionary <string, string>();
            StringBuilder logData = new StringBuilder();

            foreach (String line in queryOutput.Split('\n', '\r'))
            {
                if (s_enterpriseRegex.IsMatch(line))
                {
                    result["edition"] = "Enterprise";
                }
                else if (s_personalRegex.IsMatch(line))
                {
                    result["edition"] = "Personal";
                }
                else if (s_expressRegex.IsMatch(line))
                {
                    result["edition"] = "Express";
                }

                if (s_dbNameRegex.IsMatch(line))
                {
                    result["databaseName"] = matchFirstGroup(line, s_dbNameRegex);
                    logData.AppendFormat("db_name: {0}\n", result["databaseName"]);
                }

                if (s_dbDomain.IsMatch(line))
                {
                    result["databaseDomain"] = matchFirstGroup(line, s_dbDomain);
                    logData.AppendFormat("db_domain: {0}\n", result["databaseDomain"]);
                }

                if (s_mtsServiceRegex.IsMatch(line))
                {
                    result["serviceName"] = matchFirstGroup(line, s_mtsServiceRegex);
                    logData.AppendFormat("mts_service: {0}\n", result["serviceName"]);
                }

                if (result.ContainsKey("serviceName") == false)
                {
                    if (s_serviceNameRegex.IsMatch(line))
                    {
                        result["serviceName"] = matchFirstGroup(line, s_serviceNameRegex);
                        logData.AppendFormat("service_names: {0}\n", result["serviceName"]);
                    }
                }

                if (s_compatibleRegex.IsMatch(line))
                {
                    result["compatibleVersion"] = matchFirstGroup(line, s_compatibleRegex);
                    logData.AppendFormat("compatible: {0}\n", result["compatibleVersion"]);
                }

                if (s_instanceNumberRegex.IsMatch(line))
                {
                    result["instanceNumber"] = matchFirstGroup(line, s_instanceNumberRegex);
                    logData.AppendFormat("instance number: {0}\n", result["instanceNumber"]);
                }

                if (s_clusterRegex.IsMatch(line))
                {
                    result["clusterDatabaseInstances"] = matchFirstGroup(line, s_clusterRegex);
                    logData.AppendFormat("instance number: {0}\n", result["clusterDatabaseInstances"]);
                }
            }
            if (result.Count > 0 && !result.ContainsKey("edition"))
            {
                result["edition"] = "Standard";
            }

            Lib.Logger.TraceEvent(TraceEventType.Verbose,
                                  0,
                                  "Task Id {0}: v$parameter parser results:\n{1}",
                                  scriptInstance.m_taskId,
                                  logData.ToString());
            // Package output data
            foreach (String name in attributeNames.Split(new String[] { "<BDNA>" }, StringSplitOptions.RemoveEmptyEntries))
            {
                if (result.ContainsKey(name) && !String.IsNullOrEmpty(result[name]))
                {
                    scriptInstance.BuildDataRow(name, result[name]);
                }
            }
        }