From d079dbde0918a745e2185e87c4f6e3f5a2f7d2fc Mon Sep 17 00:00:00 2001 From: Christian Hohnstaedt Date: Sun, 26 Nov 2017 13:33:16 +0100 Subject: [PATCH] Collect affected items --- lib/db_base.cpp | 1 + lib/db_base.h | 2 +- lib/db_crl.cpp | 1 + lib/db_key.cpp | 1 + lib/db_x509.cpp | 5 +++++ lib/pki_evp.cpp | 1 + lib/pki_key.cpp | 2 ++ lib/pki_x509.cpp | 10 ++++++++++ lib/sql.cpp | 24 +++++++++++++++++++----- lib/sql.h | 8 ++++++++ widgets/MW_database.cpp | 3 ++- 11 files changed, 51 insertions(+), 7 deletions(-) diff --git a/lib/db_base.cpp b/lib/db_base.cpp index bce72298..46fe8eea 100644 --- a/lib/db_base.cpp +++ b/lib/db_base.cpp @@ -518,6 +518,7 @@ void db_base::updateItem(pki_base *pki, QString name, QString comment) q.bindValue(2, pki->getSqlItemId()); q.exec(); e = q.lastError(); + AffectedItems(pki->getSqlItemId()); mainwin->dbSqlError(e); if (e.isValid()) return; diff --git a/lib/db_base.h b/lib/db_base.h index 9dd34742..b9f942c4 100644 --- a/lib/db_base.h +++ b/lib/db_base.h @@ -71,7 +71,7 @@ class db_base: public QAbstractItemModel .arg(i).arg(typeid(p).name()) .arg(p?p->getIntName() : "") .arg(typeid(T*).name()); - qCritical(CCHAR(f)); + qCritical("%s", CCHAR(f)); } return pki; } diff --git a/lib/db_crl.cpp b/lib/db_crl.cpp index 30784e5b..d7f29e0c 100644 --- a/lib/db_crl.cpp +++ b/lib/db_crl.cpp @@ -292,6 +292,7 @@ void db_crl::newItem(pki_x509 *cert) q.bindValue(0, (uint)cert->getCrlNumber().getLong()); q.bindValue(1, widget->nextUpdate->getDate().toPlain()); q.bindValue(2, cert->getSqlItemId()); + AffectedItems(cert->getSqlItemId()); q.exec(); QSqlError err = q.lastError(); if (err.isValid()) diff --git a/lib/db_key.cpp b/lib/db_key.cpp index 545e1b5f..f4cb9a7b 100644 --- a/lib/db_key.cpp +++ b/lib/db_key.cpp @@ -104,6 +104,7 @@ void db_key::inToCont(pki_base *pki) /* Found item matching this key */ x509s->setRefKey(key); q.bindValue(1, x509s->getSqlItemId()); + AffectedItems(x509s->getSqlItemId()); q.exec(); mainwin->dbSqlError(q.lastError()); } diff --git a/lib/db_x509.cpp b/lib/db_x509.cpp index bd393cfe..51f5b972 100644 --- a/lib/db_x509.cpp +++ b/lib/db_x509.cpp @@ -117,6 +117,7 @@ void db_x509::remFromCont(QModelIndex &idx) foreach(pki_x509 *child, childs) { q.bindValue(0, child->getSigner()->getSqlItemId()); q.bindValue(1, child->getSqlItemId()); + AffectedItems(child->getSqlItemId()); q.exec(); } mainwin->crls->removeSigner(pki); @@ -242,6 +243,7 @@ void db_x509::inToCont(pki_base *pki) insertChild(cert, child); } q.bindValue(1, child->getSqlItemId()); + AffectedItems(child->getSqlItemId()); q.exec(); mainwin->dbSqlError(q.lastError()); if (child->isRevoked()) @@ -262,6 +264,7 @@ void db_x509::inToCont(pki_base *pki) continue; q.bindValue(0, cert->getSqlItemId()); q.bindValue(1, crl->getSqlItemId()); + AffectedItems(crl->getSqlItemId()); q.exec(); mainwin->dbSqlError(q.lastError()); } @@ -396,6 +399,7 @@ void db_x509::markRequestSigned(pki_x509req *req, pki_x509 *cert) SQL_PREPARE(q, "UPDATE requests SET signed=? WHERE item=?"); q.bindValue(0, req->getDone()); q.bindValue(1, req->getSqlItemId()); + AffectedItems(req->getSqlItemId()); q.exec(); a1time a; @@ -1142,6 +1146,7 @@ void db_x509::caProperties(QModelIndex idx) q.bindValue(1, policy); q.bindValue(2, tmplId); q.bindValue(3, cert->getSqlItemId()); + AffectedItems(cert->getSqlItemId()); q.exec(); TransDone(q.lastError()); mainwin->dbSqlError(q.lastError()); diff --git a/lib/pki_evp.cpp b/lib/pki_evp.cpp index 6a28eb8f..eecef8bd 100644 --- a/lib/pki_evp.cpp +++ b/lib/pki_evp.cpp @@ -75,6 +75,7 @@ bool pki_evp::sqlUpdatePrivateKey() q.bindValue(0, encKey_b64()); q.bindValue(1, ownPass); q.bindValue(2, sqlItemId); + AffectedItems(sqlItemId); q.exec(); encKey.fill(0); diff --git a/lib/pki_key.cpp b/lib/pki_key.cpp index e4aa7707..712abf2d 100644 --- a/lib/pki_key.cpp +++ b/lib/pki_key.cpp @@ -480,6 +480,7 @@ QSqlError pki_key::insertSqlData() foreach(pki_x509super* x, list) { q.bindValue(1, x->getSqlItemId()); q.exec(); + AffectedItems(x->getSqlItemId()); if (q.lastError().isValid()) return q.lastError(); } @@ -518,6 +519,7 @@ QSqlError pki_key::deleteSqlData() return e; SQL_PREPARE(q, "UPDATE x509super SET pkey=NULL WHERE pkey=?"); q.bindValue(0, sqlItemId); + AffectedItems(sqlItemId); q.exec(); return q.lastError(); } diff --git a/lib/pki_x509.cpp b/lib/pki_x509.cpp index f4c9a709..81f0e1e5 100644 --- a/lib/pki_x509.cpp +++ b/lib/pki_x509.cpp @@ -166,6 +166,16 @@ QSqlError pki_x509::deleteSqlData() SQL_PREPARE(q, "DELETE FROM revocations WHERE caId=?"); q.bindValue(0, sqlItemId); q.exec(); + // Select affected items + QList list = db_base::sqlSELECTpki( + "SELECT DISTINCT items.id FROM items, certs, crls " + "WHERE (items.id = certs.item OR items.id = crls.item) " + "AND crls.issuer = ? AND certs.issuer = ?", + QList() << QVariant(sqlItemId)); + + foreach(pki_base *pki, list) + AffectedItems(pki->getSqlItemId()); + return q.lastError(); } diff --git a/lib/sql.cpp b/lib/sql.cpp index 37fd9d70..c228ac6d 100644 --- a/lib/sql.cpp +++ b/lib/sql.cpp @@ -12,10 +12,12 @@ int DbTransaction::mutex; int DbTransaction::error; +QList DbTransaction::items; + +quint64 DatabaseStamp; void DbTransaction::debug(const char *func, const char *file, int line) { - QString f = file; qDebug() << QString("%1(%2) Transaction: %3 Level %4, E:%5 ") .arg(file + QString(file).lastIndexOf("/") +1) .arg(line).arg(func).arg(mutex).arg(error); @@ -56,14 +58,26 @@ bool DbTransaction::finish(const char *oper, const char *file, int line) QSqlDatabase db = QSqlDatabase::database(); if (error) { error = 0; + items.clear(); return db.rollback(); } + mutex++; XSqlQuery q; - if (db.driverName() == "QPSQL7") - SQL_PREPARE(q, "UPDATE settings SET value = CAST (value AS INTEGER) +1 WHERE key_ = 'counter'"); - else - SQL_PREPARE(q, "UPDATE settings SET value = value +1 WHERE key_ = 'counter'"); + SQL_PREPARE(q, "SELECT MAX(stamp) +1 from items"); q.exec(); + if (q.first()) + DatabaseStamp = q.value(0).toULongLong(); + + SQL_PREPARE(q, "UPDATE items SET stamp=? WHERE stamp=0"); + q.bindValue(0, DatabaseStamp); + q.exec(); + SQL_PREPARE(q, "UPDATE items SET stamp=? WHERE item=?"); + q.bindValue(0, DatabaseStamp); + foreach(quint64 id, DbTransaction::items) { + q.bindValue(1, id); + q.exec(); + } + mutex--; return db.commit(); } diff --git a/lib/sql.h b/lib/sql.h index 15c1246b..19dfaa93 100644 --- a/lib/sql.h +++ b/lib/sql.h @@ -9,6 +9,7 @@ #define __SQL_H #include +#include #define SQL_PREPARE(q,cmd) do { \ (q).prepare(cmd); \ @@ -20,6 +21,7 @@ class DbTransaction private: static int mutex; static int error; + static QList items; bool has_begun; void debug(const char *func, const char *file, int line); bool finish(const char *oper, const char *file, int line); @@ -35,6 +37,10 @@ class DbTransaction { return mutex > 0; } + static void addItems(QVariant v) + { + items << v.toULongLong(); + } }; #define Transaction DbTransaction __trans @@ -44,6 +50,8 @@ class DbTransaction #define TransCommit() __trans.commit(__FILE__, __LINE__) #define TransRollback() __trans.rollback(__FILE__, __LINE__) #define TransDone(e) __trans.done(e, __FILE__, __LINE__); +#define AffectedItems(v) (DbTransaction::addItems(v)) + class XSqlQuery: public QSqlQuery { diff --git a/widgets/MW_database.cpp b/widgets/MW_database.cpp index acefff12..6d15f058 100644 --- a/widgets/MW_database.cpp +++ b/widgets/MW_database.cpp @@ -317,7 +317,8 @@ QSqlError MainWindow::initSqlDB() ; schemas[4] -<< "INSERT INTO settings (key_, value) VALUES ('counter', '1')" +<< "ALTER TABLE items ADD stamp INTEGER NOT NULL DEFAULT (0)" +<< "CREATE INDEX i_items_stamp ON items (stamp)" << "UPDATE settings SET value='5' WHERE key_='schema'" ;