UI: Programs: Sort "Name" column case-insentively

This commit is contained in:
Nodir Temirkhodjaev 2024-09-20 14:33:11 +05:00
parent 12022c5333
commit f98765a18a
7 changed files with 71 additions and 4 deletions

View File

@ -16,6 +16,7 @@ SOURCES += \
$$PWD/dbutil.cpp \ $$PWD/dbutil.cpp \
$$PWD/dbvar.cpp \ $$PWD/dbvar.cpp \
$$PWD/sqlitedb.cpp \ $$PWD/sqlitedb.cpp \
$$PWD/sqlitedbext.cpp \
$$PWD/sqlitestmt.cpp $$PWD/sqlitestmt.cpp
HEADERS += \ HEADERS += \
@ -27,4 +28,5 @@ HEADERS += \
$$PWD/dbvar.h \ $$PWD/dbvar.h \
$$PWD/sqlite_types.h \ $$PWD/sqlite_types.h \
$$PWD/sqlitedb.h \ $$PWD/sqlitedb.h \
$$PWD/sqlitedbext.h \
$$PWD/sqlitestmt.h $$PWD/sqlitestmt.h

View File

@ -9,6 +9,7 @@
#include <sqlite.h> #include <sqlite.h>
#include "dbquery.h" #include "dbquery.h"
#include "sqlitedbext.h"
#include "sqlitestmt.h" #include "sqlitestmt.h"
namespace { namespace {
@ -84,7 +85,13 @@ bool SqliteDb::open()
{ {
const auto filePathUtf8 = m_filePath.toUtf8(); const auto filePathUtf8 = m_filePath.toUtf8();
return sqlite3_open_v2(filePathUtf8.data(), &m_db, m_openFlags, nullptr) == SQLITE_OK; const bool ok = sqlite3_open_v2(filePathUtf8.data(), &m_db, m_openFlags, nullptr) == SQLITE_OK;
if (ok) {
SqliteDbExt::registerExtensions(this);
}
return ok;
} }
void SqliteDb::close() void SqliteDb::close()

44
src/ui/3rdparty/sqlite/sqlitedbext.cpp vendored Normal file
View File

@ -0,0 +1,44 @@
#include "sqlitedbext.h"
#include <QLoggingCategory>
#include <sqlite.h>
#include "sqlitedb.h"
namespace {
const QLoggingCategory LC("dbExt");
void extLower(sqlite3_context *ctx, int argc, sqlite3_value **argv)
{
Q_ASSERT(argc == 1);
const unsigned char *textUtf8 = sqlite3_value_text(argv[0]);
const auto text = QString::fromUtf8(textUtf8);
const auto textLower = text.toLower();
const auto result = textLower.toUtf8();
sqlite3_result_text(ctx, result.data(), result.size(), SQLITE_TRANSIENT);
}
bool createExtLower(struct sqlite3 *db)
{
return sqlite3_create_function(db, "EXT_LOWER",
/*nArg=*/1,
/*eTextRep=*/(SQLITE_DETERMINISTIC | SQLITE_UTF8),
/*pApp=*/nullptr,
/*xFunc=*/&extLower,
/*xStep=*/nullptr,
/*xFinal=*/nullptr)
== SQLITE_OK;
}
}
void SqliteDbExt::registerExtensions(SqliteDb *sqliteDb)
{
struct sqlite3 *db = sqliteDb->db();
createExtLower(db);
}

14
src/ui/3rdparty/sqlite/sqlitedbext.h vendored Normal file
View File

@ -0,0 +1,14 @@
#ifndef SQLITEDBEXT_H
#define SQLITEDBEXT_H
#include <QObject>
class SqliteDb;
class SqliteDbExt
{
public:
static void registerExtensions(SqliteDb *sqliteDb);
};
#endif // SQLITEDBEXT_H

View File

@ -34,7 +34,7 @@ namespace {
const QLoggingCategory LC("conf"); const QLoggingCategory LC("conf");
constexpr int DATABASE_USER_VERSION = 43; constexpr int DATABASE_USER_VERSION = 44;
const char *const sqlSelectAddressGroups = "SELECT addr_group_id, include_all, exclude_all," const char *const sqlSelectAddressGroups = "SELECT addr_group_id, include_all, exclude_all,"
" include_zones, exclude_zones," " include_zones, exclude_zones,"

View File

@ -80,7 +80,7 @@ CREATE TABLE app(
CREATE INDEX app_app_group_id_idx ON app(app_group_id); CREATE INDEX app_app_group_id_idx ON app(app_group_id);
CREATE UNIQUE INDEX app_path_uk ON app(path); CREATE UNIQUE INDEX app_path_uk ON app(path);
CREATE INDEX app_name_idx ON app(name); CREATE INDEX app_name_idx ON app(EXT_LOWER(name));
CREATE INDEX app_rule_idx ON app(rule_id); CREATE INDEX app_rule_idx ON app(rule_id);
CREATE INDEX app_end_time_idx ON app(end_time); CREATE INDEX app_end_time_idx ON app(end_time);

View File

@ -320,7 +320,7 @@ QString AppListModel::sqlWhereFts() const
QString AppListModel::sqlOrderColumn() const QString AppListModel::sqlOrderColumn() const
{ {
static const QString nameColumn = "t.name"; static const QString nameColumn = "EXT_LOWER(t.name)";
static const QString pathColumn = "t.path"; static const QString pathColumn = "t.path";
static const QStringList orderColumns = { static const QStringList orderColumns = {