25 сентября 2010 г.

Qt + SQLITE + регистронезависимый поиск

Стояла задача обеспечить в sqlite регистронезависимый поиск по русскому тексту в UTF-8. Sqlite такого в стандартной поставке делать не умеет.

Выход найден.

Делаем следующее:

  1. Устанавливаем пакеты если их еще нет
    • libsqlite3-dev
    • sqlite3-0-dbg
  2. Скачиваем файл
    wget www.sqlite.org/cvstrac/getfile?f=sqlite/ext/icu/icu.c -O icu.c
  3. Собираем
    gcc -shared icu.c `icu-config --ldflags` -o libSqliteIcu.so

    для AMD 64

    gcc -shared icu.c `icu-config --ldflags` -fPIC -o libSqliteIcu.so

    Не забываем о регистре в именах файлов для *nix систем

    Копируем собранную библиотеку например к бинарику проекта, я скопировал в /usr/lib т.к. пользуюсь этой либой в command-line интерфейсе sqlite

  4. В pro файле добавляем
    LIBS += -lsqlite3
  5. В проекте добавляем
        #include <sqlite3ext.h>
        ...
        // после того как база данных открыта пишем
        QVariant v = db.driver()->handle();
       if (v.isValid() && qstrcmp(v.typeName(), "sqlite3*")==0) {
           // v.data() returns a pointer to the handle
            sqlite3 *handle = *static_cast(v.data());
            if (handle != 0) { // check that it is not NULL
                int res = sqlite3_enable_load_extension(handle,1);
                if (res == SQLITE_OK)
                {
                    res = sqlite3_load_extension(handle,"libSqliteIcu.so",0,0);
                    if (res == SQLITE_OK)
                       qDebug() << "Sqlite3 load ICU extension sucessfully";
                    else
                       qDebug() << "Sqlite3 load ICU extension fail";
                }
                else
                       qDebug() << "Sqlite3 enable load extension fail";
            }
        }

И получаем проект в котором все запросы c LIKE, UPPER, LOWER отрабатываются с русским языком именно так как должно быть.