File indexing completed on 2024-05-19 05:13:15

0001 /*
0002     SPDX-FileCopyrightText: 2009 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "dbconsole.h"
0008 #include <Akonadi/DbAccess>
0009 
0010 #include <QAction>
0011 
0012 #include <KConfigGroup>
0013 #include <KLocalizedString>
0014 #include <KSharedConfig>
0015 #include <KStandardAction>
0016 #include <QIcon>
0017 
0018 #include <QApplication>
0019 #include <QClipboard>
0020 #include <QFontDatabase>
0021 #include <QSqlError>
0022 #include <QSqlQueryModel>
0023 #include <QTabBar>
0024 #include <QTabWidget>
0025 
0026 DbConsole::DbConsole(QWidget *parent)
0027     : QWidget(parent)
0028 {
0029     auto l = new QVBoxLayout(this);
0030 
0031     mTabWidget = new QTabWidget(this);
0032     mTabWidget->tabBar()->setTabsClosable(true);
0033     connect(mTabWidget->tabBar(), &QTabBar::tabCloseRequested, mTabWidget, [this](int index) {
0034         mTabWidget->removeTab(index);
0035         saveQueries();
0036     });
0037     l->addWidget(mTabWidget);
0038 
0039     auto addTabButton = new QPushButton(QIcon::fromTheme(QStringLiteral("tab-new")), QString());
0040     connect(addTabButton, &QPushButton::clicked, this, &DbConsole::addTab);
0041     mTabWidget->setCornerWidget(addTabButton, Qt::TopRightCorner);
0042 
0043     auto config = KSharedConfig::openConfig();
0044     auto group = config->group(QStringLiteral("DBConsole"));
0045     QStringList queries;
0046     const QString queryText = group.readEntry("queryText");
0047     if (!queryText.isEmpty()) {
0048         queries << queryText;
0049         group.deleteEntry("queryText");
0050     } else {
0051         queries = group.readEntry("queryTexts", QStringList());
0052     }
0053 
0054     for (const auto &query : std::as_const(queries)) {
0055         auto tab = addTab();
0056         tab->setQuery(query);
0057     }
0058     if (queries.isEmpty()) {
0059         addTab();
0060     }
0061 }
0062 
0063 void DbConsole::saveQueries()
0064 {
0065     QStringList queries;
0066     queries.reserve(mTabWidget->count());
0067     for (int i = 0; i < mTabWidget->count(); ++i) {
0068         auto tab = qobject_cast<DbConsoleTab *>(mTabWidget->widget(i));
0069         queries << tab->query();
0070     }
0071     KSharedConfig::openConfig()->group(QStringLiteral("DBConsole")).writeEntry("queryTexts", queries);
0072 }
0073 
0074 DbConsoleTab *DbConsole::addTab()
0075 {
0076     ++mTabCounter;
0077     auto tab = new DbConsoleTab(mTabCounter, mTabWidget);
0078     connect(tab, &DbConsoleTab::saveQueries, this, &DbConsole::saveQueries);
0079     mTabWidget->addTab(tab, i18n("Query #%1", mTabCounter));
0080     return tab;
0081 }
0082 
0083 DbConsoleTab::DbConsoleTab(int index, QWidget *parent)
0084     : QWidget(parent)
0085     , mIndex(index)
0086 {
0087     ui.setupUi(this);
0088 
0089     QAction *copyAction = KStandardAction::copy(this, &DbConsoleTab::copyCell, this);
0090     ui.resultView->addAction(copyAction);
0091 
0092     ui.execButton->setIcon(QIcon::fromTheme(QStringLiteral("application-x-executable")));
0093     ui.execButton->setShortcut(Qt::CTRL | Qt::Key_Return);
0094     connect(ui.execButton, &QPushButton::clicked, this, &DbConsoleTab::execClicked);
0095 
0096     ui.queryEdit->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont));
0097     ui.errorView->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont));
0098 }
0099 
0100 void DbConsoleTab::setQuery(const QString &query)
0101 {
0102     ui.queryEdit->setPlainText(query);
0103 }
0104 
0105 QString DbConsoleTab::query() const
0106 {
0107     return ui.queryEdit->toPlainText();
0108 }
0109 
0110 void DbConsoleTab::execClicked()
0111 {
0112     const QString query = ui.queryEdit->toPlainText();
0113     if (query.isEmpty()) {
0114         return;
0115     }
0116     delete mQueryModel;
0117     mQueryModel = new QSqlQueryModel(this);
0118     mQueryModel->setQuery(query, DbAccess::database());
0119     ui.resultView->setModel(mQueryModel);
0120 
0121     if (mQueryModel->lastError().isValid()) {
0122         ui.errorView->appendPlainText(mQueryModel->lastError().text());
0123         ui.resultStack->setCurrentWidget(ui.errorViewPage);
0124     } else {
0125         ui.errorView->clear();
0126         ui.resultStack->setCurrentWidget(ui.resultViewPage);
0127     }
0128 
0129     Q_EMIT saveQueries();
0130 }
0131 
0132 void DbConsoleTab::copyCell()
0133 {
0134     QModelIndex index = ui.resultView->currentIndex();
0135     if (!index.isValid()) {
0136         return;
0137     }
0138     QString text = index.data(Qt::DisplayRole).toString();
0139     QApplication::clipboard()->setText(text);
0140 }
0141 
0142 #include "moc_dbconsole.cpp"