84 lines
1.9 KiB
JavaScript

'use strict';
// Public node modules
const inquirer = require('inquirer');
const hasResults = rows => {
if (!rows || rows.length === 0) return true;
return false;
};
const checkDatabaseIsEmpty = {
postgres: client =>
client
.select('tablename')
.from('pg_tables')
.where('schemaname', 'public')
.then(hasResults),
mysql: (client, { database }) =>
client
.select()
.from('information_schema.tables')
.where('table_schema', database)
.then(hasResults),
sqlite: client =>
client
.select()
.from('sqlite_master')
.then(hasResults),
};
module.exports = async ({ scope, connection }) => {
const knex = require('knex');
const { settings } = connection;
const client = knex({
client: settings.client,
connection: Object.assign({}, settings, {
user: settings.username,
}),
useNullAsDefault: true,
});
const destroyClientAndThrow = err => {
return client.destroy().then(
() => {
throw err;
},
() => {
throw err;
}
);
};
await client.raw('select 1+1 as result').catch(destroyClientAndThrow);
return checkDatabaseIsEmpty[settings.client](client, settings)
.then(isEmpty => {
if (isEmpty) return;
if (scope.dbforce) return;
console.log();
console.error(
'It seems that your database is not empty.\nStrapi automatically creates tables and columns which might corrupt the data already present in your database.'
);
return inquirer
.prompt([
{
type: 'confirm',
name: 'confirm',
message: `Are you sure you want to continue with the ${settings.database} database:`,
},
])
.then(({ confirm }) => {
// send restart flag to retry
if (!confirm) return { shouldRetry: true };
});
})
.then(res => client.destroy().then(() => res))
.catch(destroyClientAndThrow);
};