if (_errId != SQLITE_DONE && _errId != SQLITE_ROW) {
_error = QString::fromUtf8(sqlite3_errmsg(_db));
qCWarning(lcSql) << "Sqlite exec statement error:" << _errId << _error << "in" << _sql;
+ if (_errId == SQLITE_IOERR) {
+ qCWarning(lcSql) << "IOERR extended errcode: " << sqlite3_extended_errcode(_db);
+#if SQLITE_VERSION_NUMBER >= 3012000
+ qCWarning(lcSql) << "IOERR system errno: " << sqlite3_system_errno(_db);
+#endif
+ }
} else {
qCDebug(lcSql) << "Last exec affected" << numRowsAffected() << "rows.";
}
");");
if (!createQuery.exec()) {
- return sqlFail("Create table metadata", createQuery);
+ bool fail = true;
+
+ // In certain situations the io error can be avoided by switching
+ // to the DELETE journal mode, see #5723
+ if (createQuery.errorId() == SQLITE_IOERR) {
+ qCWarning(lcDb) << "IO error on table creation, attempting with DELETE journal mode";
+
+ pragma1.prepare(QString("PRAGMA journal_mode=DELETE;"));
+ if (!pragma1.exec()) {
+ return sqlFail("Set PRAGMA journal_mode", pragma1);
+ }
+ pragma1.next();
+ qCInfo(lcDb) << "sqlite3 journal_mode=" << pragma1.stringValue(0);
+
+ if (createQuery.exec()) {
+ fail = false;
+ }
+ }
+ if (fail)
+ return sqlFail("Create table metadata", createQuery);
}
createQuery.prepare("CREATE TABLE IF NOT EXISTS downloadinfo("