Analyze performs comprehensive AST-based analysis
(astObj *ast.AST, sqlArgs ...string)
| 55 | |
| 56 | // Analyze performs comprehensive AST-based analysis |
| 57 | func (a *SQLAnalyzer) Analyze(astObj *ast.AST, sqlArgs ...string) (*AnalysisReport, error) { |
| 58 | // Extract optional SQL string for query metadata |
| 59 | sql := "" |
| 60 | if len(sqlArgs) > 0 { |
| 61 | sql = sqlArgs[0] |
| 62 | } |
| 63 | |
| 64 | // Reset analyzer state |
| 65 | a.reset() |
| 66 | |
| 67 | // Traverse AST using visitor pattern |
| 68 | for _, stmt := range astObj.Statements { |
| 69 | if err := ast.Walk(a, stmt); err != nil { |
| 70 | return nil, fmt.Errorf("AST traversal failed: %w", err) |
| 71 | } |
| 72 | } |
| 73 | |
| 74 | // Run security scanner for injection patterns (tautologies, UNION-based, time-based, etc.) |
| 75 | securityScanner := security.NewScanner() |
| 76 | securityResult := securityScanner.Scan(astObj) |
| 77 | a.convertSecurityFindings(securityResult) |
| 78 | |
| 79 | // Calculate final metrics and scores |
| 80 | a.calculateComplexityMetrics() |
| 81 | a.calculateScores() |
| 82 | |
| 83 | // Generate recommendations |
| 84 | recommendations := a.generateRecommendations() |
| 85 | |
| 86 | // Count issues by severity |
| 87 | critical, high, medium, low := CountIssuesBySeverity(a.Issues) |
| 88 | |
| 89 | // Calculate final scores |
| 90 | securityScore := a.calculateSecurityScore() |
| 91 | overallScore := a.calculateOverallScore() |
| 92 | |
| 93 | // Build query metadata |
| 94 | queryInfo := a.buildQueryInfo(astObj, sql) |
| 95 | |
| 96 | return &AnalysisReport{ |
| 97 | Timestamp: time.Now(), |
| 98 | Version: "2.0.0-unified", |
| 99 | Query: queryInfo, |
| 100 | Issues: a.Issues, |
| 101 | ComplexityMetrics: a.ComplexityMetrics, |
| 102 | SecurityScore: securityScore, |
| 103 | PerformanceScore: a.PerformanceScore, |
| 104 | OverallScore: overallScore, |
| 105 | Grade: CalculateGrade(overallScore), |
| 106 | TotalIssues: len(a.Issues), |
| 107 | CriticalIssues: critical, |
| 108 | HighIssues: high, |
| 109 | MediumIssues: medium, |
| 110 | LowIssues: low, |
| 111 | Recommendations: recommendations, |
| 112 | }, nil |
| 113 | } |
| 114 |