UNPKG

@dba-i/mssql-dba

Version:

The server provides a functionality to handle DBA tasks for SQL Server database, such as analyzing tables, assesing index health, and finding missing indices. Many more tasks are upcoming. **Currently we support only SQL Server Authenitcation** method. Fo

83 lines 2.66 kB
import sql from 'mssql'; import fs from 'fs'; /** * Represents a connection to an MSSQL database. */ export class MSSQL { pool = null; config; constructor(config) { this.config = config; } async executeQuery({ query, parameters, }) { this.ensureConnected(); const request = this.pool.request(); if (parameters) { for (const [key, value] of Object.entries(parameters)) { request.input(key, value); } } const result = await request.query(query); return result.recordset; } /** * Fetches metadata about the database such as size and free space in MB. * @returns An object containing dbSizeMB and dbFreeSpaceMB. */ async getDatabaseMetadata() { this.ensureConnected(); // Query to get database size in MB const dbSizeQuery = ` SELECT SUM(size) * 8.0 / 1024 AS dbSizeMB FROM sys.database_files; `; // Query to get free space in MB const dbFreeSpaceQuery = ` SELECT SUM(size - CAST(FILEPROPERTY(name, 'SpaceUsed') AS INT)) * 8.0 / 1024 AS dbFreeSpaceMB FROM sys.database_files; `; const dbSizeResult = await this.executeQuery({ query: dbSizeQuery, }); const dbFreeSpaceResult = await this.executeQuery({ query: dbFreeSpaceQuery }); const dbSizeMB = dbSizeResult[0]?.dbSizeMB ?? 0; const dbFreeSpaceMB = dbFreeSpaceResult[0]?.dbFreeSpaceMB ?? 0; return { dbSizeMB, dbFreeSpaceMB }; } // Utilities for permissions async checkPermissions() { this.ensureConnected(); const query = fs.readFileSync('src/sql/mssql/permissions/checkPermissions.sql', 'utf8'); const permissions = await this.executeQuery({ query }); return permissions.reduce((acc, { level, permission_name }) => { if (!acc[level]) { acc[level] = []; } if (!acc[level].includes(permission_name)) { acc[level].push(permission_name); } return acc; }, {}); } // Utilities for connection management async connect() { if (this.isConnected()) { return; } this.pool = await sql.connect(this.config); } async disconnect() { await this.pool.close(); this.pool = null; } isConnected() { return this.pool !== null; } ensureConnected() { if (!this.isConnected()) { throw new Error('Database connection is not established.'); } } } //# sourceMappingURL=MSSQL.js.map