aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.cpp
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2021-12-17 07:06:30 -0500
committerLibravatarUnit 193 <unit193@unit193.net>2021-12-17 07:06:30 -0500
commit1fdc150116cad39aae5c5da407c3312b47a59e3a (patch)
tree123c79a4d7ad2d45781ba03ce939f7539fb428d8 /SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.cpp
parentfeda8a7db8d1d7c5439aa8f8feef7cc0dd2b59a0 (diff)
New upstream version 3.3.3+dfsg1.upstream/3.3.3+dfsg1
Diffstat (limited to 'SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.cpp')
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.cpp59
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()";