79 lines
1.9 KiB
JavaScript
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();
|