/*! Prepares the SQL query \a query for execution. Returns true if the query is prepared successfully; otherwise returns false. The query may contain placeholders for binding values. Both Oracle style colon-name (e.g., \c{:surname}), and ODBC style (\c{?}) placeholders are supported; but they cannot be mixed in the same query. See the \l{QSqlQuery examples}{Detailed Description} for examples. Portability note: Some databases choose to delay preparing a query until it is executed the first time. In this case, preparing a syntactically wrong query succeeds, but every consecutive exec() will fail. For SQLite, the query string can contain only one statement at a time. If more than one statement is given, the function returns false. Example: \snippet sqldatabase/sqldatabase.cpp 9 \sa exec(), bindValue(), addBindValue() */ bool QSqlQuery::prepare(const QString& query) { if (d->ref.load() != 1) { bool fo = isForwardOnly(); *this = QSqlQuery(driver()->createResult()); setForwardOnly(fo); d->sqlResult->setNumericalPrecisionPolicy(d->sqlResult->numericalPrecisionPolicy()); } else { d->sqlResult->setActive(false); d->sqlResult->setLastError(QSqlError()); d->sqlResult->setAt(QSql::BeforeFirstRow); d->sqlResult->setNumericalPrecisionPolicy(d->sqlResult->numericalPrecisionPolicy()); } if (!driver()) { qWarning("QSqlQuery::prepare: no driver"); return false; } if (!driver()->isOpen() || driver()->isOpenError()) { qWarning("QSqlQuery::prepare: database not open"); return false; } if (query.isEmpty()) { qWarning("QSqlQuery::prepare: empty query"); return false; } #ifdef QT_DEBUG_SQL qDebug("\n QSqlQuery::prepare: %s", query.toLocal8Bit().constData()); #endif return d->sqlResult->savePrepare(query); }
bool QSqlQuery::exec(const QString& query) { #ifdef QT_DEBUG_SQL QElapsedTimer t; t.start(); #endif if (d->ref.load() != 1) { bool fo = isForwardOnly(); *this = QSqlQuery(driver()->createResult()); d->sqlResult->setNumericalPrecisionPolicy(d->sqlResult->numericalPrecisionPolicy()); setForwardOnly(fo); } else { d->sqlResult->clear(); d->sqlResult->setActive(false); d->sqlResult->setLastError(QSqlError()); d->sqlResult->setAt(QSql::BeforeFirstRow); d->sqlResult->setNumericalPrecisionPolicy(d->sqlResult->numericalPrecisionPolicy()); } d->sqlResult->setQuery(query.trimmed()); if (!driver()->isOpen() || driver()->isOpenError()) { qWarning("QSqlQuery::exec: database not open"); return false; } if (query.isEmpty()) { qWarning("QSqlQuery::exec: empty query"); return false; } bool retval = d->sqlResult->reset(query); #ifdef QT_DEBUG_SQL qDebug().nospace() << "Executed query (" << t.elapsed() << "ms, " << d->sqlResult->size() << " results, " << d->sqlResult->numRowsAffected() << " affected): " << d->sqlResult->lastQuery(); #endif return retval; }
bool MSqlQuery::prepare(const QString& query) { if (!m_db) { // Database structure's been deleted return false; } m_last_prepared_query = query; #ifdef DEBUG_QT4_PORT if (query.contains(m_testbindings)) { LOG(VB_GENERAL, LOG_DEBUG, QString("\n\nQuery contains bind value \"%1\" twice:\n\n\n") .arg(m_testbindings.cap(1)) + query); #if 0 exit(1); #endif } #endif // Database connection down. Try to restart it, give up if it's still // down if (!m_db) { // Database structure has been deleted... return false; } if (!m_db->isOpen() && !Reconnect()) { LOG(VB_GENERAL, LOG_INFO, "MySQL server disconnected"); return false; } // QT docs indicate that there are significant speed ups and a reduction // in memory usage by enabling forward-only cursors // // Unconditionally enable this since all existing uses of the database // iterate forward over the result set. setForwardOnly(true); bool ok = QSqlQuery::prepare(query); // if the prepare failed with "MySQL server has gone away" // Close and reopen the database connection and retry the query if it // connects again if (!ok && QSqlQuery::lastError().number() == 2006 && Reconnect()) ok = true; if (!ok && !(GetMythDB()->SuppressDBMessages())) { LOG(VB_GENERAL, LOG_ERR, QString("Error preparing query: %1").arg(query)); LOG(VB_GENERAL, LOG_ERR, MythDB::DBErrorMessage(QSqlQuery::lastError())); } return ok; }