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
JavaScript
/**
* @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;