UNPKG

agentsqripts

Version:

Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems

62 lines (55 loc) 2.25 kB
/** * @file Detect transaction issues * @description Single responsibility: Identify database transaction problems */ const { iterateLines } = require('../../../utils/patternDetector'); const findPatternInRange = require('../helpers/findPatternInRange'); const countDatabaseOperations = require('../helpers/countDatabaseOperations'); function detectTransactionIssues(lines, filePath) { const issues = []; iterateLines(lines, (line, lineNumber, trimmed, i) => { // Transaction start without proper error handling if (/\.beginTransaction\s*\(|BEGIN\s+TRANSACTION/i.test(trimmed)) { // Look for rollback in error handling const hasRollback = findPatternInRange(lines, i, i + 20, /\.rollback\s*\(|ROLLBACK/i); if (!hasRollback) { issues.push({ type: 'missing_transaction_rollback', severity: 'HIGH', category: 'Database', location: `${filePath}:${lineNumber}`, line: lineNumber, code: trimmed, description: 'Transaction started without proper rollback error handling', summary: 'Transaction missing rollback handling', recommendation: 'Add rollback in try/catch or error handling', effort: 2, impact: 'Prevents database lock issues', estimatedSavings: 'prevents transaction locks' }); } } // Long-running transactions if (/\.beginTransaction\s*\(/i.test(trimmed)) { const operationCount = countDatabaseOperations(lines, i, i + 50); if (operationCount > 10) { issues.push({ type: 'long_running_transaction', severity: 'MEDIUM', category: 'Database', location: `${filePath}:${lineNumber}`, line: lineNumber, code: trimmed, description: `Transaction contains ${operationCount} operations - may cause locking issues`, summary: 'Long-running transaction', recommendation: 'Break into smaller transactions or use batch operations', effort: 3, impact: 'Reduces database locking time', estimatedSavings: 'improved concurrency' }); } } }); return issues; } module.exports = detectTransactionIssues;