Skip to content
  • Stefan Brüns's avatar
    [Bookmarks Runner] Open database connection in the query thread · 145caeac
    Stefan Brüns authored
    Summary:
    QSqlDatabase connection instances are global reference counted objects which
    can be crated using the QSqlDatabase::addDatabase(...) method and later
    retrieved with QSqlDatabase::database(connectionname).
    
    Connections should only be used from a single thread, and should be cleaned
    up with QSD::removeDatabase(name), which implicitly closes the connection
    when the last reference is removed.
    
    Currently, the same connection (name) is reused over all threads, and
    the connection is only removed implicitly by replacing it via addDatabase().
    This leads to warnings, i.e.: "QSqlDatabasePrivate::addDatabase: duplicate
    connection name '...', old connection removed."
    
    As one reference is held by the m_db member, the implicit removal triggers
    another warning: "QSqlDatabasePrivate::removeDatabase: connection '..."
    is still in use, all queries will cease to work."
    
    According to the documentation, "It is highly recommended that you do not
    keep a copy of the QSqlDatabase around as a member of a class, as this
    will prevent the instance from being correctly cleaned up on shutdown."
    There is no need to keep a reference using a member variable, as retrieving
    an open connection via QSqlDatabase::database(...) is cheap.
    
    Create a per-thread DB connection on first use, and remove the connections
    when the FetchSqlite instance is torn down.
    
    Delaying the open is beneficial for the favicon instance, which may be
    unused when the icon is already cached on disk.
    
    See also T9626.
    
    BUG: 400723
    
    Test Plan:
    execute a query in krunner
    1. Results are as expected
    2. The 'QSqlDatabasePrivate::removeDatabase: connection ... is still in use,
       all queries will cease to work.' warning no longer appears
    3. The 'QSqlDatabasePrivate::addDatabase: duplicate connection name ...,
       old connection removed' warning no longer appears
    
    Reviewers: #frameworks, mart
    
    Reviewed By: mart
    
    Subscribers: plasma-devel
    
    Tags: #plasma
    
    Differential Revision: https://phabricator.kde.org/D16409
    145caeac