+ print $pgpass "$form->{dbhost}:$form->{dbport}:$form->{new_dbname}:$form->{dbuser}:$form->{dbpasswd}\n";
+ $pgpass->close();
+
+ $ENV{HOME} = $tmpdir;
+
+ my $tmp = $tmpdir . "/dump_" . Common::unique_id();
+ my $tmpfile;
+
+ if (substr($form->{content}, 0, 2) eq "\037\213") {
+ $tmpfile = IO::File->new("| gzip -d > $tmp");
+ $tmpfile->binary();
+
+ } else {
+ $tmpfile = IO::File->new($tmp, O_WRONLY | O_CREAT | O_BINARY, 0600);
+ }
+
+ if (!$tmpfile) {
+ unlink "${tmpdir}/.pgpass";
+ rmdir $tmpdir;
+
+ $form->error($locale->text('A temporary file could not be created:') . " $ERRNO");
+ }
+
+ print $tmpfile $form->{content};
+ $tmpfile->close();
+
+ delete $form->{content};
+
+ # Try to connect to the database. Find out if a database with the same name exists.
+ # If yes, then drop the existing database. Create a new one with the name and encoding
+ # given by the user.
+
+ User::dbconnect_vars($form, "template1");
+
+ my %myconfig = map { $_ => $form->{$_} } grep /^db/, keys %{ $form };
+ my $dbh = $form->dbconnect(\%myconfig) || $form->dberror();
+
+ my ($query, $sth);
+
+ $form->{new_dbname} =~ s|[^a-zA-Z0-9_\-]||g;
+
+ $query = qq|SELECT COUNT(*) FROM pg_database WHERE datname = ?|;
+ my ($count) = selectrow_query($form, $dbh, $query, $form->{new_dbname});
+ if ($count) {
+ do_query($form, $dbh, qq|DROP DATABASE $form->{new_dbname}|);
+ }
+
+ my $found = 0;
+ foreach my $item (@Common::db_encodings) {
+ if ($item->{dbencoding} eq $form->{dbencoding}) {
+ $found = 1;
+ last;
+ }
+ }
+ $form->{dbencoding} = "LATIN9" unless $form->{dbencoding};
+
+ do_query($form, $dbh, qq|CREATE DATABASE $form->{new_dbname} ENCODING ? TEMPLATE template0|, $form->{dbencoding});
+
+ $dbh->disconnect();
+
+ # Spawn pg_restore on the temporary file.
+
+ my @args = ("-h", $form->{dbhost}, "-U", $form->{dbuser}, "-d", $form->{new_dbname});
+ push @args, ("-p", $form->{dbport}) if ($form->{dbport});
+ push @args, $tmp;
+
+ my $cmd = "$pg_restore_exe " . join(" ", map { s/\\/\\\\/g; s/\"/\\\"/g; $_ } @args);
+
+ my $in = IO::File->new("$cmd 2>&1 |");