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"