apemandb
Version:
Database for apeman project.
59 lines (54 loc) • 1.93 kB
JavaScript
/**
* @function setupDatabase
* @param {string} dialect
* @param {string} rootUsername - Username of root
* @param {string} rootPassword - Password of root
* @param {Object} config - Database config
*/
const co = require('co')
const { exec } = require('child_process')
/** @lends setupDatabase */
function setupDatabase (dialect, rootUsername, rootPassword, config) {
return co(function * () {
switch (dialect) {
case 'sqlite':
return
case 'mysql':
yield setupDatabase.setupMysqlUser(rootUsername, rootPassword, config)
return
default:
throw new Error(`[apemandb] Setup is not available for dialect: ${dialect}`)
}
})
}
Object.assign(setupDatabase, {
setupMysqlUser (rootUsername = process.env.MYSQL_ROOT_USERNAME,
rootPassword = process.env.MYSQL_ROOT_PASSWORD,
config = {}) {
const escape = (value) => `${'\\`'}${value}${'\\`'}`
return co(function * () {
let { username, password, database, host = 'localhost', port } = config
rootUsername = rootUsername || config.rootUsername || 'root'
rootPassword = rootPassword || config.rootPassword
let sql = `CREATE DATABASE IF NOT EXISTS ${database}; GRANT ALL ON ${escape(database)}.* TO '${username}'@'%' IDENTIFIED BY '${password}'`
let command = `mysql -u${rootUsername} --host=${host} ${host === 'localhost' ? '' : '--protocol=tcp '}-e"${sql}"`
let env = Object.assign({}, process.env)
if (rootPassword) {
env.MYSQL_PWD = rootPassword
}
let { stdout, stderr } = yield new Promise((resolve, reject) =>
exec(command, { env }, (err, stdout, stderr) =>
err ? reject(err) : resolve({ stdout, stderr })
)
)
if (stdout) {
console.log(stdout)
}
if (stderr) {
console.error(stderr)
}
})
}
})
module.exports = setupDatabase