`;
const renderTable = (elId, headers, data) => {
const el = document.getElementById(elId);
let html = `
${headers.map(h => `| ${h} | `).join('')}
`;
html += data.map(row => `${row.map(cell => `| ${cell} | `).join('')}
`).join('');
el.innerHTML = html + '';
};
function displaySummary(summary, load) {
const avgActiveSessions = (summary.dbTime / (summary.elapsed * 60)).toFixed(2);
document.getElementById('awr-summary-kpis').innerHTML =
renderKpi('DB Time (s)', summary.dbTime.toLocaleString()) +
renderKpi('Elapsed (min)', summary.elapsed.toLocaleString()) +
renderKpi('Avg Active Sessions', avgActiveSessions, `${summary.cpus} CPUs`);
document.getElementById('awr-load-kpis').innerHTML =
renderKpi('Logical Reads', load.logicalReads) +
renderKpi('Physical Reads', load.physicalReads) +
renderKpi('Hard Parses', load.hardParses);
}
function displayTopEvents(events) {
renderTable('awr-top-events-table', ['Event', 'Waits', 'Time(s)', '%DB Time', 'Avg Wait(ms)'], events);
const chartCtx = document.getElementById('awr-top-events-chart').getContext('2d');
const labels = events.map(e => e[0]);
const data = events.map(e => parseFloat(e[3]));
if(chartInstances.topEvents) chartInstances.topEvents.destroy();
chartInstances.topEvents = new Chart(chartCtx, {type:'doughnut', data: {labels, datasets:[{data}]}, options: {responsive: true, maintainAspectRatio: false}});
}
function displayTopSql(byCpu, byGets, byReads) {
const tabsContainer = document.getElementById('awr-sql-tabs-container');
const contentContainer = document.getElementById('awr-sql-content-container');
tabsContainer.innerHTML = `
`;
contentContainer.innerHTML = `
`;
renderTable('awr-sql-cpu-table', ['CPU Time(s)', 'Execs', 'Time/Exec', '%Total', 'SQL ID'], byCpu);
renderTable('awr-sql-gets-table', ['Buffer Gets', 'Execs', 'Gets/Exec', '%Total', 'SQL ID'], byGets);
renderTable('awr-sql-reads-table', ['Phys Reads', 'Execs', 'Reads/Exec', '%Total', 'SQL ID'], byReads);
tabsContainer.addEventListener('click', (e) => {
if(e.target.tagName === 'BUTTON') {
document.querySelectorAll('.awr-sql-tab-btn, .awr-sql-tab-content').forEach(el => el.classList.remove('active'));
e.target.classList.add('active');
document.getElementById(`sql-tab-${e.target.dataset.tab}`).classList.add('active');
}
});
}
function displaySegments(segments, tableId) {
renderTable(tableId, ['Owner', 'Object', 'Subobject', 'Type', 'Physical Reads'], segments);
}
window.awrDownloadPDF = () => {
html2canvas(document.getElementById('awr-pdf-content'), { scale: 2 }).then(canvas => {
const pdf = new jsPDF({ orientation: 'landscape', unit: 'pt', format: 'a4' });
pdf.addImage(canvas.toDataURL('image/png'), 'PNG', 40, 40, pdf.internal.pageSize.getWidth() - 80, 0);
pdf.save('AWR_Analysis_Dashboard.pdf');
});
};
});