+ $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 |");
+
+ if (!$in) {
+ unlink "${tmpdir}/.pgpass", $tmp;
+ rmdir $tmpdir;
+
+ $form->error($locale->text('The pg_restore process could not be started.'));
+ }
+
+ $AUTOFLUSH = 1;