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 #include bool Sqliter::install(QVariant a_driverHandle) { if (!a_driverHandle.isValid() || qstrcmp(a_driverHandle.typeName(), "sqlite3*") != 0) return false; sqlite3* db = *static_cast(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(sqlite3_value_text16(a_argv[0]))).toUpper(); + { + const ushort* unicode = static_cast(sqlite3_value_text16(a_argv[0])); + int size = 0; + while (unicode[size]) + ++size; + result = QString::fromRawData(static_cast(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(sqlite3_value_text16(a_argv[0]))).toLower(); + { + const ushort* unicode = static_cast(sqlite3_value_text16(a_argv[0])); + int size = 0; + while (unicode[size]) + ++size; + result = QString::fromRawData(static_cast(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(a_data1), a_size1); QString s2 = QString::fromUtf8(static_cast(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(a_data1), a_size1 / sizeof(QChar)); QString s2 = QString::fromRawData(static_cast(a_data2), a_size2 / sizeof(QChar)); return s1.compare(s2, Qt::CaseInsensitive); Q_UNUSED(a_pArg); }