Ronald Bourret
Ronald Bourret

Reputation: 41

Connection still open after QSqlDatabase goes out of scope

Why does the following code print true instead of false?

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    if (!openDatabase()) return 1;

    // false means don't open closed connections.
    QSqlDatabase db2 = QSqlDatabase::database("foo", false);

    qDebug() << db2.isOpen();
    return 0;
}

bool openDatabase()
{
    QSqlDatabase db1 = QSqlDatabase::addDatabase("QPSQL", "foo");
    db1.setHostName("localhost");
    db1.setUserName("user");
    db1.setPassword("password");
    db1.setDatabaseName("bar");

    return db1.open();
}

According to example #2 in the first answer to What is the correct way of QSqlDatabase & QSqlQuery?, the database connection is closed when the QSqlDatabase object goes out of scope. Thus, when db1 goes out of scope at the end of openDatabase(), the connection should be closed.

(What actually happens is a bit more subtle. Internally, QSqlDatabase maintains a reference count of the QSqlDatabase objects it has returned for a particular connection. The reference count is decremented by ~QSqlDatabase and, when it reaches 0, the connection is closed. However, this should not change anything. The reference count should be 1 after the first line in openDatabase() and 0 after the function ends and db1 is destroyed.)

What am I missing?

Upvotes: 2

Views: 766

Answers (1)

Mohammad Kanan
Mohammad Kanan

Reputation: 4582

You are right, according to QTBUG-17140, despite that the scenario in the bug is slightly different, the problem is general as there are issues with implementing isOpen() to check if database connection is active, it was reported until Qt 5.3.1 , the bug report does not show it was solved.

Upvotes: 1

Related Questions