MSqlQueryInfo MSqlQuery::InitCon(ConnectionReuse _reuse) { bool reuse = kNormalConnection == _reuse; MSqlDatabase *db = GetMythDB()->GetDBManager()->popConnection(reuse); MSqlQueryInfo qi; InitMSqlQueryInfo(qi); // Bootstrapping without a database? //if (db->pretendHaveDB) if (db->m_db.hostName().isEmpty()) { // Return an invalid database so that QSqlQuery does nothing. // Also works around a Qt4 bug where QSqlQuery::~QSqlQuery // calls QMYSQLResult::cleanup() which uses mysql_next_result() GetMythDB()->GetDBManager()->pushConnection(db); qi.returnConnection = false; return qi; } qi.db = db; qi.qsqldb = db->db(); db->KickDatabase(); return qi; }
MSqlDatabase *MDBManager::popConnection() { PurgeIdleConnections(); m_sem->acquire(); m_lock.lock(); MSqlDatabase *db; if (m_pool.isEmpty()) { db = new MSqlDatabase("DBManager" + QString::number(m_nextConnID++)); ++m_connCount; LOG(VB_GENERAL, LOG_INFO, QString("New DB connection, total: %1").arg(m_connCount)); } else db = m_pool.takeLast(); m_lock.unlock(); db->OpenDatabase(); return db; }
bool MSqlQuery::testDBConnection() { MSqlDatabase *db = GetMythDB()->GetDBManager()->popConnection(true); // popConnection() has already called OpenDatabase(), // so we only have to check if it was successful: bool isOpen = db->isOpen(); GetMythDB()->GetDBManager()->pushConnection(db); return isOpen; }
MSqlDatabase *MDBManager::popConnection(bool reuse) { PurgeIdleConnections(true); m_lock.lock(); MSqlDatabase *db; #if REUSE_CONNECTION if (reuse) { db = m_inuse[QThread::currentThread()]; if (db != NULL) { m_inuse_count[QThread::currentThread()]++; m_lock.unlock(); return db; } } #endif DBList &list = m_pool[QThread::currentThread()]; if (list.isEmpty()) { db = new MSqlDatabase("DBManager" + QString::number(m_nextConnID++)); ++m_connCount; LOG(VB_DATABASE, LOG_INFO, QString("New DB connection, total: %1").arg(m_connCount)); } else { db = list.back(); list.pop_back(); } #if REUSE_CONNECTION if (reuse) { m_inuse_count[QThread::currentThread()]=1; m_inuse[QThread::currentThread()] = db; } #endif m_lock.unlock(); db->OpenDatabase(); return db; }
MSqlQueryInfo MSqlQuery::DDCon() { MSqlDatabase *db = GetMythDB()->GetDBManager()->getDDCon(); MSqlQueryInfo qi; InitMSqlQueryInfo(qi); qi.returnConnection = false; if (db) { qi.db = db; qi.qsqldb = db->db(); db->KickDatabase(); } return qi; }
bool TestDatabase(QString dbHostName, QString dbUserName, QString dbPassword, QString dbName, int dbPort) { bool ret = false; if (dbHostName.isEmpty() || dbUserName.isEmpty()) return ret; MSqlDatabase *db = new MSqlDatabase("dbtest"); if (!db) return ret; DatabaseParams dbparms; dbparms.dbName = dbName; dbparms.dbUserName = dbUserName; dbparms.dbPassword = dbPassword; dbparms.dbHostName = dbHostName; dbparms.dbPort = dbPort; // Just use some sane defaults for these values dbparms.wolEnabled = false; dbparms.wolReconnect = 1; dbparms.wolRetry = 3; dbparms.wolCommand = QString(); db->SetDBParams(dbparms); ret = db->OpenDatabase(true); delete db; db = NULL; return ret; }