168 lines
22 KiB
JavaScript
168 lines
22 KiB
JavaScript
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||
|
return new (P || (P = Promise))(function (resolve, reject) {
|
||
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||
|
});
|
||
|
};
|
||
|
import mysql from 'mysql';
|
||
|
import config from 'config';
|
||
|
import Logger from "../Logger";
|
||
|
export function query(queryString, values, connection) {
|
||
|
return __awaiter(this, void 0, void 0, function* () {
|
||
|
return yield MysqlConnectionManager.query(queryString, values, connection);
|
||
|
});
|
||
|
}
|
||
|
export default class MysqlConnectionManager {
|
||
|
static registerMigration(migration) {
|
||
|
this.migrations.push(migration(this.migrations.length + 1));
|
||
|
}
|
||
|
static prepare() {
|
||
|
return __awaiter(this, void 0, void 0, function* () {
|
||
|
if (config.get('mysql.create_database_automatically') === true) {
|
||
|
const dbName = config.get('mysql.database');
|
||
|
Logger.info(`Creating database ${dbName}...`);
|
||
|
const connection = mysql.createConnection({
|
||
|
host: config.get('mysql.host'),
|
||
|
user: config.get('mysql.user'),
|
||
|
password: config.get('mysql.password'),
|
||
|
});
|
||
|
yield new Promise((resolve, reject) => {
|
||
|
connection.query(`CREATE DATABASE IF NOT EXISTS ${dbName}`, (error) => {
|
||
|
if (error !== null) {
|
||
|
reject(error);
|
||
|
}
|
||
|
else {
|
||
|
resolve();
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
connection.end();
|
||
|
Logger.info(`Database ${dbName} created!`);
|
||
|
}
|
||
|
this.databaseReady = true;
|
||
|
yield this.handleMigrations();
|
||
|
});
|
||
|
}
|
||
|
static get pool() {
|
||
|
if (this.currentPool === undefined) {
|
||
|
this.currentPool = this.createPool();
|
||
|
}
|
||
|
return this.currentPool;
|
||
|
}
|
||
|
static createPool() {
|
||
|
return mysql.createPool({
|
||
|
connectionLimit: config.get('mysql.connectionLimit'),
|
||
|
host: config.get('mysql.host'),
|
||
|
user: config.get('mysql.user'),
|
||
|
password: config.get('mysql.password'),
|
||
|
database: config.get('mysql.database'),
|
||
|
});
|
||
|
}
|
||
|
static endPool() {
|
||
|
return __awaiter(this, void 0, void 0, function* () {
|
||
|
return new Promise(resolve => {
|
||
|
if (this.currentPool !== undefined) {
|
||
|
this.currentPool.end(() => {
|
||
|
Logger.info('Mysql connection pool ended.');
|
||
|
resolve();
|
||
|
});
|
||
|
this.currentPool = undefined;
|
||
|
}
|
||
|
else {
|
||
|
resolve();
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
static query(queryString, values, connection) {
|
||
|
return __awaiter(this, void 0, void 0, function* () {
|
||
|
return yield new Promise((resolve, reject) => {
|
||
|
Logger.dev('Mysql query:', queryString, '; values:', values);
|
||
|
(connection ? connection : this.pool).query(queryString, values, (error, results, fields) => {
|
||
|
if (error !== null) {
|
||
|
reject(error);
|
||
|
return;
|
||
|
}
|
||
|
resolve({
|
||
|
results: Array.isArray(results) ? results : [],
|
||
|
fields: fields !== undefined ? fields : [],
|
||
|
other: Array.isArray(results) ? null : results
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
static wrapTransaction(transaction) {
|
||
|
return __awaiter(this, void 0, void 0, function* () {
|
||
|
return yield new Promise((resolve, reject) => {
|
||
|
this.pool.getConnection((err, connection) => {
|
||
|
if (err) {
|
||
|
reject(err);
|
||
|
return;
|
||
|
}
|
||
|
connection.beginTransaction((err) => {
|
||
|
if (err) {
|
||
|
reject(err);
|
||
|
this.pool.releaseConnection(connection);
|
||
|
return;
|
||
|
}
|
||
|
transaction(connection).then(val => {
|
||
|
connection.commit((err) => {
|
||
|
if (err) {
|
||
|
this.rejectAndRollback(connection, err, reject);
|
||
|
this.pool.releaseConnection(connection);
|
||
|
return;
|
||
|
}
|
||
|
this.pool.releaseConnection(connection);
|
||
|
resolve(val);
|
||
|
});
|
||
|
}).catch(err => {
|
||
|
this.rejectAndRollback(connection, err, reject);
|
||
|
this.pool.releaseConnection(connection);
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
static rejectAndRollback(connection, err, reject) {
|
||
|
connection.rollback((rollbackErr) => {
|
||
|
if (rollbackErr) {
|
||
|
reject(err + '\n' + rollbackErr);
|
||
|
}
|
||
|
else {
|
||
|
reject(err);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
static handleMigrations() {
|
||
|
return __awaiter(this, void 0, void 0, function* () {
|
||
|
let currentVersion = 0;
|
||
|
try {
|
||
|
const result = yield query('SELECT id FROM migrations ORDER BY id DESC LIMIT 1');
|
||
|
currentVersion = result.results[0].id;
|
||
|
}
|
||
|
catch (e) {
|
||
|
if (e.code === 'ECONNREFUSED' || e.code !== 'ER_NO_SUCH_TABLE') {
|
||
|
throw new Error('Cannot run migrations: ' + e.code);
|
||
|
}
|
||
|
}
|
||
|
for (const migration of this.migrations) {
|
||
|
if (yield migration.shouldRun(currentVersion)) {
|
||
|
Logger.info('Running migration ', migration.version, migration.constructor.name);
|
||
|
yield migration.install();
|
||
|
yield query('INSERT INTO migrations VALUES(?, ?, NOW())', [
|
||
|
migration.version,
|
||
|
migration.constructor.name,
|
||
|
]);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
MysqlConnectionManager.databaseReady = false;
|
||
|
MysqlConnectionManager.migrations = [];
|
||
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXlzcWxDb25uZWN0aW9uTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIuLyIsInNvdXJjZXMiOlsiZGIvTXlzcWxDb25uZWN0aW9uTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEtBQW9DLE1BQU0sT0FBTyxDQUFDO0FBQ3pELE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLE1BQU0sTUFBTSxXQUFXLENBQUM7QUFTL0IsTUFBTSxVQUFnQixLQUFLLENBQUMsV0FBbUIsRUFBRSxNQUFZLEVBQUUsVUFBdUI7O1FBQ2xGLE9BQU8sTUFBTSxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMvRSxDQUFDO0NBQUE7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLHNCQUFzQjtJQUtoQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsU0FBeUM7UUFDckUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVNLE1BQU0sQ0FBTyxPQUFPOztZQUN2QixJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMscUNBQXFDLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQzVELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsTUFBTSxLQUFLLENBQUMsQ0FBQztnQkFDOUMsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO29CQUN0QyxJQUFJLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUM7b0JBQzlCLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQztvQkFDOUIsUUFBUSxFQUFFLE1B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
|