1 /* ============================================================
2  *
3  * This file is a part of digiKam project
4  * https://www.digikam.org
5  *
6  * Date        : 2010-06-21
7  * Description : CLI test program for switch digiKam DB from sqlite to mysql
8  *
9  * Copyright (C) 2014-2021 by Gilles Caulier, <caulier dot gilles at gmail dot com>
10  *
11  * This program is free software; you can redistribute it
12  * and/or modify it under the terms of the GNU General
13  * Public License as published by the Free Software Foundation;
14  * either version 2, or (at your option)
15  * any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  *
22  * ============================================================ */
23 
24 // Qt includes
25 
26 #include <QApplication>
27 #include <QDir>
28 #include <QSqlDatabase>
29 #include <QString>
30 #include <QTimer>
31 #include <QTest>
32 #include <QCommandLineParser>
33 
34 // KDE includes
35 
36 #include <kaboutdata.h>
37 
38 // Local includes
39 
40 #include "digikam_debug.h"
41 #include "daboutdata.h"
42 #include "albummanager.h"
43 #include "coredbaccess.h"
44 #include "thumbsdbaccess.h"
45 #include "facedbaccess.h"
46 #include "dbengineparameters.h"
47 #include "scancontroller.h"
48 #include "digikam_version.h"
49 
50 using namespace Digikam;
51 
52 const QString IMAGE_PATH(QFINDTESTDATA("data/testimages/"));
53 
main(int argc,char ** argv)54 int main(int argc, char** argv)
55 {
56     QApplication app(argc, argv);
57 
58     if (argc != 2)
59     {
60         qCDebug(DIGIKAM_TESTS_LOG) << "testdatabaseswitch - test database switch";
61         qCDebug(DIGIKAM_TESTS_LOG) << "Usage: <sqliteToMysql | mysqlToSqlite>";
62         return -1;
63     }
64 
65     KAboutData aboutData(QLatin1String("digikam"),
66                          QLatin1String("digiKam"), // No need i18n here.
67                          digiKamVersion());
68 
69     QCommandLineParser parser;
70     KAboutData::setApplicationData(aboutData);
71     parser.addVersionOption();
72     parser.addHelpOption();
73     aboutData.setupCommandLine(&parser);
74     parser.process(app);
75     aboutData.processCommandLine(&parser);
76     QString switchCondition = QLatin1String(argv[1]);
77 
78     // ------------------------------------------------------------------------------------
79 
80     if (switchCondition == QLatin1String("sqliteToMysql"))
81     {
82         qCDebug(DIGIKAM_TESTS_LOG) << "Setup sqlite Database...";
83 
84         DbEngineParameters params;
85 
86         params.databaseType = DbEngineParameters::SQLiteDatabaseType();
87         params.setCoreDatabasePath(QDir::currentPath() + QLatin1String("/digikam-core-test.db"));
88         params.setThumbsDatabasePath(QDir::currentPath() + QLatin1String("/digikam-thumbs-test.db"));
89         params.setFaceDatabasePath(QDir::currentPath() + QLatin1String("/digikam-faces-test.db"));
90         params.legacyAndDefaultChecks();
91 
92         qCDebug(DIGIKAM_TESTS_LOG) << "Initializing database...";
93         bool b = AlbumManager::instance()->setDatabase(params, false, IMAGE_PATH);
94 
95         qCDebug(DIGIKAM_TESTS_LOG) << "Database initialization done: " << b;
96 
97         QTest::qWait(3000);
98 
99          //qCDebug(DIGIKAM_TESTS_LOG) << "Shutting down database";
100          //ScanController::instance()->shutDown();
101          //AlbumManager::instance()->cleanUp();
102 
103         qCDebug(DIGIKAM_TESTS_LOG) << "Cleaning DB now";
104         CoreDbAccess::cleanUpDatabase();
105         ThumbsDbAccess::cleanUpDatabase();
106         FaceDbAccess::cleanUpDatabase();
107 
108         // ------------------------------------------------------------------------------------
109 
110         qCDebug(DIGIKAM_TESTS_LOG) << "Setup mysql Database...";
111 
112         params                            = DbEngineParameters();
113         QString defaultAkDir              = DbEngineParameters::internalServerPrivatePath();
114         QString miscDir                   = QDir(defaultAkDir).absoluteFilePath(QLatin1String("db_misc"));
115         params.databaseType               = DbEngineParameters::MySQLDatabaseType();
116         params.databaseNameCore           = QLatin1String("digikam");
117         params.databaseNameThumbnails     = QLatin1String("digikam");
118         params.databaseNameFace           = QLatin1String("digikam");
119         params.userName                   = QLatin1String("root");
120         params.password                   = QString();
121         params.internalServer             = true;
122         params.internalServerDBPath       = QDir::currentPath();
123         params.internalServerMysqlServCmd = DbEngineParameters::defaultMysqlServerCmd();
124         params.internalServerMysqlInitCmd = DbEngineParameters::defaultMysqlInitCmd();
125         params.hostName                   = QString();
126         params.port                       = -1;
127         params.connectOptions             = QString::fromLatin1("UNIX_SOCKET=%1/mysql.socket").arg(miscDir);
128 
129         // ------------------------------------------------------------------------------------
130 
131         qCDebug(DIGIKAM_TESTS_LOG) << "Initializing database...";
132         AlbumManager::instance()->changeDatabase(params);
133 
134         qCDebug(DIGIKAM_TESTS_LOG) << "Database switch done";
135 
136         QTimer::singleShot(5000, &app, SLOT(quit()));
137         app.exec();
138 
139         qCDebug(DIGIKAM_TESTS_LOG) << "Shutting down database";
140         ScanController::instance()->shutDown();
141         AlbumManager::instance()->cleanUp();
142 
143         qCDebug(DIGIKAM_TESTS_LOG) << "Cleaning DB now";
144         CoreDbAccess::cleanUpDatabase();
145         ThumbsDbAccess::cleanUpDatabase();
146         FaceDbAccess::cleanUpDatabase();
147     }
148 
149     else if (switchCondition == QLatin1String("mysqlToSqlite"))
150     {
151         DbEngineParameters params;
152 
153         qCDebug(DIGIKAM_TESTS_LOG) << "Setup mysql Database...";
154 
155         QString defaultAkDir              = DbEngineParameters::internalServerPrivatePath();
156         QString miscDir                   = QDir(defaultAkDir).absoluteFilePath(QLatin1String("db_misc"));
157         params.databaseType               = DbEngineParameters::MySQLDatabaseType();
158         params.databaseNameCore           = QLatin1String("digikam");
159         params.databaseNameThumbnails     = QLatin1String("digikam");
160         params.databaseNameFace           = QLatin1String("digikam");
161         params.userName                   = QLatin1String("root");
162         params.password                   = QString();
163         params.internalServer             = true;
164         params.internalServerDBPath       = QDir::currentPath();
165         params.internalServerMysqlServCmd = DbEngineParameters::defaultMysqlServerCmd();
166         params.internalServerMysqlInitCmd = DbEngineParameters::defaultMysqlInitCmd();
167         params.hostName                   = QString();
168         params.port                       = -1;
169         params.connectOptions             = QString::fromLatin1("UNIX_SOCKET=%1/mysql.socket").arg(miscDir);
170 
171         // ------------------------------------------------------------------------------------
172 
173         qCDebug(DIGIKAM_TESTS_LOG) << "Initializing database...";
174         AlbumManager::instance()->changeDatabase(params);
175 
176         qCDebug(DIGIKAM_TESTS_LOG) << "Database switch done";
177 
178         QTimer::singleShot(5000, &app, SLOT(quit()));
179         app.exec();
180 
181         qCDebug(DIGIKAM_TESTS_LOG) << "Shutting down database";
182         ScanController::instance()->shutDown();
183         AlbumManager::instance()->cleanUp();
184 
185         qCDebug(DIGIKAM_TESTS_LOG) << "Cleaning DB now";
186         CoreDbAccess::cleanUpDatabase();
187         ThumbsDbAccess::cleanUpDatabase();
188         FaceDbAccess::cleanUpDatabase();
189 
190         // ------------------------------------------------------------------------------------
191 
192         qCDebug(DIGIKAM_TESTS_LOG) << "Setup sqlite Database...";
193 
194         params.databaseType = DbEngineParameters::SQLiteDatabaseType();
195         params.setCoreDatabasePath(QDir::currentPath() + QLatin1String("/digikam-core-test.db"));
196         params.setThumbsDatabasePath(QDir::currentPath() + QLatin1String("/digikam-thumbs-test.db"));
197         params.setFaceDatabasePath(QDir::currentPath() + QLatin1String("/digikam-faces-test.db"));
198         params.legacyAndDefaultChecks();
199 
200         qCDebug(DIGIKAM_TESTS_LOG) << "Initializing database...";
201         bool b = AlbumManager::instance()->setDatabase(params, false, IMAGE_PATH);
202 
203         qCDebug(DIGIKAM_TESTS_LOG) << "Database initialization done: " << b;
204 
205         QTest::qWait(3000);
206 
207         //qCDebug(DIGIKAM_TESTS_LOG) << "Shutting down database";
208         //ScanController::instance()->shutDown();
209         //AlbumManager::instance()->cleanUp();
210 
211         qCDebug(DIGIKAM_TESTS_LOG) << "Cleaning DB now";
212         CoreDbAccess::cleanUpDatabase();
213         ThumbsDbAccess::cleanUpDatabase();
214         FaceDbAccess::cleanUpDatabase();
215     }
216 
217     return 0;
218 }
219