SQLite и UTF8 - PullRequest
       26

SQLite и UTF8

0 голосов
/ 06 июля 2011

У меня странная проблема. Не могу добавить функцию в sqlite / Запись на c ++ / Qt. Функция должна выполнять символы UTF-8;

    this->db = QSqlDatabase::addDatabase("QSQLITE");
    this->db.setDatabaseName(db);
    this->db.open();
    QVariant v = this->db.driver()->handle();
    sqlite3 *handler = *static_cast<sqlite3 **>(v.data());
    sqlite3_create_function( handler, "myUpper", 1, SQLITE_ANY, NULL, myFunc, NULL, NULL )

и функция:

void myFunc( sqlite3_context * ctx, int argc, sqlite3_value ** argv )
{
        if( argc != 1 ) return;
        QString str;
        switch(sqlite3_value_type(argv[0]))
        {
                case SQLITE_NULL:
                {
                        sqlite3_result_text( ctx, "NULL", 4, SQLITE_STATIC );
                        break;
                }
                case SQLITE_TEXT:
                {
                        QString wstr((char*)sqlite3_value_text16(argv[0]));
                        wstr = wstr.toUpper();
                        sqlite3_result_text16( ctx, wstr.toStdString().c_str(), wstr.size() , SQLITE_TRANSIENT );
                        break;
                }
                default:
                        sqlite3_result_text( ctx, "NULL", 4, SQLITE_STATIC );
                break;
        }
}

1 Ответ

2 голосов
/ 06 июля 2011

Вы не указали проблему, но я полагаю, вы должны передать указатель на функцию:

sqlite3_create_function(handler, "myUpper", 1, SQLITE_ANY, NULL, &myFunc, NULL, NULL)

EDIT: Если вы переходите к функции wstr.toStdString (). C_str (). Это недопустимо, поскольку возвращаемый указатель является только временным и выходит за пределы области видимости. Что бы я сделал, это:

...
case SQLITE_TEXT: {
   QString wstr((char*)sqlite3_value_text(argv[0]));
   wstr = wstr.toUpper();
   QByteArray array = wstr.toLocal8Bit();
   const char* cstr = array.data();
   sqlite3_result_text(ctx, cstr, wstr.size() , SQLITE_TRANSIENT);
   break;
}
...

Я не пробовал, поэтому проверь это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...