bool DatabaseLogger::logqmsg(MSqlQuery &query, LoggingItem *item) { char timestamp[TIMESTAMP_MAX]; char *threadName = getThreadName(item); strftime( timestamp, TIMESTAMP_MAX-8, "%Y-%m-%d %H:%M:%S", (const struct tm *)&item->tm ); query.bindValue(":THREAD", threadName); query.bindValue(":MSGTIME", timestamp); query.bindValue(":LEVEL", item->level); query.bindValue(":MESSAGE", item->message); if (!query.exec()) { // Suppress Driver not loaded errors that occur at startup. // and suppress additional errors for one second after the // previous error (to avoid spamming the log). QSqlError err = query.lastError(); if ((err.type() != 1 || err.number() != -1) && (!m_errorLoggingTime.isValid() || (m_errorLoggingTime.elapsed() > 1000))) { MythDB::DBError("DBLogging", query); m_errorLoggingTime.start(); } return false; } deleteItem(item); return true; }
/** * \brief Try to get a lock on the table schemalock. * * To prevent upgrades by different programs of the same schema. * (<I>e.g.</I> when both mythbackend and mythfrontend start at the same time) */ bool DBUtil::lockSchema(MSqlQuery &query) { if (!query.exec("CREATE TABLE IF NOT EXISTS " "schemalock ( schemalock int(1));")) { LOG(VB_GENERAL, LOG_CRIT, QString("ERROR: Unable to create schemalock table: %1") .arg(MythDB::DBErrorMessage(query.lastError()))); return false; } if (!query.exec("LOCK TABLE schemalock WRITE;")) { LOG(VB_GENERAL, LOG_CRIT, QString("ERROR: Unable to acquire database upgrade lock") .arg(MythDB::DBErrorMessage(query.lastError()))); return false; } return true; }
QString MythDB::GetError(const QString &where, const MSqlQuery &query) { QString str = QString("DB Error (%1):\n").arg(where); str += "Query was:\n"; str += query.executedQuery() + '\n'; QString tmp = toCommaList(query.boundValues()); if (!tmp.isEmpty()) { str += "Bindings were:\n"; str += tmp; } str += DBErrorMessage(query.lastError()); return str; }
/// \brief Actually insert a log message from the queue into the database /// \param query The database insert query to use /// \param item LoggingItem containing the log message to insert bool DatabaseLogger::logqmsg(MSqlQuery &query, LoggingItem *item) { char timestamp[TIMESTAMP_MAX]; time_t epoch = item->epoch(); struct tm tm; localtime_r(&epoch, &tm); strftime(timestamp, TIMESTAMP_MAX-8, "%Y-%m-%d %H:%M:%S", (const struct tm *)&tm); query.bindValue(":TID", item->tid()); query.bindValue(":THREAD", item->threadName()); query.bindValue(":FILENAME", item->file()); query.bindValue(":LINE", item->line()); query.bindValue(":FUNCTION", item->function()); query.bindValue(":MSGTIME", timestamp); query.bindValue(":LEVEL", item->level()); query.bindValue(":MESSAGE", item->message()); query.bindValue(":APP", item->appName()); query.bindValue(":PID", item->pid()); if (!query.exec()) { // Suppress Driver not loaded errors that occur at startup. // and suppress additional errors for one second after the // previous error (to avoid spamming the log). QSqlError err = query.lastError(); if ((err.type() != 1 || err.number() != -1) && (!m_errorLoggingTime.isValid() || (m_errorLoggingTime.elapsed() > 1000))) { MythDB::DBError("DBLogging", query); m_errorLoggingTime.start(); } return false; } return true; }