From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

# -----------------------------------------------------------------------------
=encoding utf8
=head1 NAME
Quiq::PostgreSql::PgDump - Wrapper für pg_dump
=head1 BASE CLASS
L<Quiq::Object>
=head1 SYNOPSIS
use Quiq::PostgreSql::PgDump;
Quiq::PostgreSql::PgDump->run($database,@opt);
=head1 DESCRIPTION
Die Klasse stellt einen Wrapper für den PostgreSQL-Client pg_dump dar.
=head1 EXAMPLE
$ perl -MQuiq::PostgreSql::PgDump -E 'Quiq::PostgreSql::PgDump->run("prod","--table","p_muster.admviews","--schema-only","--debug")'
=cut
# -----------------------------------------------------------------------------
use v5.10;
use strict;
our $VERSION = '1.225';
use Expect ();
# -----------------------------------------------------------------------------
=head1 METHODS
=head2 Klassenmethoden
=head3 run() - Rufe pg_dump ohne Passwortabfrage auf
=head4 Synopsis
$class->run($database,@opt);
=head4 Arguments
=over 4
=item $database
Name der Datenbank oder der Universal Database Locator (UDL).
Ist ein Name angegeben, muss in der Datenbank-Konfigurationsdatei
definiert sein.
=back
=head4 Options
Alle Optionen von C<pg_dump>, plus
=over 4
=item -debug => $bool (Default: 0)
Gib das ausgeführte pg_dump-Kommando auf STDOUT aus.
=back
=cut
# -----------------------------------------------------------------------------
sub run {
my ($class,$database) = splice @_,0,2;
# @_: @opt
my $stw = Quiq::Stopwatch->new;
# Options (alle anderen Argumente befinden sich auf @_)
my $debug = 0;
$class->parameters(1,\@_,
-debug => \$debug,
);
# Führe Operation aus
my $udl = Quiq::Udl->new($database);
if ($udl->dbms ne 'postgresql') {
$class->throw(
'PSQL-00001: Not a PostgeSQL UDL',
Udl => $udl->asString,
);
}
my $c = Quiq::CommandLine->new('pg_dump');
for my $opt (qw/user host port/) {
if (my $val = $udl->$opt) {
$c->addLongOption(
"--$opt" => $val,
);
}
}
$c->addBoolOption('--schema-only'=>1);
$c->addString("@_");
if (my $database = $udl->db) {
$c->addArgument($database);
}
my $cmd = $c->command;
if ($debug) {
say $cmd;
}
my $exp = Expect->new;
$exp->spawn($cmd) || do {
$class->throw(
'EXPECT-00099: Cannot spawn command',
Command => $cmd,
);
};
# Anmeldung. Wir unterscheiden drei Fälle.
my $interact = 0;
$exp->expect(3,[
# mit Passwort
-re => 'Password.*?:',sub {
my $exp = shift;
$exp->send($udl->password."\n");
$interact = 1;
},
],
#[
# # ohne Passwort
# -re => '^psql ',sub {
# $interact = 1;
# },
#],
[
# Verbindung kommt nicht zustande
-re => '^pg_dump:',sub {
# Ende der Kommunikation
},
]);
if ($interact) {
# Benutzer-Interaktion
$exp->interact;
}
printf "Duration: %s\n",$stw->elapsedReadable;
return;
}
# -----------------------------------------------------------------------------
=head1 VERSION
1.225
=head1 AUTHOR
Frank Seitz, L<http://fseitz.de/>
=head1 COPYRIGHT
Copyright (C) 2025 Frank Seitz
=head1 LICENSE
This code is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=cut
# -----------------------------------------------------------------------------
1;
# eof