Files
qt-migration-legatus/qt6-after/qt6-migrated-legatus/Lts/Services/OcBaseDownload/copy_database.cpp
T
torstenandCopilot b774f4035c Qt6 Migration: DDS-Stubs, Logger-Fixes, Export-Header Korrekturen
- NGL_ADD_LIBRARY2: 87 CMakeLists.txt konvertiert für Export-Header Generierung
- 44 Export-Header Include-Pfade korrigiert (_export.h)
- 81 DDS-Stub-Header generiert (*_dtc.h, *_fts.h, *_dts.h, *_ftc.h)
- INGLLogger: Duplikat gelöscht, m_logger Member entfernt, variadische Makros
- Q_FUNC_INFO Redefinition behoben (Qt6 definiert bereits)
- FATAL_LOG Makro hinzugefügt
- InfrastructureManagement DDS-Stubs (ism.hpp, ism_enums.hpp, ism_ftc.h)
- FilterManagement DDS-Stubs (flt_ftc.h, flt_dts.h)
- AreaEffectSimulation DDS-Stubs (aes.hpp, aes_enums.hpp)
- SymbolAppearance Klasse vollständig definiert mit content() Methode
- BuildingComponentFilter Klasse definiert mit Copy-Konstruktor
- Ftc Factory: nullptr Return (abstract class)
- AesFilter Klasse in aes.hpp hinzugefügt
- Dtc Klasse in ppm.hpp mit participantChanged Signal
- AesType Enum: alle 15 At* Werte definiert
- AesEffectState_def: EsReceived hinzugefügt
- DataModification Enum: eAdded/eModified/eRemoved
- function_reply_object.h → core_types.h Include-Pfad (72 Dateien)
- Enum-Class-Streaming Template-Operator in INGLLogger.h
- ism_mounting_point.h: QImage → QtGui/QImage, QGuiApplication/QScreen
- ism_data_plugin_interface.h: QSet Include, Include-Reihenfolge
- QRegExp → QRegularExpression in tpm_js_parser.cpp
- .underlying() Aufrufe zu direktem Enum-Vergleich korrigiert
- Include-Pfade: aes.hpp in symbol_appearance_settings_impl.h und aes_display_filter_impl.h

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-08-19 06:06:24 +02:00

271 lines
7.3 KiB
C++
Executable File

/*
* @RDE_HEADER@
* Copy exercise from server to evaluation server
* $Id$
* $HeadURL$
* $Author$
* Created by Christian Ehrlicher, NLSE, 2018-07-31
*/
#include "copy_database.h"
#include <ngldb/dbcommon.h>
#include <ngldb/dbconnection.h>
#include <ngldb/nsqlquery.h>
#include <ngltools/ngltools_filesystem.h>
#include <QDir>
#include <QFile>
#include <QProcess>
#include <QSettings>
namespace OcBaseDownload
{
CopyDatabase::CopyDatabase(NGL::INGLLogger &logger, QObject *parent)
: QObject(parent)
, m_proc(nullptr)
, m_logger(logger)
{}
bool CopyDatabase::init(const QString &dbHost, const QString &srcDbName, const QString &dstDbName)
{
m_dbHost = dbHost;
m_srcDbName = srcDbName;
m_dstDbName = dstDbName;
return true;
}
bool CopyDatabase::doCopy()
{
if (!runPgDump())
{
ERROR_LOG() << "Error running pg_dump";
emit copyDbFailed();
return false;
}
return true;
}
bool CopyDatabase::dropDatabase(const QString &dbName)
{
return runDropDb(dbName);
}
bool CopyDatabase::runDropDb(const QString &dbName)
{
const QStringList args({QStringLiteral("-U"),
QStringLiteral("postgres"),
QStringLiteral("--if-exists"),
QStringLiteral("-h"),
m_dbHost,
dbName});
handleProcInit(executablePath(QStringLiteral("dropdb")), args);
connect(m_proc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
this, &CopyDatabase::onDropDbFinished);
m_proc->start();
return true;
}
void CopyDatabase::onDropDbFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
NOTICE_LOG(m_logger) << "onDropDbFinished: exitCode: " << exitCode << ", exitStatus: " << exitStatus;
if (exitCode > 0)
{
ERROR_LOG() << "DropDb failed";
emit dropDatabaseFailed();
return;
}
emit dropDatabaseFinished();
}
bool CopyDatabase::runPgDump()
{
// start process
const QStringList args(
{
QStringLiteral("--column-inserts"),
QStringLiteral("-U"), QStringLiteral("postgres"),
QStringLiteral("-f"), getDumpFile(),
QStringLiteral("-h"), m_dbHost,
m_srcDbName
});
handleProcInit(executablePath(QStringLiteral("pg_dump")), args);
connect(m_proc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
this, &CopyDatabase::onPgDumpFinished);
m_proc->start();
return true;
}
void CopyDatabase::onPgDumpFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
NOTICE_LOG(m_logger) << "onProcessFinished: exitCode: " << exitCode << ", exitStatus: " << exitStatus;
runCreatedb();
}
void CopyDatabase::runCreatedb()
{
const QStringList args({QStringLiteral("-U"),
QStringLiteral("postgres"),
QStringLiteral("-h"),
m_dbHost,
m_dstDbName});
handleProcInit(executablePath(QStringLiteral("createdb")), args);
connect(m_proc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
this, &CopyDatabase::onCreateDbFinished);
m_proc->start();
}
void CopyDatabase::onCreateDbFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
NOTICE_LOG(m_logger) << "onCreateDbFinished: exitCode: " << exitCode << ", exitStatus: " << exitStatus;
if (exitCode > 0)
{
ERROR_LOG() << "CreateDB failed";
emit copyDbFailed();
return;
}
runGrant();
//runPgLoad();
}
void CopyDatabase::runGrant()
{
const QString command = QStringLiteral("-c 'GRANT ALL ON DATABASE %1 to ets_exm'").arg(m_dstDbName);
const QStringList args({ QStringLiteral("-U"),
QStringLiteral("postgres"),
command,
QStringLiteral("-h"),
m_dbHost,
m_dstDbName });
handleProcInit(executablePath(QStringLiteral("psql")), args);
connect(m_proc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
this, &CopyDatabase::runPgLoad);
m_proc->start();
}
void CopyDatabase::runPgLoad()
{
const QStringList args({QStringLiteral("-U"),
QStringLiteral("postgres"),
QStringLiteral("-f"),
getDumpFile(),
QStringLiteral("-h"),
m_dbHost,
m_dstDbName});
handleProcInit(executablePath(QStringLiteral("psql")), args);
connect(m_proc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
this, &CopyDatabase::onPgLoadFinished);
m_proc->start();
}
void CopyDatabase::onPgLoadFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
NOTICE_LOG(m_logger) << "onPsqlFinished: exitCode: " << exitCode << ", exitStatus: " << exitStatus;
if (exitStatus == QProcess::ExitStatus::NormalExit)
QFile::remove(getDumpFile());
if (exitCode > 0)
{
ERROR_LOG() << "Loading db failed";
emit copyDbFailed();
return;
}
runPgSetGrant();
}
void CopyDatabase::runPgSetGrant()
{
const QStringList args({QStringLiteral("-U"),
QStringLiteral("postgres"),
QStringLiteral("-c"), QStringLiteral("GRANT ALL ON DATABASE %1 to ets_admin").arg(m_dstDbName),
QStringLiteral("-h"),
m_dbHost,
m_dstDbName});
handleProcInit(executablePath(QStringLiteral("psql")), args);
connect(m_proc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
this, &CopyDatabase::onPgSetGrantFinished);
m_proc->start();
}
void CopyDatabase::onPgSetGrantFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
NOTICE_LOG(m_logger) << "onPsqlFinished: exitCode: " << exitCode << ", exitStatus: " << exitStatus;
if (exitCode > 0)
{
ERROR_LOG() << "Set grants to ets_admin failed";
emit copyDbFailed();
return;
}
emit copyDbFinished();
}
void CopyDatabase::handleProcInit(const QString &program, const QStringList &args)
{
if (m_proc)
{
m_proc->disconnect(this);
m_proc->deleteLater();
}
m_proc = new QProcess(this);
NOTICE_LOG(m_logger) << "Starting process '" << program << "' with args '" << args.join(QLatin1Char(' ')) << "'";
m_proc->setProgram(program);
m_proc->setArguments(args);
connect(m_proc, &QProcess::errorOccurred,
this, &CopyDatabase::onErrorOccured);
}
void CopyDatabase::handleProcFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
if (!m_proc)
return;
if (exitCode != 0 || exitStatus != 0)
{
QByteArray out = m_proc->readAllStandardError();
if (!out.isEmpty())
out += '\n';
out += m_proc->readAllStandardOutput();
ERROR_LOG() << "Process finished - exitCode: " << exitCode << ", exitStatus = " << exitStatus << ", " << out;
}
m_proc->disconnect(this);
m_proc->deleteLater();
m_proc = nullptr;
}
void CopyDatabase::onErrorOccured(QProcess::ProcessError error)
{
ERROR_LOG() << "error: " << error << ", " << m_proc->readAllStandardOutput() << ", " << m_proc->readAllStandardError();
}
QString CopyDatabase::getDumpFile() const
{
return QDir::tempPath() + QLatin1Char('/') + m_srcDbName + QStringLiteral(".dump");
}
QString CopyDatabase::executablePath(const QString &program)
{
QString errStr;
const QString ret = NGL::postgresExecutablePath(program, errStr);
if (!errStr.isEmpty())
WARNING_LOG() << errStr;
return ret;
}
} // namespace DBAdministration