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.
This commit is contained in:
Christian Hohnstädt 2021-05-05 19:36:39 +02:00
parent 5fbd35ab68
commit 703d9c0ba7
8 changed files with 26 additions and 24 deletions

View File

@ -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())

View File

@ -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

View File

@ -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();

View File

@ -54,7 +54,7 @@ void db_crl::revokeCerts(pki_crl *crl)
db_x509 *certs = Database.model<db_x509>();
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<pki_crl *>(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<pki_crl *>(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);

View File

@ -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)

View File

@ -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<pki_x509*>(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<pki_x509 *>(insert(newcert));
createSuccess(newcert);
}
if (doRevoke)

View File

@ -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()

View File

@ -85,7 +85,8 @@ void TempTreeView::newItem()
if (temp) {
temp->pkiSource = generated;
if (runTempDlg(temp)) {
temps()->insertPKI(temp);
temp = dynamic_cast<pki_temp *>(
temps()->insertPKI(temp));
temps()->createSuccess(temp);
} else {
delete temp;