/** * 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, }; }