From 703d9c0ba7c99bc78e3f5b2f1ce79a6aad3c64e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Hohnst=C3=A4dt?= Date: Wed, 5 May 2021 19:36:39 +0200 Subject: [PATCH] sql: better handle SQL errors during insert Don't pop-up a success message, but delete the item, if an SQL error occures during insert. --- lib/database_model.cpp | 2 +- lib/db_base.cpp | 15 +++++++++------ lib/db_base.h | 2 +- lib/db_crl.cpp | 14 ++++++++------ lib/db_key.cpp | 4 +--- lib/db_x509.cpp | 7 +++---- lib/db_x509req.cpp | 3 +-- widgets/TempTreeView.cpp | 3 ++- 8 files changed, 26 insertions(+), 24 deletions(-) diff --git a/lib/database_model.cpp b/lib/database_model.cpp index ce9217fc..2f990544 100644 --- a/lib/database_model.cpp +++ b/lib/database_model.cpp @@ -205,7 +205,7 @@ void database_model::importOldDatabase(const QString &dbname) if (r && r->issuedCerts() > 0) r->setDone(); qDebug() << "load old:" << pki->getIntName(); - db->insertPKI(pki); + pki = db->insertPKI(pki); } next: if (mydb.next()) diff --git a/lib/db_base.cpp b/lib/db_base.cpp index 0264024b..89f72d39 100644 --- a/lib/db_base.cpp +++ b/lib/db_base.cpp @@ -234,7 +234,7 @@ void db_base::sortIndicatorChanged(int logicalIndex, Qt::SortOrder order) allHeaders[logicalIndex]->sortIndicator = order; } -void db_base::insertPKI(pki_base *pki) +pki_base *db_base::insertPKI(pki_base *pki) { QString filename = pki->getFilename(); if (!filename.isEmpty()) { @@ -242,19 +242,23 @@ void db_base::insertPKI(pki_base *pki) pki->setFilename(QString()); } Transaction; - if (!TransBegin()) - return; + if (!TransBegin()) { + delete pki; + return NULL; + } QSqlError e = pki->insertSql(); if (e.isValid()) { XCA_SQLERROR(e); TransRollback(); - return; + delete pki; + return NULL; } Store.add(pki->getSqlItemId(), pki); inToCont(pki); TransCommit(); restart_timer(); emit columnsContentChanged(); + return pki; } QString db_base::pem2QString(QModelIndexList indexes) const @@ -380,8 +384,7 @@ pki_base *db_base::getByReference(pki_base *refpki) pki_base *db_base::insert(pki_base *item) { - insertPKI(item); - return item; + return insertPKI(item); } void db_base::dump(const QString &dir) const diff --git a/lib/db_base.h b/lib/db_base.h index a598deba..ff7ae406 100644 --- a/lib/db_base.h +++ b/lib/db_base.h @@ -66,7 +66,7 @@ class db_base: public QAbstractItemModel db_base(const char *classname); virtual void updateHeaders(); virtual ~db_base(); - virtual void insertPKI(pki_base *pki); + virtual pki_base *insertPKI(pki_base *pki); pki_base *getByName(QString desc); pki_base *getByReference(pki_base *refpki); virtual void loadContainer(); diff --git a/lib/db_crl.cpp b/lib/db_crl.cpp index e4b87474..50f23ae5 100644 --- a/lib/db_crl.cpp +++ b/lib/db_crl.cpp @@ -54,7 +54,7 @@ void db_crl::revokeCerts(pki_crl *crl) db_x509 *certs = Database.model(); x509revList revlist; - if (!certs) + if (!certs || !crl) return; pki_x509 *signer = crl->getIssuer(); @@ -108,9 +108,11 @@ pki_base *db_crl::insert(pki_base *item) } Transaction; if (TransBegin()) { - insertPKI(crl); - revokeCerts(crl); - TransCommit(); + crl = dynamic_cast(insertPKI(crl)); + if (crl) { + revokeCerts(crl); + TransCommit(); + } } return crl; } @@ -210,12 +212,12 @@ pki_crl *db_crl::newCrl(const crljob &task) err = q.lastError(); if (err.isValid()) throw errorEx(tr("Database error: %1").arg(err.text())); - insertPKI(crl); + crl = dynamic_cast(insertPKI(crl)); err = db.lastError(); if (err.isValid()) throw errorEx(tr("Database error: %1").arg(err.text())); TransCommit(); - createSuccess((crl)); + createSuccess(crl); } catch (errorEx &err) { XCA_ERROR(err); diff --git a/lib/db_key.cpp b/lib/db_key.cpp index 51811551..6363079f 100644 --- a/lib/db_key.cpp +++ b/lib/db_key.cpp @@ -149,9 +149,7 @@ pki_base* db_key::insert(pki_base *item) deletePKI(index(oldkey)); } } - insertPKI(lkey); - - return lkey; + return insertPKI(lkey); } pki_key *db_key::newKey(const keyjob &task, const QString &name) diff --git a/lib/db_x509.cpp b/lib/db_x509.cpp index 5e83a14a..bde2c636 100644 --- a/lib/db_x509.cpp +++ b/lib/db_x509.cpp @@ -326,8 +326,7 @@ pki_base *db_x509::insert(pki_base *item) delete cert; return NULL; } - insertPKI(cert); - return cert; + return insertPKI(cert); } void db_x509::load(void) @@ -517,7 +516,7 @@ pki_x509 *db_x509::newCert(NewX509 *dlg) // set the comment field cert->setComment(dlg->comment->toPlainText()); cert->pkiSource = dlg->getPkiSource(); - cert = (pki_x509*)insert(cert); + cert = dynamic_cast(insert(cert)); createSuccess(cert); if (cert && clientkey->isToken()) { pki_scard *card = (pki_scard*)clientkey; @@ -887,7 +886,7 @@ void db_x509::certRenewal(QModelIndexList indexes) // and finally sign the cert newcert->sign(signkey, oldcert->getDigest()); - newcert = (pki_x509 *)insert(newcert); + newcert = dynamic_cast(insert(newcert)); createSuccess(newcert); } if (doRevoke) diff --git a/lib/db_x509req.cpp b/lib/db_x509req.cpp index 8c6e69a2..4dd192b3 100644 --- a/lib/db_x509req.cpp +++ b/lib/db_x509req.cpp @@ -53,8 +53,7 @@ pki_base *db_x509req::insert(pki_base *item) delete req; return NULL; } - insertPKI(req); - return req; + return insertPKI(req); } void db_x509req::newItem() diff --git a/widgets/TempTreeView.cpp b/widgets/TempTreeView.cpp index cc851d49..25996448 100644 --- a/widgets/TempTreeView.cpp +++ b/widgets/TempTreeView.cpp @@ -85,7 +85,8 @@ void TempTreeView::newItem() if (temp) { temp->pkiSource = generated; if (runTempDlg(temp)) { - temps()->insertPKI(temp); + temp = dynamic_cast( + temps()->insertPKI(temp)); temps()->createSuccess(temp); } else { delete temp;