Sqlite3, c-api, icu collation - PullRequest
       4

Sqlite3, c-api, icu collation

2 голосов
/ 22 марта 2012

С помощью некоторых руководств я успешно скомпилировал расширение ICU для sqlite3 с помощью gcc и получил libSqliteIcu.so, без единой ошибки. Затем я скопировал этот lib в папку / usr / lib. После этого я запускаю sqlite через терминал и ".load libSqliteIcu.so", а затем "icu_load_collation (" hr_HR "," CROATIAN ");" все без ошибок или замечаний на терминале. Результаты запросов теперь правильно сортируются.

Что мне теперь делать, чтобы использовать хорватскую сортировку через c-api?

Я пытаюсь:

sqlite3_stmt *selStmt;
const char *zSqlSelect = "SELECT sif, name, kat FROM mytable WHERE naziv LIKE 'mala%' ORDER BY naziv COLLATE CROATIAN;";
if (sqlite3_prepare_v2(db, zSqlSelect, -1, &selStmt, NULL) == SQLITE_OK )
{
    int cols = sqlite3_column_count(selStmt);
    int result = 0;
    while(true)
    {
        result = sqlite3_step(selStmt);
        if(result == SQLITE_ROW)
        {
            for(int col = 0; col < cols; col++)
            {
                printf("%s %s \t", sqlite3_column_name(selStmt,col), "=");
                printf("%s\n", sqlite3_column_text(selStmt, col));
            }
        }
        else break;
    }
    sqlite3_finalize(selStmt);
}
else
    printf("db error: %s\n", sqlite3_errmsg(db));

Сообщение об ошибке: «db error: нет такой последовательности сортировки: CROATIAN».

Что мне не хватает и как получить правильную сортировку sqlite3 по заданному сопоставлению через c-api, как я получаю через командную строку?

1 Ответ

2 голосов
/ 23 марта 2012

Я нахожу решение, так что здесь, как ansewer.Сразу после открытия базы данных ее следует удалить, и затем вы можете использовать имя сопоставления в запросе, чтобы получить результат без учета регистра и правильно отсортированный результат.Несмотря на хорватский пример, я думаю, что это можно применить ко всем сопоставлениям, поддерживаемым ICU.

    if (sqlite3_enable_load_extension(db, 1) == SQLITE_OK)
    {
    printf ("loading extensions enabled\n");
    const char* library;

    #if defined(linux)   
        library = "path_to/libSqliteIcu.so";
    #else
        library = "path_to\libSqliteIcu.dll";
    #endif

        if (sqlite3_load_extension(db, library, 0, 0) == SQLITE_OK)
        {
            sqlite3_stmt *collation;
            if (sqlite3_prepare_v2(db, "SELECT icu_load_collation('hr_HR', 'CROATIAN');", -1, &collation, 0) != SQLITE_OK)
            printf("db error: %s\n", sqlite3_errmsg(db));

            if (collation)
                sqlite3_step(collation);
            else
                printf("Error: collation is not loaded");

            sqlite3_finalize(collation);
        }
        else
            printf ("Error: libSqliteIcu NOT loaded\n");
    }
    else
        printf("Error: enable_load_extension\n");

    if (sqlite3_enable_load_extension(db, 0) == SQLITE_OK) printf ("loading extensions disabled\n");

Итак, остался только один связанный вопрос:
Как получить LIKE-поиск с учетом регистра, когда мы используем sqlite таким образом?
Я пытаюсь использовать COLLATE BINARY, и он снова нечувствителен к регистру.

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