From 601dcf1a80e135b52ef10534b98cef5e2f8546b7 Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Sat, 27 Jan 2024 13:59:45 +0900 Subject: [PATCH 01/11] Add license information about nalgeon/sqlean --- src/AboutDialog.ui | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/AboutDialog.ui b/src/AboutDialog.ui index 279c371e5..1e5d08d00 100644 --- a/src/AboutDialog.ui +++ b/src/AboutDialog.ui @@ -80,15 +80,14 @@ 0 0 635 - 349 + 350 - <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Pastel SVG icon set by Michael Buckley under a Creative Commons -Attribution Share Alike 4.0 license.<br/>See </span><a href="https://codefisher.org/pastel-svg/"><span style=" font-size:small;">https://codefisher.org/pastel-svg/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:8pt;">We use the nalgeon/sqlean library for SQLite extensions support.<br/>This library is licensed under the MIT license, see the following for more information:<br/></span><a href="https://github.com/nalgeon/sqlean"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">https://github.com/nalgeon/sqlean</span></a></p><p><span style=" font-size:small;">It also uses the Pastel SVG icon set by Michael Buckley under a Creative Commons Attribution Share Alike 4.0 license.<br/>See </span><a href="https://codefisher.org/pastel-svg/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">https://codefisher.org/pastel-svg/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop From da830554bf4006bc78e65c63afa5cfdb2d1f3a70 Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Sat, 27 Jan 2024 14:03:14 +0900 Subject: [PATCH 02/11] Add list widget for built-in extensions --- src/PreferencesDialog.ui | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/PreferencesDialog.ui b/src/PreferencesDialog.ui index 8a8e42c15..ee17c29d6 100644 --- a/src/PreferencesDialog.ui +++ b/src/PreferencesDialog.ui @@ -20,7 +20,7 @@ - 0 + 4 @@ -1846,6 +1846,20 @@ Can be set to 0 for disabling completion. + + + + Select built-in extensions to load for every database: + + + + + + + true + + + From 58d3951b4b5e71599f819481130adbeba9045259 Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Sat, 27 Jan 2024 15:34:43 +0900 Subject: [PATCH 03/11] Change to allow users to control built-in extensions in PreferencesDialog --- src/PreferencesDialog.cpp | 34 ++++++++++++++++++++++++++++++++++ src/PreferencesDialog.h | 1 + 2 files changed, 35 insertions(+) diff --git a/src/PreferencesDialog.cpp b/src/PreferencesDialog.cpp index bf55ec07f..520172b30 100644 --- a/src/PreferencesDialog.cpp +++ b/src/PreferencesDialog.cpp @@ -42,6 +42,13 @@ PreferencesDialog::PreferencesDialog(QWidget* parent, Tabs tab) ui->checkUpdates->setVisible(false); #endif +#ifdef Q_OS_MACX + listUpBuiltinExtension(); +#else + ui->labeBuiltinExtensions->setVisible(false); + ui->listBuiltinExtensions->setVisible(false); +#endif + loadSettings(); connect(ui->appStyleCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(adjustColorsToStyle(int))); @@ -206,6 +213,13 @@ void PreferencesDialog::loadSettings() ui->checkCloseButtonOnTabs->setChecked(Settings::getValue("editor", "close_button_on_tabs").toBool()); ui->listExtensions->addItems(Settings::getValue("extensions", "list").toStringList()); +#ifdef Q_OS_MACX + for (int i=0;ilistBuiltinExtensions->count();++i) + { + QListWidgetItem* item = ui->listBuiltinExtensions->item(i); + item->setCheckState(Settings::getValue("extensions", "builtin").toMap().value(item->text()).toBool() ? Qt::Checked : Qt::Unchecked); + } +#endif ui->checkRegexDisabled->setChecked(Settings::getValue("extensions", "disableregex").toBool()); ui->checkAllowLoadExtension->setChecked(Settings::getValue("extensions", "enable_load_extension").toBool()); fillLanguageBox(); @@ -281,6 +295,13 @@ void PreferencesDialog::saveSettings(bool accept) Settings::setValue("extensions", "disableregex", ui->checkRegexDisabled->isChecked()); Settings::setValue("extensions", "enable_load_extension", ui->checkAllowLoadExtension->isChecked()); +#ifdef Q_OS_MACX + QVariantMap builtinExtList; + for (int i=0;ilistBuiltinExtensions->count();++i) + builtinExtList.insert(ui->listBuiltinExtensions->item(i)->text(), ui->listBuiltinExtensions->item(i)->checkState()); + Settings::setValue("extensions", "builtin", QVariant::fromValue(builtinExtList)); +#endif + // Save remote settings Settings::setValue("remote", "active", ui->checkUseRemotes->isChecked()); QStringList old_client_certs = Settings::getValue("remote", "client_certificates").toStringList(); @@ -434,6 +455,19 @@ void PreferencesDialog::removeExtension() ui->listExtensions->takeItem(ui->listExtensions->currentIndex().row()); } +void PreferencesDialog::listUpBuiltinExtension() +{ + const QDir dir(qApp->applicationDirPath() + "/../Extensions/"); + QStringList files = dir.entryList(QStringList() << "*.dylib", QDir::Files); + for (const QString& file: files) { + QListWidgetItem* item = new QListWidgetItem(file, ui->listBuiltinExtensions); + item->setFlags(item->flags() | Qt::ItemIsUserCheckable); + // The check status is redetermined after the 'loadSettings()' function call. + item->setCheckState(Qt::Unchecked); + ui->listBuiltinExtensions->addItem(item); + } +} + void PreferencesDialog::fillLanguageBox() { QDir translationsDir(QCoreApplication::applicationDirPath() + "/translations", diff --git a/src/PreferencesDialog.h b/src/PreferencesDialog.h index 45c0001b9..d5bef0c5c 100644 --- a/src/PreferencesDialog.h +++ b/src/PreferencesDialog.h @@ -39,6 +39,7 @@ private slots: void chooseLocation(); void showColourDialog(QTreeWidgetItem* item, int column); void addExtension(); + void listUpBuiltinExtension(); void removeExtension(); void activateRemoteTab(bool active); void addClientCertificate(); From 23171448c590ed9cc56603ae1bab9d15585af08a Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Sun, 28 Jan 2024 09:21:19 +0900 Subject: [PATCH 04/11] Change to automatically load build-in extensions enabled in PreferencesDialog --- src/sqlitedb.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/sqlitedb.cpp b/src/sqlitedb.cpp index 37f1e6fe3..07e62de2f 100644 --- a/src/sqlitedb.cpp +++ b/src/sqlitedb.cpp @@ -2170,6 +2170,18 @@ void DBBrowserDB::loadExtensionsFromSettings() if(loadExtension(ext) == false) QMessageBox::warning(nullptr, QApplication::applicationName(), tr("Error loading extension: %1").arg(lastError())); } + +#ifdef Q_OS_MACX + const QVariantMap builtinList = Settings::getValue("extensions", "builtin").toMap(); + for(const QString& ext : builtinList.keys()) + { + if(builtinList.value(ext).toBool()) + { + if(loadExtension(qApp->applicationDirPath() + "/../Extensions/" + ext) == false) + QMessageBox::warning(nullptr, QApplication::applicationName(), tr("Error loading built-in extension: %1").arg(lastError())); + } + } +#endif } std::vector> DBBrowserDB::queryColumnInformation(const std::string& schema_name, const std::string& object_name) const From 5bc28ef043e5c35f50c909ce00d61b17c252362b Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Sun, 28 Jan 2024 15:05:48 +0900 Subject: [PATCH 05/11] Fix currentIndex --- src/PreferencesDialog.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PreferencesDialog.ui b/src/PreferencesDialog.ui index ee17c29d6..c544834c8 100644 --- a/src/PreferencesDialog.ui +++ b/src/PreferencesDialog.ui @@ -20,7 +20,7 @@ - 4 + 0 From 5fb03bc08063182f394adc9aa8aa8c9e80c309a2 Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Sun, 28 Jan 2024 15:06:41 +0900 Subject: [PATCH 06/11] Fix typo --- src/PreferencesDialog.cpp | 2 +- src/PreferencesDialog.ui | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PreferencesDialog.cpp b/src/PreferencesDialog.cpp index 520172b30..2f7bdf667 100644 --- a/src/PreferencesDialog.cpp +++ b/src/PreferencesDialog.cpp @@ -45,7 +45,7 @@ PreferencesDialog::PreferencesDialog(QWidget* parent, Tabs tab) #ifdef Q_OS_MACX listUpBuiltinExtension(); #else - ui->labeBuiltinExtensions->setVisible(false); + ui->labelBuiltinExtensions->setVisible(false); ui->listBuiltinExtensions->setVisible(false); #endif diff --git a/src/PreferencesDialog.ui b/src/PreferencesDialog.ui index c544834c8..2a5cb785e 100644 --- a/src/PreferencesDialog.ui +++ b/src/PreferencesDialog.ui @@ -1847,7 +1847,7 @@ Can be set to 0 for disabling completion. - + Select built-in extensions to load for every database: From bb732b403b0532005f90ca2cbea4254def16a3e5 Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Mon, 29 Jan 2024 18:52:16 +0900 Subject: [PATCH 07/11] Rename 'listUpBuiltinExtension' function to 'createBuiltinExtentionList' --- src/PreferencesDialog.cpp | 4 ++-- src/PreferencesDialog.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/PreferencesDialog.cpp b/src/PreferencesDialog.cpp index 2f7bdf667..9be3b3630 100644 --- a/src/PreferencesDialog.cpp +++ b/src/PreferencesDialog.cpp @@ -43,7 +43,7 @@ PreferencesDialog::PreferencesDialog(QWidget* parent, Tabs tab) #endif #ifdef Q_OS_MACX - listUpBuiltinExtension(); + createBuiltinExtensionList(); #else ui->labelBuiltinExtensions->setVisible(false); ui->listBuiltinExtensions->setVisible(false); @@ -455,7 +455,7 @@ void PreferencesDialog::removeExtension() ui->listExtensions->takeItem(ui->listExtensions->currentIndex().row()); } -void PreferencesDialog::listUpBuiltinExtension() +void PreferencesDialog::createBuiltinExtensionList() { const QDir dir(qApp->applicationDirPath() + "/../Extensions/"); QStringList files = dir.entryList(QStringList() << "*.dylib", QDir::Files); diff --git a/src/PreferencesDialog.h b/src/PreferencesDialog.h index d5bef0c5c..b42e8935a 100644 --- a/src/PreferencesDialog.h +++ b/src/PreferencesDialog.h @@ -39,7 +39,7 @@ private slots: void chooseLocation(); void showColourDialog(QTreeWidgetItem* item, int column); void addExtension(); - void listUpBuiltinExtension(); + void createBuiltinExtensionList(); void removeExtension(); void activateRemoteTab(bool active); void addClientCertificate(); From e50337ed06a6cfe873028b692977ff6ab5870bbe Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Fri, 2 Feb 2024 12:57:59 +0900 Subject: [PATCH 08/11] Show absolute path for extension file --- src/PreferencesDialog.cpp | 3 ++- src/sqlitedb.cpp | 4 +--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/PreferencesDialog.cpp b/src/PreferencesDialog.cpp index 9be3b3630..9a2affb2f 100644 --- a/src/PreferencesDialog.cpp +++ b/src/PreferencesDialog.cpp @@ -460,7 +460,8 @@ void PreferencesDialog::createBuiltinExtensionList() const QDir dir(qApp->applicationDirPath() + "/../Extensions/"); QStringList files = dir.entryList(QStringList() << "*.dylib", QDir::Files); for (const QString& file: files) { - QListWidgetItem* item = new QListWidgetItem(file, ui->listBuiltinExtensions); + QString absoluteFilePath = dir.absoluteFilePath(file); + QListWidgetItem* item = new QListWidgetItem(absoluteFilePath, ui->listBuiltinExtensions); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); // The check status is redetermined after the 'loadSettings()' function call. item->setCheckState(Qt::Unchecked); diff --git a/src/sqlitedb.cpp b/src/sqlitedb.cpp index 07e62de2f..c15e7d707 100644 --- a/src/sqlitedb.cpp +++ b/src/sqlitedb.cpp @@ -2171,17 +2171,15 @@ void DBBrowserDB::loadExtensionsFromSettings() QMessageBox::warning(nullptr, QApplication::applicationName(), tr("Error loading extension: %1").arg(lastError())); } -#ifdef Q_OS_MACX const QVariantMap builtinList = Settings::getValue("extensions", "builtin").toMap(); for(const QString& ext : builtinList.keys()) { if(builtinList.value(ext).toBool()) { - if(loadExtension(qApp->applicationDirPath() + "/../Extensions/" + ext) == false) + if(loadExtension(ext) == false) QMessageBox::warning(nullptr, QApplication::applicationName(), tr("Error loading built-in extension: %1").arg(lastError())); } } -#endif } std::vector> DBBrowserDB::queryColumnInformation(const std::string& schema_name, const std::string& object_name) const From a6465234f0520d1fc6da4d198a66f4cee359ceb0 Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Fri, 2 Feb 2024 13:28:40 +0900 Subject: [PATCH 09/11] Support *nix and Windows platform --- src/PreferencesDialog.cpp | 41 +++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/src/PreferencesDialog.cpp b/src/PreferencesDialog.cpp index 9a2affb2f..7aecac6cb 100644 --- a/src/PreferencesDialog.cpp +++ b/src/PreferencesDialog.cpp @@ -14,6 +14,7 @@ #include #include #include +#include PreferencesDialog::PreferencesDialog(QWidget* parent, Tabs tab) : QDialog(parent), @@ -42,12 +43,7 @@ PreferencesDialog::PreferencesDialog(QWidget* parent, Tabs tab) ui->checkUpdates->setVisible(false); #endif -#ifdef Q_OS_MACX createBuiltinExtensionList(); -#else - ui->labelBuiltinExtensions->setVisible(false); - ui->listBuiltinExtensions->setVisible(false); -#endif loadSettings(); @@ -213,13 +209,11 @@ void PreferencesDialog::loadSettings() ui->checkCloseButtonOnTabs->setChecked(Settings::getValue("editor", "close_button_on_tabs").toBool()); ui->listExtensions->addItems(Settings::getValue("extensions", "list").toStringList()); -#ifdef Q_OS_MACX for (int i=0;ilistBuiltinExtensions->count();++i) { QListWidgetItem* item = ui->listBuiltinExtensions->item(i); item->setCheckState(Settings::getValue("extensions", "builtin").toMap().value(item->text()).toBool() ? Qt::Checked : Qt::Unchecked); } -#endif ui->checkRegexDisabled->setChecked(Settings::getValue("extensions", "disableregex").toBool()); ui->checkAllowLoadExtension->setChecked(Settings::getValue("extensions", "enable_load_extension").toBool()); fillLanguageBox(); @@ -295,12 +289,10 @@ void PreferencesDialog::saveSettings(bool accept) Settings::setValue("extensions", "disableregex", ui->checkRegexDisabled->isChecked()); Settings::setValue("extensions", "enable_load_extension", ui->checkAllowLoadExtension->isChecked()); -#ifdef Q_OS_MACX QVariantMap builtinExtList; for (int i=0;ilistBuiltinExtensions->count();++i) builtinExtList.insert(ui->listBuiltinExtensions->item(i)->text(), ui->listBuiltinExtensions->item(i)->checkState()); Settings::setValue("extensions", "builtin", QVariant::fromValue(builtinExtList)); -#endif // Save remote settings Settings::setValue("remote", "active", ui->checkUseRemotes->isChecked()); @@ -457,13 +449,38 @@ void PreferencesDialog::removeExtension() void PreferencesDialog::createBuiltinExtensionList() { - const QDir dir(qApp->applicationDirPath() + "/../Extensions/"); - QStringList files = dir.entryList(QStringList() << "*.dylib", QDir::Files); + QDir dir; + QStringList files; + + // If we upgrade Qt framework version to 6.x at some point, use 'macos' instead of 'osx.' + // For further information, see the https://doc.qt.io/qt-6/qsysinfo.html + if (QSysInfo::productType() == "osx") { + dir.setPath(qApp->applicationDirPath() + "/../Extensions/"); + files = dir.entryList(QStringList() << "*.dylib", QDir::Files); + } + else if (QSysInfo::productType() == "windows") { + dir.setPath(qApp->applicationDirPath() + "/extensions/"); + files = dir.entryList(QStringList() << "*.dll", QDir::Files); + } + else { + if (QSysInfo::currentCpuArchitecture() == "arm") + dir.setPath("/usr/lib/aarch-linux-gnu/"); + else if (QSysInfo::currentCpuArchitecture() == "arm64") + dir.setPath("/usr/lib/aarch64-linux-gnu/"); + else if (QSysInfo::currentCpuArchitecture() == "i386") + dir.setPath("/usr/lib/i386-linux-gnu/"); + else if (QSysInfo::currentCpuArchitecture() == "x86_64") + dir.setPath("/usr/lib/x86_64-linux-gnu/"); + else + dir.setPath("/usr/lib/"); + files = dir.entryList(QStringList() << "*.so*", QDir::Files); + } + for (const QString& file: files) { QString absoluteFilePath = dir.absoluteFilePath(file); QListWidgetItem* item = new QListWidgetItem(absoluteFilePath, ui->listBuiltinExtensions); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - // The check status is redetermined after the 'loadSettings()' function call. + // The check state is redetermined after the 'loadSettings()' function call. item->setCheckState(Qt::Unchecked); ui->listBuiltinExtensions->addItem(item); } From 9856f1a6527822c3f0f0ee1fce840596fece3621 Mon Sep 17 00:00:00 2001 From: mgrojo Date: Sat, 25 May 2024 17:28:31 +0200 Subject: [PATCH 10/11] Adding to the built-in extension list only identified extensions by pattern Otherwise, all the system shared libraries are added to the list, rendering the feature unfriendly for the user. --- src/PreferencesDialog.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/PreferencesDialog.cpp b/src/PreferencesDialog.cpp index 7aecac6cb..cbcbccfe1 100644 --- a/src/PreferencesDialog.cpp +++ b/src/PreferencesDialog.cpp @@ -473,7 +473,15 @@ void PreferencesDialog::createBuiltinExtensionList() dir.setPath("/usr/lib/x86_64-linux-gnu/"); else dir.setPath("/usr/lib/"); - files = dir.entryList(QStringList() << "*.so*", QDir::Files); + + // There is no single naming convention for SQLite extension libraries, + // but this gives good results, at least on Debian based systems. + // The patterns have to exclude "libsqlite3.so", which is the SQLite3 + // library, not an extension. + files = dir.entryList(QStringList() + << "libsqlite3[!.]*.so" + << "mod_*.so" + << "lib?*sqlite*.so", QDir::Files); } for (const QString& file: files) { From c7ce27981c0831aae2765ef8c7a06e8c90894833 Mon Sep 17 00:00:00 2001 From: mgrojo Date: Sat, 25 May 2024 18:10:30 +0200 Subject: [PATCH 11/11] Built-in extension loading: support Fedora based distributions Fedora uses /usr/lib or /usr/lib64 depending on CPU architecture. As example, see: https://packages.fedoraproject.org/pkgs/virtualpg/virtualpg/fedora-40.html#files Not tested on the actual distribution. --- src/PreferencesDialog.cpp | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/PreferencesDialog.cpp b/src/PreferencesDialog.cpp index cbcbccfe1..46640c895 100644 --- a/src/PreferencesDialog.cpp +++ b/src/PreferencesDialog.cpp @@ -463,17 +463,26 @@ void PreferencesDialog::createBuiltinExtensionList() files = dir.entryList(QStringList() << "*.dll", QDir::Files); } else { - if (QSysInfo::currentCpuArchitecture() == "arm") - dir.setPath("/usr/lib/aarch-linux-gnu/"); - else if (QSysInfo::currentCpuArchitecture() == "arm64") - dir.setPath("/usr/lib/aarch64-linux-gnu/"); - else if (QSysInfo::currentCpuArchitecture() == "i386") - dir.setPath("/usr/lib/i386-linux-gnu/"); - else if (QSysInfo::currentCpuArchitecture() == "x86_64") - dir.setPath("/usr/lib/x86_64-linux-gnu/"); - else - dir.setPath("/usr/lib/"); - + const QString productType (QSysInfo::productType()); + const QString cpuArchitecture (QSysInfo::currentCpuArchitecture()); + if (productType == "fedora" || productType == "redhat") { + if (cpuArchitecture.contains("64")) + dir.setPath("/usr/lib64/"); + else + dir.setPath("/usr/lib/"); + } else { + if (cpuArchitecture == "arm") { + dir.setPath("/usr/lib/aarch-linux-gnu/"); + } else if (cpuArchitecture == "arm64") { + dir.setPath("/usr/lib/aarch64-linux-gnu/"); + } else if (cpuArchitecture == "i386") { + dir.setPath("/usr/lib/i386-linux-gnu/"); + } else if (cpuArchitecture == "x86_64") { + dir.setPath("/usr/lib/x86_64-linux-gnu/"); + } else { + dir.setPath("/usr/lib/"); + } + } // There is no single naming convention for SQLite extension libraries, // but this gives good results, at least on Debian based systems. // The patterns have to exclude "libsqlite3.so", which is the SQLite3