File indexing completed on 2025-03-09 03:52:59

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2010-01-08
0007  * Description : database server starter
0008  *
0009  * SPDX-FileCopyrightText: 2009-2010 by Holger Foerster <Hamsi2k at freenet dot de>
0010  * SPDX-FileCopyrightText: 2016      by Swati Lodha <swatilodha27 at gmail dot com>
0011  *
0012  * SPDX-License-Identifier: GPL-2.0-or-later
0013  *
0014  * ============================================================ */
0015 
0016 #include "databaseserverstarter.h"
0017 
0018 // Qt includes
0019 
0020 #include <QSystemSemaphore>
0021 
0022 // Local includes
0023 
0024 #include "digikam_debug.h"
0025 #include "databaseserver.h"
0026 
0027 namespace Digikam
0028 {
0029 
0030 class Q_DECL_HIDDEN DatabaseServerStarter::Private
0031 {
0032 public:
0033 
0034     explicit Private()
0035         : internalServer(nullptr)
0036     {
0037     }
0038 
0039     DatabaseServer* internalServer;
0040 };
0041 
0042 // -----------------------------------------------------------------------------------------------
0043 
0044 class Q_DECL_HIDDEN DatabaseServerStarterCreator
0045 {
0046 public:
0047 
0048     DatabaseServerStarter object;
0049 };
0050 
0051 Q_GLOBAL_STATIC(DatabaseServerStarterCreator, databaseServerStarterCreator)
0052 
0053 // -----------------------------------------------------------------------------------------------
0054 
0055 DatabaseServerStarter::DatabaseServerStarter()
0056     : d(new Private)
0057 {
0058 }
0059 
0060 DatabaseServerStarter::~DatabaseServerStarter()
0061 {
0062     delete d;
0063 }
0064 
0065 DatabaseServerStarter* DatabaseServerStarter::instance()
0066 {
0067     return &databaseServerStarterCreator->object;
0068 }
0069 
0070 DatabaseServerError DatabaseServerStarter::startServerManagerProcess(const DbEngineParameters& parameters) const
0071 {
0072     DatabaseServerError result;
0073 
0074     d->internalServer = new DatabaseServer(parameters);
0075 
0076     QSystemSemaphore sem(QLatin1String("DigikamDBSrvAccess"), 1, QSystemSemaphore::Open);
0077     sem.acquire();
0078 
0079     result            = d->internalServer->startDatabaseProcess();
0080 
0081     if (result.getErrorType() != DatabaseServerError::NoErrors)
0082     {
0083         qCDebug(DIGIKAM_DATABASESERVER_LOG) << "Cannot start internal database server";
0084     }
0085     else
0086     {
0087         qCDebug(DIGIKAM_DATABASESERVER_LOG) << "Internal database server started";
0088         d->internalServer->start();
0089     }
0090 
0091     sem.release();
0092 
0093     return result;
0094 }
0095 
0096 void DatabaseServerStarter::stopServerManagerProcess()
0097 {
0098     if (!d->internalServer)
0099     {
0100         return;
0101     }
0102 
0103     QSystemSemaphore sem(QLatin1String("DigikamDBSrvAccess"), 1, QSystemSemaphore::Open);
0104     sem.acquire();
0105 
0106     d->internalServer->stopDatabaseProcess();
0107     d->internalServer = nullptr;
0108 
0109     sem.release();
0110 
0111     qCDebug(DIGIKAM_DATABASESERVER_LOG) << "Internal database server stopped";
0112 }
0113 
0114 } // namespace Digikam
0115 
0116 #include "moc_databaseserverstarter.cpp"