@catladder/cli
Version:
Panter cli tool for cloud CI/CD and DevOps
62 lines (52 loc) • 1.7 kB
text/typescript
import { spawn } from "child-process-promise";
type Opts = {
targetPassword: string;
targetPort: number;
targetUsername: string;
sourceUsername: string;
sourcePassword: string;
sourcePort: number;
sourceDbName: string;
targetDbName: string;
};
export const spawnCopyDb = async (opts: Opts) => {
const script = createCopyDbScript(opts);
return await spawn(script, [], {
shell: "bash",
stdio: "inherit",
});
};
const createCopyDbScript = ({
targetPassword,
targetPort,
targetUsername,
sourceUsername,
sourcePassword,
sourcePort,
sourceDbName,
targetDbName,
}: Opts) => {
const targetPSQL = (command: string) =>
`PGPASSWORD=${targetPassword} psql -p ${targetPort} --host=localhost --user=${targetUsername} -q ${command}`;
// URL-encode credentials to handle special characters like @, :, /, etc.
const encodedSourceUsername = encodeURIComponent(sourceUsername);
const encodedSourcePassword = encodeURIComponent(sourcePassword);
const copyDBScript = `
set -e
dumptmp=$(mktemp /tmp/dump.XXXXXX)
echo "Dumping file to $dumptmp"
pg_dump --dbname=postgres://${encodedSourceUsername}:${encodedSourcePassword}@localhost:${sourcePort}/${sourceDbName} --no-owner --no-privileges > $dumptmp
echo "dump done"
${targetPSQL(
`-c 'drop database "${targetDbName}" WITH (FORCE)' 1> /dev/null || true`,
)}
${targetPSQL(`-c 'create database "${targetDbName}"' 1> /dev/null`)}
echo "Restoring dump..."
${targetPSQL(`"${targetDbName}" < $dumptmp 1> /dev/null`)}
echo "Clean up..."
set +e
rm $dumptmp
echo "\n🐱 Done!"
`;
return copyDBScript;
};