From 1ea45a54d6c729e185b0740670b78a6511c012f0 Mon Sep 17 00:00:00 2001 From: Martin Kleusberg Date: Mon, 5 Oct 2015 19:57:44 +0200 Subject: [PATCH] Allow escaping of filter wildcard characters See issue #421. --- src/PreferencesDialog.cpp | 4 ++++ src/PreferencesDialog.ui | 28 +++++++++++++++++++++++++++- src/sqlitetablemodel.cpp | 17 +++++++++++------ 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/src/PreferencesDialog.cpp b/src/PreferencesDialog.cpp index 0be1f5f1..7285c662 100644 --- a/src/PreferencesDialog.cpp +++ b/src/PreferencesDialog.cpp @@ -72,6 +72,7 @@ void PreferencesDialog::loadSettings() loadColorSetting(ui->fr_bin_bg, "bin_bg"); ui->txtNull->setText(getSettingsValue("databrowser", "null_text").toString()); + ui->editFilterEscape->setText(getSettingsValue("databrowser", "filter_escape").toString()); for(int i=0; i < ui->treeSyntaxHighlighting->topLevelItemCount(); ++i) { @@ -119,6 +120,7 @@ void PreferencesDialog::saveSettings() saveColorSetting(ui->fr_bin_fg, "bin_fg"); saveColorSetting(ui->fr_bin_bg, "bin_bg"); setSettingsValue("databrowser", "null_text", ui->txtNull->text()); + setSettingsValue("databrowser", "filter_escape", ui->editFilterEscape->text()); for(int i=0; i < ui->treeSyntaxHighlighting->topLevelItemCount(); ++i) { @@ -250,6 +252,8 @@ QVariant PreferencesDialog::getSettingsDefaultValue(const QString& group, const return 10; if (name == "null_text") return "NULL"; + if (name == "filter_escape") + return "\\"; if (name == "null_fg_colour") return QColor(Qt::lightGray).name(); if (name == "null_bg_colour") diff --git a/src/PreferencesDialog.ui b/src/PreferencesDialog.ui index 49d3e3fc..5bc30a1b 100644 --- a/src/PreferencesDialog.ui +++ b/src/PreferencesDialog.ui @@ -7,7 +7,7 @@ 0 0 590 - 426 + 495 @@ -486,6 +486,32 @@ + + + + Filters + + + + + + 1 + + + + + + + Escape character + + + editFilterEscape + + + + + + diff --git a/src/sqlitetablemodel.cpp b/src/sqlitetablemodel.cpp index 04ec19f8..9501c27e 100644 --- a/src/sqlitetablemodel.cpp +++ b/src/sqlitetablemodel.cpp @@ -536,6 +536,7 @@ void SqliteTableModel::updateFilter(int column, const QString& value) // Check for any special comparison operators at the beginning of the value string. If there are none default to LIKE. QString op = "LIKE"; QString val; + QString escape; bool numeric = false; if(value.left(2) == ">=" || value.left(2) == "<=" || value.left(2) == "<>") { @@ -556,12 +557,16 @@ void SqliteTableModel::updateFilter(int column, const QString& value) val = value.mid(1); numeric = true; } + } else if(value.left(1) == "=") { + op = "="; + val = value.mid(1); } else { - if(value.left(1) == "=") - { - op = "="; - val = value.mid(1); - } + // Keep the default LIKE operator + + QString escape_character = PreferencesDialog::getSettingsValue("databrowser", "filter_escape").toString(); + if(escape_character == "'") escape_character = "''"; + if(escape_character.length()) + escape = QString("ESCAPE '%1'").arg(escape_character); } if(val.isEmpty()) val = value; @@ -572,7 +577,7 @@ void SqliteTableModel::updateFilter(int column, const QString& value) if(val == "''") m_mWhere.remove(column); else - m_mWhere.insert(column, QString("%1 %2").arg(op).arg(QString(encode(val.toUtf8())))); + m_mWhere.insert(column, QString("%1 %2 %3").arg(op).arg(QString(encode(val.toUtf8()))).arg(escape)); // Build the new query buildQuery();