UNPKG

adba

Version:
69 lines (68 loc) 3.62 kB
"use strict"; 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()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.dumpDatabase = dumpDatabase; const child_process_1 = require("child_process"); const util_1 = require("util"); const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const execAsync = (0, util_1.promisify)(child_process_1.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 */ 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_1.default.promises.mkdir(dumpDir, { recursive: true }); const schemaFile = path_1.default.join(dumpDir, 'schema.sql'); const fullFile = path_1.default.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 }; }); } exports.default = dumpDatabase;