Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F213312
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
3 KB
Subscribers
None
View Options
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
Details
Attached
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
Attached To
rLSQLTR Библиотека sqliter
Event Timeline
Log In to Comment