int SchemaUpgradeWizard::CompareAndWait(const int seconds) { if (Compare() > 0) // i.e. if DB is older than expected { QString message = tr("%1 database schema is old. Waiting to see if DB " "is being upgraded.").arg(m_schemaName); LOG(VB_GENERAL, LOG_CRIT, message); MSqlQuery query(MSqlQuery::InitCon(MSqlQuery::kDedicatedConnection)); bool backupRunning = false; bool upgradeRunning = false; MythTimer elapsedTimer; elapsedTimer.start(); while (versionsBehind && (elapsedTimer.elapsed() < seconds * 1000)) { sleep(1); if (IsBackupInProgress()) { LOG(VB_GENERAL, LOG_CRIT, "Waiting for Database Backup to complete."); if (!backupRunning) { elapsedTimer.restart(); backupRunning = true; } continue; } if (!lockSchema(query)) { LOG(VB_GENERAL, LOG_CRIT, "Waiting for Database Upgrade to complete."); if (!upgradeRunning) { elapsedTimer.restart(); upgradeRunning = true; } continue; } Compare(); unlockSchema(query); if (m_expertMode) break; } if (versionsBehind) LOG(VB_GENERAL, LOG_CRIT, "Timed out waiting."); else LOG(VB_GENERAL, LOG_CRIT, "Schema version was upgraded while we were waiting."); } // else DB is same version, or newer. Either way, we won't upgrade it return versionsBehind; }
void MythSocket::WriteStringListReal(const QStringList *list, bool *ret) { if (list->empty()) { LOG(VB_GENERAL, LOG_ERR, LOC + "WriteStringList: Error, invalid string list."); *ret = false; return; } if (m_tcpSocket->state() != QAbstractSocket::ConnectedState) { LOG(VB_GENERAL, LOG_ERR, LOC + "WriteStringList: Error, called with unconnected socket."); *ret = false; return; } QString str = list->join("[]:[]"); if (str.isEmpty()) { LOG(VB_GENERAL, LOG_ERR, LOC + "WriteStringList: Error, joined null string."); *ret = false; return; } QByteArray utf8 = str.toUtf8(); int size = utf8.length(); int written = 0; int written_since_timer_restart = 0; QByteArray payload; payload = payload.setNum(size); payload += " "; payload.truncate(8); payload += utf8; size = payload.length(); if (VERBOSE_LEVEL_CHECK(VB_NETWORK, LOG_INFO)) { QString msg = QString("write -> %1 %2") .arg(m_tcpSocket->socketDescriptor(), 2).arg(payload.data()); if (logLevel < LOG_DEBUG && msg.length() > 88) { msg.truncate(85); msg += "..."; } LOG(VB_NETWORK, LOG_INFO, LOC + msg); } MythTimer timer; timer.start(); unsigned int errorcount = 0; while (size > 0) { if (m_tcpSocket->state() != QAbstractSocket::ConnectedState) { LOG(VB_GENERAL, LOG_ERR, LOC + "WriteStringList: Error, socket went unconnected." + QString("\n\t\t\tWe wrote %1 of %2 bytes with %3 errors") .arg(written).arg(written+size).arg(errorcount) + QString("\n\t\t\tstarts with: %1").arg(to_sample(payload))); *ret = false; return; } int temp = m_tcpSocket->write(payload.data() + written, size); if (temp > 0) { written += temp; written_since_timer_restart += temp; size -= temp; if ((timer.elapsed() > 500) && written_since_timer_restart != 0) { timer.restart(); written_since_timer_restart = 0; } } else if (temp <= 0) { errorcount++; if (timer.elapsed() > 1000) { LOG(VB_GENERAL, LOG_ERR, LOC + "WriteStringList: Error, " + QString("No data written on write (%1 errors)") .arg(errorcount) + QString("\n\t\t\tstarts with: %1") .arg(to_sample(payload))); *ret = false; return; } usleep(1000); } } m_tcpSocket->flush(); *ret = true; return; }
bool MythSocket::writeStringList(QStringList &list) { if (list.size() <= 0) { VERBOSE(VB_IMPORTANT, LOC + "writeStringList: Error, invalid string list."); return false; } if (state() != Connected) { VERBOSE(VB_IMPORTANT, LOC + "writeStringList: Error, called with unconnected socket."); return false; } QString str = list.join("[]:[]"); if (str.isEmpty()) { VERBOSE(VB_IMPORTANT, LOC + "writeStringList: Error, joined null string."); return false; } QByteArray utf8 = str.toUtf8(); int size = utf8.length(); int written = 0; int written_since_timer_restart = 0; QByteArray payload; payload = payload.setNum(size); payload += " "; payload.truncate(8); payload += utf8; size = payload.length(); if (VERBOSE_LEVEL_CHECK(VB_NETWORK)) { QString msg = QString("write -> %1 %2") .arg(socket(), 2).arg(payload.data()); if (!VERBOSE_LEVEL_CHECK(VB_EXTRA) && msg.length() > 88) { msg.truncate(85); msg += "..."; } VERBOSE(VB_NETWORK, LOC + msg); } MythTimer timer; timer.start(); unsigned int errorcount = 0; while (size > 0) { if (state() != Connected) { VERBOSE(VB_IMPORTANT, LOC + "writeStringList: Error, socket went unconnected." + QString("\n\t\t\tWe wrote %1 of %2 bytes with %3 errors") .arg(written).arg(written+size).arg(errorcount) + QString("\n\t\t\tstarts with: %1").arg(toSample(payload))); return false; } int temp = writeBlock(payload.data() + written, size); if (temp > 0) { written += temp; written_since_timer_restart += temp; size -= temp; if ((timer.elapsed() > 500) && written_since_timer_restart != 0) { timer.restart(); written_since_timer_restart = 0; } } else if (temp < 0 && error() != MSocketDevice::NoError) { VERBOSE(VB_IMPORTANT, LOC + QString("writeStringList: Error, writeBlock failed. (%1)") .arg(errorToString())); return false; } else if (temp <= 0) { errorcount++; if (timer.elapsed() > 1000) { VERBOSE(VB_GENERAL, LOC + "writeStringList: Error, " + QString("No data written on writeBlock (%1 errors)") .arg(errorcount) + QString("\n\t\t\tstarts with: %1") .arg(toSample(payload))); return false; } usleep(1000); } } flush(); return true; }