bool MSqlQuery::exec() { // Database connection down. Try to restart it, give up if it's still // down if (!m_db) { // Database structure's been deleted return false; } if (!m_db->isOpen() && !m_db->Reconnect()) { LOG(VB_GENERAL, LOG_INFO, "MySQL server disconnected"); return false; } bool result = QSqlQuery::exec(); // if the query failed with "MySQL server has gone away" // Close and reopen the database connection and retry the query if it // connects again if (!result && QSqlQuery::lastError().number() == 2006 && m_db->Reconnect()) result = QSqlQuery::exec(); if (VERBOSE_LEVEL_CHECK(VB_DATABASE) && logLevel <= LOG_DEBUG) { QString str = lastQuery(); // Database logging will cause an infinite loop here if not filtered // out if (!str.startsWith("INSERT INTO logging ")) { // Sadly, neither executedQuery() nor lastQuery() display // the values in bound queries against a MySQL5 database. // So, replace the named placeholders with their values. QMapIterator<QString, QVariant> b = boundValues(); while (b.hasNext()) { b.next(); str.replace(b.key(), '\'' + b.value().toString() + '\''); } LOG(VB_DATABASE, LOG_DEBUG, QString("MSqlQuery::exec(%1) %2%3") .arg(m_db->MSqlDatabase::GetConnectionName()).arg(str) .arg(isSelect() ? QString(" <<<< Returns %1 row(s)") .arg(size()) : QString())); } } return result; }
void ReplSetTagConfig::put(const ReplSetTagMatch& matcher, std::ostream& os) const { BSONObjBuilder builder; BSONArrayBuilder allBindingsBuilder(builder.subarrayStart("bindings")); for (size_t i = 0; i < matcher._boundTagValues.size(); ++i) { BSONObjBuilder bindingBuilder(allBindingsBuilder.subobjStart()); _appendConstraint(matcher._boundTagValues[i].constraint, &bindingBuilder); BSONArrayBuilder boundValues(bindingBuilder.subarrayStart("boundValues")); for (size_t j = 0; j < matcher._boundTagValues[i].boundValues.size(); ++j) { BSONObjBuilder bvb(boundValues.subobjStart()); _appendTagValue(matcher._boundTagValues[i].constraint.getKeyIndex(), matcher._boundTagValues[i].boundValues[j], &bvb); } } allBindingsBuilder.doneFast(); os << builder.done(); }
bool QPSQLResult::exec() { if (!d->preparedQueriesEnabled) return QSqlResult::exec(); cleanup(); QString stmt; const QString params = qCreateParamString(boundValues(), d->q->driver()); if (params.isEmpty()) stmt = QString(QLatin1String("EXECUTE %1")).arg(d->preparedStmtId); else stmt = QString(QLatin1String("EXECUTE %1 (%2)")).arg(d->preparedStmtId).arg(params); d->result = PQexec(d->driver->connection, d->driver->isUtf8 ? stmt.toUtf8().constData() : stmt.toLocal8Bit().constData()); return d->processResults(); }
bool MSqlQuery::exec() { if (!m_db) { // Database structure's been deleted return false; } if (m_last_prepared_query.isEmpty()) { LOG(VB_GENERAL, LOG_ERR, "MSqlQuery::exec(void) called without a prepared query."); return false; } #if DEBUG_RECONNECT if (random() < RAND_MAX / 50) { LOG(VB_GENERAL, LOG_INFO, "MSqlQuery disconnecting DB to test reconnection logic"); m_db->m_db.close(); } #endif // Database connection down. Try to restart it, give up if it's still // down if (!m_db->isOpen() && !Reconnect()) { LOG(VB_GENERAL, LOG_INFO, "MySQL server disconnected"); return false; } QElapsedTimer timer; timer.start(); bool result = QSqlQuery::exec(); qint64 elapsed = timer.elapsed(); // if the query failed with "MySQL server has gone away" // Close and reopen the database connection and retry the query if it // connects again if (!result && QSqlQuery::lastError().number() == 2006 && Reconnect()) result = QSqlQuery::exec(); if (!result) { QString err = MythDB::GetError("MSqlQuery", *this); MSqlBindings tmp = QSqlQuery::boundValues(); bool has_null_strings = false; for (MSqlBindings::iterator it = tmp.begin(); it != tmp.end(); ++it) { if (it->type() != QVariant::String) continue; if (it->isNull() || it->toString().isNull()) { has_null_strings = true; *it = QVariant(QString("")); } } if (has_null_strings) { bindValues(tmp); timer.restart(); result = QSqlQuery::exec(); elapsed = timer.elapsed(); } if (result) { LOG(VB_GENERAL, LOG_ERR, QString("Original query failed, but resend with empty " "strings in place of NULL strings worked. ") + "\n" + err); } } if (VERBOSE_LEVEL_CHECK(VB_DATABASE, LOG_INFO)) { QString str = lastQuery(); // Database logging will cause an infinite loop here if not filtered // out if (!str.startsWith("INSERT INTO logging ")) { // Sadly, neither executedQuery() nor lastQuery() display // the values in bound queries against a MySQL5 database. // So, replace the named placeholders with their values. QMapIterator<QString, QVariant> b = boundValues(); while (b.hasNext()) { b.next(); str.replace(b.key(), '\'' + b.value().toString() + '\''); } LOG(VB_DATABASE, LOG_INFO, QString("MSqlQuery::exec(%1) %2%3%4") .arg(m_db->MSqlDatabase::GetConnectionName()).arg(str) .arg(QString(" <<<< Took %1ms").arg(QString::number(elapsed))) .arg(isSelect() ? QString(", Returned %1 row(s)") .arg(size()) : QString())); } } return result; }
bool QSpatiaLiteResult::exec() { const QVector<QVariant> values = boundValues(); d->skippedStatus = false; d->skipRow = false; d->rInf.clear(); clearValues(); setLastError(QSqlError()); int res = sqlite3_reset(d->stmt); if (res != SQLITE_OK) { setLastError(qMakeError(d->access, QCoreApplication::translate("QSpatiaLiteResult", "Unable to reset statement"), QSqlError::StatementError, res)); d->finalize(); return false; } int paramCount = sqlite3_bind_parameter_count(d->stmt); if (paramCount == values.count()) { for (int i = 0; i < paramCount; ++i) { res = SQLITE_OK; const QVariant value = values.at(i); if (value.isNull()) { res = sqlite3_bind_null(d->stmt, i + 1); } else { switch (value.type()) { case QVariant::ByteArray: { const QByteArray *ba = static_cast<const QByteArray*>(value.constData()); res = sqlite3_bind_blob(d->stmt, i + 1, ba->constData(), ba->size(), SQLITE_STATIC); break; } case QVariant::Int: res = sqlite3_bind_int(d->stmt, i + 1, value.toInt()); break; case QVariant::Double: res = sqlite3_bind_double(d->stmt, i + 1, value.toDouble()); break; case QVariant::UInt: case QVariant::LongLong: res = sqlite3_bind_int64(d->stmt, i + 1, value.toLongLong()); break; case QVariant::String: { // lifetime of string == lifetime of its qvariant const QString *str = static_cast<const QString*>(value.constData()); res = sqlite3_bind_text16(d->stmt, i + 1, str->utf16(), (str->size()) * sizeof(QChar), SQLITE_STATIC); break; } default: { QString str = value.toString(); // SQLITE_TRANSIENT makes sure that sqlite buffers the data res = sqlite3_bind_text16(d->stmt, i + 1, str.utf16(), (str.size()) * sizeof(QChar), SQLITE_TRANSIENT); break; } } } if (res != SQLITE_OK) { setLastError(qMakeError(d->access, QCoreApplication::translate("QSpatiaLiteResult", "Unable to bind parameters"), QSqlError::StatementError, res)); d->finalize(); return false; } } } else { setLastError(QSqlError(QCoreApplication::translate("QSpatiaLiteResult", "Parameter count mismatch"), QString(), QSqlError::StatementError)); return false; } d->skippedStatus = d->fetchNext(d->firstRow, 0, true); if (lastError().isValid()) { setSelect(false); setActive(false); return false; } setSelect(!d->rInf.isEmpty()); setActive(true); return true; }
bool QSymSQLResult::exec() { if (d->prepareCalled == false) { setLastError(qMakeError(d->access, QCoreApplication::translate("QSymSQLResult", "Statement is not prepared"), QSqlError::StatementError, KErrGeneral)); return false; } const QVector<QVariant> values = boundValues(); d->skippedStatus = false; d->skipRow = false; setAt(QSql::BeforeFirstRow); setLastError(QSqlError()); int res = d->stmt.Reset(); if (res != KErrNone) { setLastError(qMakeError(d->access, QCoreApplication::translate("QSymSQLResult", "Unable to reset statement"), QSqlError::StatementError, res)); d->finalize(); return false; } TPtrC tmp; TInt paramCount = 0; while (d->stmt.ParamName(paramCount, tmp) == KErrNone) paramCount++; if (paramCount == values.count()) { for (int i = 0; i < paramCount; ++i) { res = KErrNone; const QVariant value = values.at(i); if (value.isNull()) { res = d->stmt.BindNull(i); //replaced i + 1 with i } else { switch (value.type()) { case QVariant::ByteArray: { const QByteArray *ba = static_cast<const QByteArray*>(value.constData()); TPtrC8 data(reinterpret_cast<const TUint8 *>(ba->constData()), ba->length()); res = d->stmt.BindBinary(i, data); //replaced i + 1 with i break; } case QVariant::Int: res = d->stmt.BindInt(i, value.toInt()); //replaced i + 1 with i break; case QVariant::Double: res = d->stmt.BindReal(i, value.toDouble()); //replaced i + 1 with i break; case QVariant::UInt: case QVariant::LongLong: res = d->stmt.BindReal(i, value.toLongLong()); //replaced i + 1 with i break; case QVariant::String: { // lifetime of string == lifetime of its qvariant const QString *str = static_cast<const QString*>(value.constData()); res = d->stmt.BindText(i, qt_QString2TPtrC(*str)); // replaced i + 1 with i break; } default: { QString str = value.toString(); res = d->stmt.BindText(i, qt_QString2TPtrC(str)); //replaced i + 1 with i break; } } } if (res != KErrNone) { setLastError(qMakeError(d->access, QCoreApplication::translate("QSymSQLResult", "Unable to bind parameters"), QSqlError::StatementError, res)); d->finalize(); return false; } } } else { setLastError(QSqlError(QCoreApplication::translate("QSymSQLResult", "Parameter count mismatch"), QString(), QSqlError::StatementError)); return false; } d->skippedStatus = d->fetchNext(true); if (lastError().isValid()) { setSelect(false); setActive(false); return false; } if (d->stmt.ColumnCount() > 0) { //If there is something, it has to be select setSelect(true); } else { //If there isn't it might be just bad query, let's check manually whether we can find SELECT QString query = this->lastQuery(); query = query.trimmed(); query = query.toLower(); //Just check whether there is one in the beginning, don't know if this is enough //Comments should be at the end of line if those are passed //For some reason, case insensitive indexOf didn't work for me if (query.indexOf(QLatin1String("select")) == 0) { setSelect(true); } else { setSelect(false); } } setActive(true); return true; }