adba
Version:
Any DataBase to API
63 lines (62 loc) • 3.26 kB
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 { exec } from 'child_process';
import { promisify } from 'util';
import fs from 'fs';
import path from 'path';
const execAsync = promisify(exec);
/**
* Dump database structure and data using CLI tools.
* @param knexInstance Connected knex instance
* @param dumpDir Directory where dump files will be stored
* @returns Paths to created files
*/
export function dumpDatabase(knexInstance, dumpDir) {
return __awaiter(this, void 0, void 0, function* () {
const client = (knexInstance.client.config.client || '').toLowerCase();
const connection = knexInstance.client.config.connection;
yield fs.promises.mkdir(dumpDir, { recursive: true });
const schemaFile = path.join(dumpDir, 'schema.sql');
const fullFile = path.join(dumpDir, 'schema_data.sql');
switch (client) {
case 'sqlite':
case 'sqlite3': {
const filename = connection.filename;
yield execAsync(`sqlite3 "${filename}" .schema > "${schemaFile}"`);
yield execAsync(`sqlite3 "${filename}" .dump > "${fullFile}"`);
break;
}
case 'mysql':
case 'mysql2': {
const { host = 'localhost', user, password = '', port, database } = connection;
const cred = `-h ${host} -u ${user}`;
const portOpt = port ? ` -P ${port}` : '';
const passOpt = password ? ` -p${password}` : '';
yield execAsync(`mysqldump --routines --triggers --no-data ${cred}${portOpt}${passOpt} ${database} > "${schemaFile}"`);
yield execAsync(`mysqldump --routines --triggers ${cred}${portOpt}${passOpt} ${database} > "${fullFile}"`);
break;
}
case 'pg':
case 'postgres':
case 'postgresql': {
const { host = 'localhost', user, password = '', port, database } = connection;
const env = Object.assign(Object.assign({}, process.env), { PGPASSWORD: password });
const portOpt = port ? ` -p ${port}` : '';
yield execAsync(`pg_dump --schema-only -h ${host}${portOpt} -U ${user} ${database} > "${schemaFile}"`, { env });
yield execAsync(`pg_dump -h ${host}${portOpt} -U ${user} ${database} > "${fullFile}"`, { env });
break;
}
default:
throw new Error(`Dump not implemented for client ${client}`);
}
return { schemaFile, fullFile };
});
}
export default dumpDatabase;