@launchql/cli
Version:
LaunchQL CLI
62 lines (61 loc) âĸ 2.27 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const server_utils_1 = require("@launchql/server-utils");
const log = new server_utils_1.Logger('db-kill');
exports.default = async (argv, prompter, _options) => {
const db = await (0, server_utils_1.getRootPgPool)({
database: 'postgres'
});
const databasesResult = await db.query(`
SELECT datname FROM pg_catalog.pg_database
WHERE datistemplate = FALSE AND datname NOT IN ('postgres')
AND datname !~ '^pg_';
`);
if (!databasesResult.rows.length) {
log.info('âšī¸ No databases found to process. Exiting.');
return;
}
let databases;
({ databases } = await prompter.prompt(argv, [
{
type: 'checkbox',
name: 'databases',
message: 'Select database(s) to terminate connections and optionally drop',
options: databasesResult.rows.map(row => row.datname),
required: true
}
]));
const selectedDbNames = databases.filter(d => d.selected).map(d => d.value);
const { yes } = await prompter.prompt(argv, [
{
type: 'confirm',
name: 'yes',
message: `Are you sure you want to kill connections${argv.drop === false ? '' : ' and DROP'}: ${selectedDbNames.join(', ')}?`,
default: false
}
]);
if (!yes) {
log.info('â Aborted. No actions were taken.');
return;
}
for (const dbname of selectedDbNames) {
const killResult = await db.query(`
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = $1 AND pid <> pg_backend_pid();
`, [dbname]);
log.warn(`đ Terminated ${killResult.rowCount} connection(s) to "${dbname}".`);
if (argv.drop === false) {
log.info(`â ī¸ Skipping DROP for "${dbname}" due to --no-drop flag.`);
continue;
}
try {
await db.query(`DROP DATABASE "${dbname}";`);
log.success(`đī¸ Dropped database "${dbname}" successfully.`);
}
catch (err) {
log.error(`â Failed to drop "${dbname}": ${err.message}`);
}
}
log.success('â
Done processing databases.');
};