diff options
Diffstat (limited to 'SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.cpp')
| -rw-r--r-- | SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.cpp | 59 |
1 files changed, 27 insertions, 32 deletions
diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.cpp index cd3e135..f0f980d 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.cpp @@ -22,6 +22,7 @@ #include "themetuner.h" #include "dialogs/bindparamsdialog.h" #include "common/bindparam.h" +#include "common/dbcombobox.h" #include <QComboBox> #include <QDebug> #include <QStringListModel> @@ -106,7 +107,7 @@ void EditorWindow::init() Db* treeSelectedDb = DBTREE->getSelectedOpenDb(); if (treeSelectedDb) - dbCombo->setCurrentIndex(dbComboModel->getIndexForDb(treeSelectedDb)); + dbCombo->setCurrentDb(treeSelectedDb); Db* currentDb = getCurrentDb(); resultsModel->setDb(currentDb); @@ -230,11 +231,8 @@ QString EditorWindow::getQueryToExecute(bool doSelectCurrentQuery) bool EditorWindow::setCurrentDb(Db *db) { - if (dbCombo->findText(db->getName()) == -1) - return false; - - dbCombo->setCurrentText(db->getName()); - return true; + dbCombo->setCurrentDb(db); + return dbCombo->currentIndex() > -1; } void EditorWindow::setContents(const QString &sql) @@ -319,7 +317,7 @@ void EditorWindow::changeEvent(QEvent *e) Db* EditorWindow::getCurrentDb() { - return dbComboModel->getDb(dbCombo->currentIndex()); + return dbCombo->currentDb(); } void EditorWindow::updateResultsDisplayMode() @@ -366,6 +364,8 @@ void EditorWindow::updateResultsDisplayMode() void EditorWindow::createActions() { // SQL editor toolbar + actionMap[CURRENT_DB] = ui->toolBar->addWidget(dbCombo); + ui->toolBar->addSeparator(); createAction(EXEC_QUERY, ICONS.EXEC_QUERY, tr("Execute query"), this, SLOT(execQuery()), ui->toolBar, ui->sqlEdit); createAction(EXPLAIN_QUERY, ICONS.EXPLAIN_QUERY, tr("Explain query"), this, SLOT(explainQuery()), ui->toolBar, ui->sqlEdit); ui->toolBar->addSeparator(); @@ -383,8 +383,6 @@ void EditorWindow::createActions() ui->toolBar->addAction(ui->sqlEdit->getAction(SqlEditor::FIND)); ui->toolBar->addAction(ui->sqlEdit->getAction(SqlEditor::REPLACE)); ui->toolBar->addSeparator(); - actionMap[CURRENT_DB] = ui->toolBar->addWidget(dbCombo); - ui->toolBar->addSeparator(); ui->toolBar->addAction(staticActions[RESULTS_IN_TAB]); ui->toolBar->addAction(staticActions[RESULTS_BELOW]); createAction(PREV_DB, tr("Previous database"), this, SLOT(prevDb()), this); @@ -404,10 +402,7 @@ void EditorWindow::createActions() void EditorWindow::createDbCombo() { - dbCombo = new QComboBox(this); - dbComboModel = new DbListModel(this); - dbComboModel->setCombo(dbCombo); - dbCombo->setModel(dbComboModel); + dbCombo = new DbComboBox(this); dbCombo->setEditable(false); dbCombo->setFixedWidth(100); connect(dbCombo, SIGNAL(currentTextChanged(QString)), this, SLOT(dbChanged())); @@ -424,17 +419,12 @@ void EditorWindow::setupDefShortcuts() void EditorWindow::selectCurrentQuery(bool fallBackToPreviousIfNecessary) { - Dialect dialect = Dialect::Sqlite3; - Db* db = getCurrentDb(); - if (db && db->isValid()) - dialect = db->getDialect(); - QTextCursor cursor = ui->sqlEdit->textCursor(); int pos = cursor.position(); int queryStartPos; QString contents = ui->sqlEdit->toPlainText(); QString query = getQueryWithPosition(contents, pos, &queryStartPos); - TokenList tokens = Lexer::tokenize(query, dialect); + TokenList tokens = Lexer::tokenize(query); tokens.trim(); tokens.trimRight(Token::OPERATOR, ";"); @@ -445,7 +435,7 @@ void EditorWindow::selectCurrentQuery(bool fallBackToPreviousIfNecessary) if (pos > -1) { query = getQueryWithPosition(contents, pos, &queryStartPos); - tokens = Lexer::tokenize(query, dialect); + tokens = Lexer::tokenize(query); tokens.trim(); tokens.trimRight(Token::OPERATOR, ";"); } @@ -504,14 +494,8 @@ void EditorWindow::explainQuery() bool EditorWindow::processBindParams(QString& sql, QHash<QString, QVariant>& queryParams) { - // Determin dialect - Dialect dialect = Dialect::Sqlite3; - Db* db = getCurrentDb(); - if (db && db->isValid()) - dialect = db->getDialect(); - // Get all bind parameters from the query - TokenList tokens = Lexer::tokenize(sql, dialect); + TokenList tokens = Lexer::tokenize(sql); TokenList bindTokens = tokens.filter(Token::BIND_PARAM); // No bind tokens? Return fast. @@ -522,18 +506,29 @@ bool EditorWindow::processBindParams(QString& sql, QHash<QString, QVariant>& que static_qstring(paramTpl, ":arg%1"); QString arg; QVector<BindParam*> bindParams; + QHash<QString, QString> namedBindParams; BindParam* bindParam = nullptr; + bool isNamed = false; + bool nameAlreadyInList = false; int i = 0; for (const TokenPtr& token : bindTokens) { + isNamed = (token->value != "?"); + nameAlreadyInList = isNamed && namedBindParams.contains(token->value); + bindParam = new BindParam(); bindParam->position = i; bindParam->originalName = token->value; - bindParam->newName = paramTpl.arg(i); - bindParams << bindParam; - i++; - + bindParam->newName = (isNamed && nameAlreadyInList) ? namedBindParams[token->value] : paramTpl.arg(i); token->value = bindParam->newName; + + if (!isNamed || !nameAlreadyInList) + bindParams << bindParam; + + if (isNamed && !nameAlreadyInList) + namedBindParams[bindParam->originalName] = bindParam->newName; + + i++; } // Show dialog to query user for values @@ -719,7 +714,7 @@ void EditorWindow::exportResults() } QString query = lastSuccessfulQuery.isEmpty() ? getQueryToExecute() : lastSuccessfulQuery; - QStringList queries = splitQueries(query, getCurrentDb()->getDialect(), false, true); + QStringList queries = splitQueries(query, false, true); if (queries.size() == 0) { qWarning() << "No queries after split in EditorWindow::exportResults()"; |
