Здесь: Qt: Резервная копия pg_dump БД PostgreSQL в Windows я показала один из способов организации создания резервной копии базы данных.
Сейчас речь пойдет о восстановлении базы из бэкапа. Здесь тоже будем использовать пакетный файл для вызова pg_restore.
Про каталог bin, файл паролей pgpass написано в статье по ссылке выше.
//name - имя базы данных
//file - файл резервной копии
void myClass::restoreDatabase(QString name, QString file)
{
QString errorMsg;
QString connectionName = connectToDB(name, errorMsg);
if (connectionName.isEmpty()){
error(errorMsg);
return;
}
QString binDir = postgresBinDirectory();
if (binDir.isEmpty()) {
error(tr("Системный каталог bin сервера не найден. Операция "
"восстановления базы данных %1 из резервной копии %2 прервана")
.arg(name).arg(file));
QSqlDatabase::removeDatabase(connectionName);
return;
}
QSqlQuery query(QSqlDatabase::database(connectionName));
//сначала удаляем схему (у меня паблик),
//затем ее снова создаем - чистенькую
if (!query.exec(QString("DROP SCHEMA public cascade; "
"CREATE SCHEMA public "
"AUTHORIZATION postgres; "
"COMMENT ON SCHEMA public "
"IS 'standard public schema'; "
"GRANT ALL ON SCHEMA public TO PUBLIC; "
"GRANT ALL ON SCHEMA public TO %1;")
.arg(postgresUser))) {
error(tr("Ошибка удаления схемы базы данных %1: %2")
.arg(name).arg(query.lastError().text()));
QSqlDatabase::removeDatabase(connectionName);
return;
}
QSqlDatabase::removeDatabase(connectionName);
//текст batch-файла
QString batText = QString("@ECHO OFF \n"
"SET dmpfile=%1 \n"
"set text = Begin to restore... \n"
"echo %text% \n"
"cd /d %2 \n"
"pg_restore --host=%4 --port=%5 "
"--username=%6 --verbose -d "
" %3 \"%dmpfile%\"\n"
"set /p id=\"The process is finished successfully. "
"Press Enter to exit...\"")
.arg(file, binDir, name,
host, ui->port->text(), postgresUser);
QString fileName = QString("%1-restore.bat")
.arg(name);
if (!writeBatFile(batText, fileName,
QCoreApplication::applicationDirPath()+"/temp"))
return;
//обновляем файл паролей, если нужно
updatePgPassFile(QString("%1:%2:%3:%4:%5")
.arg(host,
ui->port->text(),
name,
postgresUser,
ui->password->text()));
//вызываем пакетный файл для выполнения восстановления базы данных
system(qPrintable("cmd.exe /c \""+
QDir::toNativeSeparators(
QString("%1/%2")
.arg(QCoreApplication::applicationDirPath()+"/temp")
.arg(fileName)+"\"")));
}