Page MenuHomePhabricator

No OneTemporary

diff --git a/sqliter/sqliter.cpp b/sqliter/sqliter.cpp
--- a/sqliter/sqliter.cpp
+++ b/sqliter/sqliter.cpp
@@ -1,87 +1,97 @@
#include "sqliter.h"
#include <sqlite3.h>
#include <QDebug>
bool Sqliter::install(QVariant a_driverHandle)
{
if (!a_driverHandle.isValid() || qstrcmp(a_driverHandle.typeName(), "sqlite3*") != 0)
return false;
sqlite3* db = *static_cast<sqlite3 **>(a_driverHandle.data());
if (!db)
return false;
if (SQLITE_OK != sqlite3_create_function(db, "upper", 1, SQLITE_UTF16 | SQLITE_DETERMINISTIC,
nullptr, Sqliter::upper, nullptr, nullptr))
return false;
if (SQLITE_OK != sqlite3_create_function(db, "lower", 1, SQLITE_UTF16 | SQLITE_DETERMINISTIC,
nullptr, Sqliter::lower, nullptr, nullptr))
return false;
if (SQLITE_OK != sqlite3_create_collation(db, "nocase", SQLITE_UTF8, nullptr, Sqliter::compareNocase8))
return false;
if (SQLITE_OK != sqlite3_create_collation(db, "nocase", SQLITE_UTF16, nullptr, Sqliter::compareNocase16))
return false;
return true;
}
void Sqliter::upper(sqlite3_context* a_context, int a_argc, sqlite3_value** a_argv)
{
static QString result;
switch (sqlite3_value_type(a_argv[0]))
{
case SQLITE_TEXT:
- result = QString::fromUtf16(static_cast<const ushort*>(sqlite3_value_text16(a_argv[0]))).toUpper();
+ {
+ const ushort* unicode = static_cast<const ushort*>(sqlite3_value_text16(a_argv[0]));
+ int size = 0;
+ while (unicode[size])
+ ++size;
+ result = QString::fromRawData(static_cast<const QChar*>(sqlite3_value_text16(a_argv[0])), size).toUpper();
sqlite3_result_text16(a_context, result.data(), -1, nullptr);
break;
-
+ }
case SQLITE_NULL:
sqlite3_result_null(a_context);
break;
default:
sqlite3_result_error_code(a_context, SQLITE_MISMATCH);
}
Q_UNUSED(a_argc);
}
void Sqliter::lower(sqlite3_context* a_context, int a_argc, sqlite3_value** a_argv)
{
static QString result;
switch (sqlite3_value_type(a_argv[0]))
{
case SQLITE_TEXT:
- result = QString::fromUtf16(static_cast<const ushort*>(sqlite3_value_text16(a_argv[0]))).toLower();
+ {
+ const ushort* unicode = static_cast<const ushort*>(sqlite3_value_text16(a_argv[0]));
+ int size = 0;
+ while (unicode[size])
+ ++size;
+ result = QString::fromRawData(static_cast<const QChar*>(sqlite3_value_text16(a_argv[0])), size).toLower();
sqlite3_result_text16(a_context, result.data(), -1, nullptr);
break;
-
+ }
case SQLITE_NULL:
sqlite3_result_null(a_context);
break;
default:
sqlite3_result_error_code(a_context, SQLITE_MISMATCH);
}
Q_UNUSED(a_argc);
}
int Sqliter::compareNocase8(void* a_pArg, int a_size1, const void* a_data1, int a_size2, const void* a_data2)
{
QString s1 = QString::fromUtf8(static_cast<const char*>(a_data1), a_size1);
QString s2 = QString::fromUtf8(static_cast<const char*>(a_data2), a_size2);
return s1.compare(s2, Qt::CaseInsensitive);
Q_UNUSED(a_pArg);
}
int Sqliter::compareNocase16(void* a_pArg, int a_size1, const void* a_data1, int a_size2, const void* a_data2)
{
QString s1 = QString::fromRawData(static_cast<const QChar*>(a_data1), a_size1 / sizeof(QChar));
QString s2 = QString::fromRawData(static_cast<const QChar*>(a_data2), a_size2 / sizeof(QChar));
return s1.compare(s2, Qt::CaseInsensitive);
Q_UNUSED(a_pArg);
}

File Metadata

Mime Type
text/x-diff
Expires
Tue, Jul 29, 5:37 AM (1 d, 15 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
139589

Event Timeline