Использование пользовательских функций SQLite с Qt - PullRequest
3 голосов
/ 09 июня 2011

Я пытаюсь создать пользовательскую функцию для базы данных SQLite, которую я использую с Qt.Я нашел информацию о том, как создать функцию, и она, кажется, работает правильно в системе x86.

Вместо этого, похоже, происходит сбой при segfault на устройстве ARM.Вот код, который я написал:

static bool createSQLiteFunctions(const QSqlDatabase& db)
{
// Get handle to the driver and check it is both valid and refers to SQLite3.
QVariant v = db.driver()->handle();
if (!v.isValid() || qstrcmp(v.typeName(), "sqlite3*") != 0) {
LOG_WARNING("Cannot get a sqlite3 handle to the driver.");
return false;
}

// Create a handler and attach functions.
sqlite3* handler = *static_cast<sqlite3**>(v.data());
if (!handler) {
LOG_WARNING("Cannot get a sqlite3 handler.");
return false;
}

// Check validity of the state.
if (!db.isValid()) {
LOG_ERROR("Cannot create SQLite custom functions: db object is not valid.");
return false;
}

if (!db.isOpen()) {
LOG_ERROR("Cannot create SQLite custom functions: db object is not open.");
return false;
}

if (sqlite3_create_function(handler, "_deleteFile", 1, SQLITE_ANY, 0, &_sqlite3DeleteFile, 0, 0))
LOG_ERROR("Cannot create SQLite functions: sqlite3_create_function failed.");

return true;
}

Объект db создается как член другого объекта, который вызывает эту функцию в конструкторе, где установлено соединение с базой данных (может быть несколько экземпляров).создается одновременно, но sqlite3 компилируется с поточно-ориентированной опцией).Кажется, что журнал ошибок не печатается и, но функция sqlite3_create_function выдает ошибку.Если я удаляю вызов createSQLiteFunctions все работает нормально.Любая идея, почему результатом является segfault?Спасибо!

Ответы [ 2 ]

1 голос
/ 03 ноября 2016

Драйвер QSql для sqlite3 можно связать с sqlite3 статически в библиотеке Qt (используя версию репозиториев Qt sqlite3) или динамически, используя версию sqlite3, присутствующую в вашей системе (то есть в sysroot, когда вы кросс-компилируете для ARM).

Проблема возникает, когда версия sqlite3, с которой связано ваше приложение, отличается от версии, связанной с Qt, поскольку это вызывает проблемы, например, со статическими переменными, которые по-разному инициализируются в двух версиях.

Эта проблема видна только при вызове собственных функций sqlite3 для дескриптора, полученного из Qt, все работает идеально, если только вызываются только функции QSqlDatabase, поскольку при этом используется только версия sqlite3, статически связанная в Qt.

Проверьте опцию настройки Qt "system-sqlite", также имейте в виду, что эта опция не работает в некоторых версиях Qt (см. Commit ced4d167a25b в репозитории qtbase).

1 голос
/ 09 июня 2011

Если в ARM происходит сбой, возможно, он должен что-то делать с компиляцией (какой sqlite3 вы используете?) Или с самой функцией обратного вызова (_sqlite3DeleteFile). Как это определяется, где он находится / связан. В зависимости от ARM (какой ARM вы используете) процессор может быть очень требователен к выравниванию. Проверьте файл карты, возможно, MMU-конфигурацию, ...?

Кстати: я бы предпочел опустить const, так как мы модифицируем db.

static bool createSQLiteFunctions(/*const*/ QSqlDatabase& db)

Можете ли вы отладить шаг в код функции sqlite3_create_function? Вы можете произвести след?

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