mysql.js 3.35 KB
const config = global.yoho.config.mysql;
const logger = global.yoho.logger;
const mysql = require('mysql');
const _ = require('lodash');

let sqlHelper = {
    database: config.database,
    _createPool(database) {
        database = database || 'mysql';
        this.pool = mysql.createPool(Object.assign(config.connect, {
            database
        }));
    },
    getConnection() {
        return new Promise((resolve, reject) => {
            this.pool.getConnection((connErr, connection) => {
                if (connErr) {
                    logger.error(connErr);
                    reject(connErr);
                } else {
                    resolve(connection);
                }
            });
        });
    },
    baseConenction(sql) {
        return new Promise((resolve, reject) => {
            this.getConnection().then(connection => {
                connection.query(sql, (queryErr, result) => {
                    connection.release();
                    if (queryErr) {
                        logger.error(queryErr);
                        reject(queryErr);
                    } else {
                        resolve(result);
                    }
                });
            });
        });
    },
    query(sql) {
        return this.baseConenction(sql);
    },
    delete(sql) {
        return this.baseConenction(sql).then(result => {
            return result.affectedRows;
        });
    },
    update(sql) {
        return this.baseConenction(sql).then(result => {
            return result.changedRows;
        });
    },
    insert(sql) {
        return this.baseConenction(sql).then(result => {
            return result.insertId;
        });
    },
    execute(sql) {
        return this.baseConenction(sql);
    },
    transaction(sqls) {
        return new Promise((resolve, reject) => {
            this.getConnection().then(connection => {
                let promises = _.map(sqls, sql => {
                    return new Promise((res, rej) => {
                        connection.query(sql, (queryErr, result) => {
                            if (queryErr) {
                                connection.rollback();
                                logger.error(queryErr);
                                rej(queryErr);
                            } else {
                                res(result);
                            }
                        });
                    });
                });

                Promise.all(promises).then(results => {
                    connection.commit(err => {
                        if (err) {
                            connection.rollback(() => {
                                connection.release();
                            });
                            reject();
                        } else {
                            connection.release();
                            resolve(results);
                        }
                    });
                }, () => {
                    reject();
                });
            });
        });
    },
    changeDatabase(database) {
        return new Promise(resolve => {
            this.pool.end(() => {
                this._createPool(database);
                resolve();
            });
        });
    },
    close() {
        this.pool.end(() => {
            logger.log('end');
        });
    }
};

sqlHelper._createPool();

module.exports = sqlHelper;