Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Using SQLite custom functions with Qt

Using SQLite custom functions with Qt

Scheduled Pinned Locked Moved General and Desktop
1 Posts 1 Posters 4.6k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • L Offline
    L Offline
    Luc4
    wrote on last edited by
    #1

    Hi! I'm trying to create a custom function for a SQLite database I'm using with Qt. I found information on how to create the function and it seems to work correctly on a x86 system.

    Instead, it seems to be failing with a segfault on an ARM device. This is the code I wrote:

    @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;
    }@

    The db object is instantiated as a member of another object, which is calling this function in the constructor, where the connection to the db is estabilished:

    @ ...
    // Create the connection to the database. The connection has to be different
    // for each thread requiring one.
    db = QSqlDatabase::addDatabase("QSQLITE", connectionName);

    // Setup the database to avoid lockings.
    db.setConnectOptions("QSQLITE_BUSY_TIMEOUT=10000");

    db.setDatabaseName(MEDIASTORE_DATABASE_FILENAME);
    if (!db.open()) {
    LOG_ERROR("Failed to open the database.");
    // TODO: What to do in case of errors??
    }

    // Create custom defined functions.
    if (!createSQLiteFunctions(db)) {
    LOG_ERROR("Failed to create custom functions.");
    // TODO: What to do in case of errors??
    }
    ...@

    It seems that no error log is printed and, but the sqlite3_create_function function gives a segfault. If I remove the call to createSQLiteFunctions everything works fine.

    I suspect this may be related to http://bugreports.qt.nokia.com/browse/QTBUG-16586. Any idea how I can solve this?
    Thanks!

    1 Reply Last reply
    0

    • Login

    • Login or register to search.
    • First post
      Last post
    0
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Get Qt Extensions
    • Unsolved