52 lines
1.5 KiB
TypeScript
52 lines
1.5 KiB
TypeScript
/**
|
|
* Die Verbindungsangaben für `pg_dump` und `pg_restore`.
|
|
*
|
|
* Eigene Datei, weil beide Skripte sie brauchen — und weil ein falsch
|
|
* zerlegter Zugang der unangenehmste Fehler in einem Sicherungsskript wäre:
|
|
* es liefe durch, schriebe eine Datei, und die enthielte die falsche
|
|
* Datenbank. Auffallen würde es beim Zurückspielen, also genau dann, wenn man
|
|
* die Sicherung braucht.
|
|
*/
|
|
|
|
export interface Zugang {
|
|
benutzer: string;
|
|
passwort: string;
|
|
datenbank: string;
|
|
}
|
|
|
|
/**
|
|
* Zerlegt eine Verbindungszeichenkette in ihre Teile.
|
|
*
|
|
* Die URL lässt sich nicht als Ganzes an `pg_dump` durchreichen: Prisma hängt
|
|
* eigene Parameter an (`?schema=public`), die es mit "invalid URI query
|
|
* parameter" ablehnt. Und der Port darin gilt vom Rechner aus — im Container,
|
|
* wo die Werkzeuge laufen, liegt Postgres auf 5432.
|
|
*/
|
|
export function zugangAus(roh: string | undefined): Zugang {
|
|
if (!roh) {
|
|
throw new Error("DIRECT_DATABASE_URL fehlt.");
|
|
}
|
|
|
|
let url: URL;
|
|
try {
|
|
url = new URL(roh);
|
|
} catch {
|
|
throw new Error(`Die Verbindungszeichenkette ist keine gültige URL: ${roh}`);
|
|
}
|
|
|
|
if (!url.protocol.startsWith("postgres")) {
|
|
throw new Error(`Erwartet wird eine postgresql://-Adresse, bekommen: ${url.protocol}//`);
|
|
}
|
|
|
|
const datenbank = url.pathname.replace(/^\//, "");
|
|
if (!datenbank) {
|
|
throw new Error("In der Verbindungszeichenkette fehlt der Datenbankname.");
|
|
}
|
|
|
|
return {
|
|
benutzer: decodeURIComponent(url.username),
|
|
passwort: decodeURIComponent(url.password),
|
|
datenbank,
|
|
};
|
|
}
|