Баг метода isOpen() в QSqlDatabase
Наткнулся я на один не приятный баг в Qt 5.4. Выяснил вот, что в классе QSqlDatabase метод isOpen(), отвечающий за проверку соединения с базой данных, НЕ РАБОТАЕТ. Он всегда возвращает true, даже если соединение с базой оборвалось. Метод гугления показал, что я не единственный кто напоролся на этот баг. И главное, народ о нём уже репортил разработчикам в более ранних релизах Qt (если память не изменяет в 4.8), но баг всё ещё присутствует. =/
Выход из ситуации следующий: используйте API той БД с которой работаете. Ниже пример того, как я это сделал через MySQL API (Си’шный).
#include "mysql.h"
// функция для замены метода isOpen()
bool SQLmanager::haveConnection() {
QVariant handle = db.driver()->handle();
if ((QString)handle.typeName() == (QString)"MYSQL*") {
MYSQL *nativeHandle = *static_cast<MYSQL **>(handle.data());
if (nativeHandle != 0) { // если удалось получить указатель
if (mysql_ping(nativeHandle) == 0) // mysql_ping возвращает 0, если соединение есть, иначе возвращает код ошибки
return true;
else
return false;
}/* else {
qDebug() << "не удалось получить указатель MYSQL*";
}*/
}
return false;
}