public static ExplainPlan GenerateExplainPlan(object resources)
        {
            if (!(resources is IDbCommand))
            {
                return(null);
            }

            var dbCommand = (IDbCommand)resources;

            if (dbCommand.Connection.State != ConnectionState.Open)
            {
                dbCommand.Connection.Open();
            }

            ExplainPlan explainPlan = null;

            //KILL THE CONNECTION NO MATTER WHAT HAPPENS DURING EXECUTION TO AVOID CONNECTION LEAKING
            using (dbCommand)
                using (dbCommand.Connection)
                {
                    dbCommand.Transaction = null;
                    SqlParser.FixParameterizedSql(dbCommand);
                    dbCommand.CommandText = "EXPLAIN " + dbCommand.CommandText;


                    using (IDataReader reader = dbCommand.ExecuteReader())
                    {
                        var headers = GetReaderHeaders(reader);
                        // Decide which headers should be obfuscated based on the Vendor (this is only SQL)
                        var obfuscatedHeaders = GetObfuscatedIndexes(headers);
                        explainPlan = new ExplainPlan(headers, new List <List <object> >(), obfuscatedHeaders);

                        var explainPlanDatas = new List <List <object> >();
                        while (reader.Read())
                        {
                            object[] values = new object[reader.FieldCount];
                            reader.GetValues(values);
                            explainPlanDatas.Add(values.ToList());
                        }

                        explainPlan.ExplainPlanDatas = explainPlanDatas;
                    }
                }

            return(explainPlan);
        }
        public static VendorExplainValidationResult ShouldGenerateExplainPlan(string sql, ParsedSqlStatement parsedSqlStatement)
        {
            var validationMessage = "";
            var isValid           = true;

            var isSelectStatement = parsedSqlStatement.Operation.Equals("select", StringComparison.CurrentCultureIgnoreCase);

            if (!isSelectStatement)
            {
                validationMessage += "Will not run EXPLAIN on non-select statements. ";
                isValid            = false;
            }

            var isSingleStatement = SqlParser.IsSingleSqlStatement(sql);

            if (!isSingleStatement)
            {
                validationMessage += "Will not run EXPLAIN on multi-statement SQL query. ";
                isValid            = false;
            }

            return(new VendorExplainValidationResult(isValid, validationMessage));
        }