Это старая версия документа.


A PCRE internal error occured. This might be caused by a faulty plugin

====== fix commit problem in qsql_ibase.cpp ====== ==== the problem ==== Transaction with unsuccessful commit can never be rollbacked. This migth cause some metaobjects get locked and as result hanging of any client (including itself) which tries to use that metaobjects. Example: - given the following:<code sql> CREATE SEQUENCE myseq; CREATE TABLE mytbl (id integer); CREATE OR ALTER trigger mytrig_bi0 for mytbl active before insert position 0 AS begin new.id = next value for myseq; end </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>

dev/qt/qt_ibase_fix_commit.1432121274.txt.gz · Последние изменения: 2015/05/20 14:27 — denis
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0