iot-agent/config/database.js
2025-08-03 23:07:33 +05:30

79 lines
1.9 KiB
JavaScript

const mysql = require('mysql2/promise');
const logger = require('../utils/logger');
class Database {
constructor() {
this.pool = null;
}
async connect() {
try {
this.pool = mysql.createPool({
host: process.env.DB_HOST || 'localhost',
port: process.env.DB_PORT || 3306,
user: process.env.DB_USER || 'root',
password: process.env.DB_PASSWORD || '',
database: process.env.DB_NAME || 'ai_agent_iot',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0,
acquireTimeout: 60000,
charset: 'utf8mb4'
});
// Test the connection
const connection = await this.pool.getConnection();
await connection.ping();
connection.release();
logger.info('Database connection pool created successfully');
} catch (error) {
logger.error('Database connection failed:', error);
throw error;
}
}
async disconnect() {
if (this.pool) {
await this.pool.end();
logger.info('Database connection pool closed');
}
}
async query(sql, params = []) {
try {
const [rows] = await this.pool.execute(sql, params);
return rows;
} catch (error) {
logger.error('Database query error:', error);
throw error;
}
}
async transaction(callback) {
const connection = await this.pool.getConnection();
try {
await connection.beginTransaction();
const result = await callback(connection);
await connection.commit();
return result;
} catch (error) {
await connection.rollback();
throw error;
} finally {
connection.release();
}
}
async healthCheck() {
try {
await this.query('SELECT 1 as health');
return true;
} catch (error) {
logger.error('Database health check failed:', error);
return false;
}
}
}
module.exports = new Database();