99 lines
3.7 KiB
JavaScript
99 lines
3.7 KiB
JavaScript
// /services/dbconnector/queryExecutor.js
|
|
|
|
require('dotenv').config();
|
|
const connectionManager = require('./connectionManager');
|
|
const queryConstructor = require('./queryConstructor');
|
|
const paramLibrary = require('./paramLibrary');
|
|
|
|
/**
|
|
* Executes a query against the configured database type.
|
|
*
|
|
* @param {string} table - The name of the database table.
|
|
* @param {string} operation - CRUD operation (e.g., 'CREATE', 'READ').
|
|
* @param {Object} config - Database configuration object.
|
|
* @param {Object} params - Parameters for the SQL query.
|
|
* @returns {Promise<Object>} A promise that resolves with the result of the query execution.
|
|
*/
|
|
async function executeQuery(table, operation, params) {
|
|
console.log(`Executing query for ${operation.toUpperCase()} on table ${table}...`); // Debugging log
|
|
console.log('Raw parameters:', params); // Log the raw parameters received
|
|
|
|
const query = await queryConstructor.generateQuery(table, operation, params);
|
|
|
|
let result;
|
|
|
|
try {
|
|
const formattedParams = await paramLibrary.formatQueryParams(params);
|
|
const connection = await connectionManager.getConnection();
|
|
|
|
switch (process.env.DB_TYPE.toUpperCase()) {
|
|
case 'MSSQL':
|
|
console.log('Executing MSSQL query:', query); // Debugging log
|
|
console.log('Formatted parameters for MSSQL:', formattedParams); // Log the formatted parameters
|
|
result = await executeMSSQLQuery(connection, query, formattedParams);
|
|
break;
|
|
case 'MARIADB':
|
|
console.log('Executing MariaDB query:', query); // Debugging log
|
|
console.log('Formatted parameters for MariaDB:', formattedParams); // Log the formatted parameters
|
|
result = await executeMariaDBQuery(connection, query, formattedParams);
|
|
break;
|
|
default:
|
|
throw new Error('Unsupported database type');
|
|
}
|
|
} catch (err) {
|
|
console.error('Error executing query:', err.message);
|
|
throw err;
|
|
}
|
|
switch (operation.toUpperCase()) {
|
|
case 'READ':
|
|
return result.recordset || [];
|
|
case 'UPDATE':
|
|
return { success: true, affectedRows: result.affectedRows };
|
|
case 'DELETE':
|
|
return { success: true, affectedRows: result.affectedRows };
|
|
case 'CREATE':
|
|
return { success: true };
|
|
case 'TEST':
|
|
return result.recordset || [];
|
|
}
|
|
return result;
|
|
}
|
|
|
|
async function executeMSSQLQuery(connection, query, params) {
|
|
console.log('Binding parameters for MSSQL:', params); // Debugging log
|
|
|
|
const request = connection.request();
|
|
|
|
// Bind each parameter with its name and value
|
|
for (const key in params) {
|
|
if (params[key]) {
|
|
request.input(key, params[key].type, params[key].value);
|
|
}
|
|
}
|
|
|
|
try {
|
|
console.log('Executing MSSQL query:', query); // Debugging log
|
|
const result = await request.query(query);
|
|
return { recordset: result.recordset, affectedRows: result.rowsAffected };
|
|
} catch (error) {
|
|
console.error('Error executing MSSQL query:', error.message);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
async function executeMariaDBQuery(connection, query, params) {
|
|
try {
|
|
// Extract parameter values in order
|
|
const paramValues = Object.keys(params).map(key => params[key].value);
|
|
|
|
console.log('Executing MariaDB query:', query); // Debugging log
|
|
console.log('Binding parameters for MariaDB:', paramValues); // Debugging log
|
|
|
|
const [result] = await connection.execute(query, paramValues);
|
|
return { recordset: result };
|
|
} finally {
|
|
await connection.end();
|
|
}
|
|
}
|
|
|
|
module.exports = { executeQuery };
|