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)); }