UNPKG

adba

Version:
63 lines (62 loc) 3.26 kB
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;