Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
dev:qt:qt_ibase_fix_commit [2015/05/20 13:52]
denis создано
dev:qt:qt_ibase_fix_commit [2015/05/20 14:41] (текущий)
denis [the solution]
Строка 16: Строка 16:
 end end
 </​code>​ </​code>​
 +  - qt code:<​code cpp>
 +  QSqlDatabase db = ...
 +  QString sql = "drop sequence myseq";​
 +  ​
 +  db.transaction();​
 +  QSqlQuery q(sql, db);
 +  qDebug() << q.lastError().text();​ // no error!
 +  q.close();
 +  db.commit();​
 +  qDebug() << q.lastError().text();​ // error: unsuccessful metadata update...
 +  ​
 +  // trying to drop once more time
 +  db.transaction();​
 +  QSqlQuery q(sql, db); // blocked forever...
 +</​code>​
 +
 +==== the solution ====
 +Edit file ''​.../​qtbase/​src/​sql/​drivers/​ibase/​qsql_ibase.cpp'':​
 +<code cpp>
 +bool QIBaseDriver::​commitTransaction()
 +{
 +    Q_D(QIBaseDriver);​
 +    if (!isOpen() || isOpenError())
 +        return false;
 +    if (!d->​trans)
 +        return false;
 +
 +    isc_commit_transaction(d->​status,​ &​d->​trans);​
 +//    d->trans = 0;
 +//    return !d->​isError(QT_TRANSLATE_NOOP("​QIBaseDriver",​ "​Unable to commit transaction"​),​
 +//                       ​QSqlError::​TransactionError);​
 +
 +    bool res = !d->​isError(QT_TRANSLATE_NOOP("​QIBaseDriver",​ "​Unable to commit transaction"​),​
 +                       ​QSqlError::​TransactionError);​
 +    if( !res )
 +        isc_rollback_transaction(d->​status,​ &​d->​trans);​
 +
 +    d->trans = 0;
 +
 +    return res;
 +}
 +</​code>​
 +
 +==== ps ====
 +Prefer explicit transation **start** and **commit** as shown above because it is not possible to avoid this problem executing queries with implicit transaction control.
 +
dev/qt/qt_ibase_fix_commit.1432119149.txt.gz · Последние изменения: 2015/05/20 13:52 — denis
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0