Do not use mysql command for setting up databases
This commit is contained in:
parent
b93afd4f9f
commit
873d88658c
7 changed files with 94 additions and 49 deletions
14
setup/sql/init.js
Normal file
14
setup/sql/init.js
Normal file
|
@ -0,0 +1,14 @@
|
|||
'use strict';
|
||||
|
||||
let dbcheck = require('../../lib/dbcheck');
|
||||
let log = require('npmlog');
|
||||
|
||||
log.level = 'verbose';
|
||||
|
||||
dbcheck(err => {
|
||||
if (err) {
|
||||
log.error('DB', err);
|
||||
return process.exit(1);
|
||||
}
|
||||
return process.exit(0);
|
||||
});
|
|
@ -221,7 +221,7 @@ CREATE TABLE `users` (
|
|||
KEY `check_reset` (`username`(191),`reset_token`,`reset_expire`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
LOCK TABLES `settings` WRITE;
|
||||
LOCK TABLES `users` WRITE;
|
||||
INSERT INTO `users` VALUES (1,'admin','$2a$10$mzKU71G62evnGB2PvQA4k..Wf9jASk.c7a8zRMHh6qQVjYJ2r/g/K','admin@example.com',NULL,NULL,'2016-04-20 17:20:48');
|
||||
UNLOCK TABLES;
|
||||
|
||||
|
|
184
setup/sql/sql.js
184
setup/sql/sql.js
|
@ -1,184 +0,0 @@
|
|||
'use strict';
|
||||
|
||||
let config = require('config');
|
||||
let mysql = require('mysql');
|
||||
let db = require('../../lib/db');
|
||||
let spawn = require('child_process').spawn;
|
||||
let settings = require('../../lib/models/settings');
|
||||
let log = require('npmlog');
|
||||
let fs = require('fs');
|
||||
let pathlib = require('path');
|
||||
let Handlebars = require('handlebars');
|
||||
|
||||
log.level = 'verbose';
|
||||
|
||||
function listTables(callback) {
|
||||
db.getConnection((err, connection) => {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
let query = 'SHOW TABLES';
|
||||
connection.query(query, (err, rows) => {
|
||||
connection.release();
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
let tables = {};
|
||||
[].concat(rows || []).forEach(row => {
|
||||
let name;
|
||||
let table;
|
||||
Object.keys(row).forEach(key => {
|
||||
if (/^Tables_in_/i.test(key)) {
|
||||
table = name = row[key];
|
||||
}
|
||||
});
|
||||
if (/__\d+$/.test(name)) {
|
||||
let parts = name.split('__');
|
||||
parts.pop();
|
||||
table = parts.join('__');
|
||||
}
|
||||
if (tables.hasOwnProperty(table)) {
|
||||
tables[table].push(name);
|
||||
} else {
|
||||
tables[table] = [name];
|
||||
}
|
||||
return table;
|
||||
});
|
||||
return callback(null, tables);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function getSchemaVersion(callback) {
|
||||
settings.list(['db_schema_version'], (err, configItems) => {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
let dbSchemaVersion = Number(configItems.dbSchemaVersion) || 0;
|
||||
|
||||
callback(null, dbSchemaVersion);
|
||||
});
|
||||
}
|
||||
|
||||
function listUpdates(current, callback) {
|
||||
current = current || 0;
|
||||
fs.readdir(__dirname, (err, list) => {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
let updates = [];
|
||||
[].concat(list || []).forEach(row => {
|
||||
if (/^upgrade-\d+\.sql$/i.test(row)) {
|
||||
let seq = row.match(/\d+/)[0];
|
||||
if (seq > current) {
|
||||
updates.push({
|
||||
seq: Number(seq),
|
||||
path: pathlib.join(__dirname, row)
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return callback(null, updates);
|
||||
});
|
||||
}
|
||||
|
||||
function getSql(path, data, callback) {
|
||||
fs.readFile(path, 'utf-8', (err, source) => {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
let renderer = Handlebars.compile(source);
|
||||
return callback(null, renderer(data || {}));
|
||||
});
|
||||
}
|
||||
|
||||
function runInitial(callback) {
|
||||
let path = pathlib.join(__dirname, process.env.FROM_START ? 'base.sql' : 'mailtrain.sql');
|
||||
applyUpdate({
|
||||
path
|
||||
}, callback);
|
||||
}
|
||||
|
||||
function runUpdates(callback) {
|
||||
listTables((err, tables) => {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
if (!tables.settings) {
|
||||
log.info('sql', 'SQL not set up, initializing');
|
||||
return runInitial(callback);
|
||||
}
|
||||
|
||||
getSchemaVersion((err, schemaVersion) => {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
listUpdates(schemaVersion, (err, updates) => {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
let pos = 0;
|
||||
let runNext = () => {
|
||||
if (pos >= updates.length) {
|
||||
return callback(null, pos);
|
||||
}
|
||||
let update = updates[pos++];
|
||||
update.data = {
|
||||
tables
|
||||
};
|
||||
applyUpdate(update, (err, status) => {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
if (status) {
|
||||
log.info('sql', 'Update %s applied', update.seq);
|
||||
} else {
|
||||
log.info('sql', 'Update %s not applied', update.seq);
|
||||
}
|
||||
|
||||
runNext();
|
||||
});
|
||||
};
|
||||
|
||||
runNext();
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
function applyUpdate(update, callback) {
|
||||
getSql(update.path, update.data, (err, sql) => {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
let cmd = spawn(config.mysql.command || 'mysql', ['-h', config.mysql.host || 'localhost', '-P', config.mysql.port || 3306, '-u', config.mysql.user, '-p' + config.mysql.password, '-D', config.mysql.database]);
|
||||
|
||||
cmd.stdout.pipe(process.stdout);
|
||||
cmd.stderr.pipe(process.stderr);
|
||||
|
||||
cmd.on('close', code => {
|
||||
if (code) {
|
||||
return callback(new Error('mysql command exited with code ' + code));
|
||||
}
|
||||
return callback(null, true);
|
||||
});
|
||||
cmd.stdin.end(sql);
|
||||
});
|
||||
}
|
||||
|
||||
runUpdates(err => {
|
||||
if (err) {
|
||||
log.error('sql', err);
|
||||
process.exit(1);
|
||||
}
|
||||
log.info('sql', 'Database check completed');
|
||||
process.exit(0);
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue