xca/lib/db_base.h
Christian Hohnstaedt d36e6eb0cb Implement nested transactions.
The DbTransaction class automatically rolls back when the scope
is left (destructor) and no commit happenned.

Every transaction begin will increment the counter,
each commit/rollback will decrement it. Only if all transactions
finished with a commit, a final database commit will be performed.
2018-03-05 07:46:10 +01:00

181 lines
4.9 KiB
C++

/* vi: set sw=4 ts=4:
*
* Copyright (C) 2001 - 2010 Christian Hohnstaedt.
*
* All rights reserved.
*/
#ifndef __DB_BASE_H
#define __DB_BASE_H
#include <typeinfo>
#include "db.h"
#include "base.h"
#include "load_obj.h"
#include <QListView>
#include <QPixmap>
#include <QContextMenuEvent>
#include <QStringList>
#include <QAbstractItemModel>
#include <QHash>
#include "widgets/ExportDialog.h"
#include "pki_base.h"
#include "headerlist.h"
#define FOR_ALL_pki(pki, pki_type) \
for(pki_type *pki=(pki_type*)rootItem->iterate(); pki; pki=(pki_type*)pki->iterate())
#define X_XCA_DRAG_DATA "application/x-xca-drag-data"
class MainWindow;
class QContextMenuEvent;
class XcaTreeView;
class NewX509;
class db_base: public QAbstractItemModel
{
Q_OBJECT
protected:
static QHash<quint64, pki_base*> lookup;
QModelIndex currentIdx;
void _writePKI(pki_base *pki, bool overwrite);
void _removePKI(pki_base *pki );
void removeItem(QString k);
QList<enum pki_type> pkitype;
MainWindow *mainwin;
QString class_name;
/* Sql table containing the 'hash' of this items */
QString sqlHashTable;
dbheaderList allHeaders;
virtual dbheaderList getHeaders();
int colResizing;
QString sqlItemSelector();
void updateItem(pki_base *pki, QString name, QString comment);
virtual exportType::etype clipboardFormat(QModelIndexList) const
{
return exportType::Separator;
}
bool isValidCol(int col) const;
static XSqlQuery sqlSELECTpki(QString query,
QList<QVariant> values = QList<QVariant>());
public:
template <class T> static T *lookupPki(quint64 i)
{
T *pki = dynamic_cast<T*>(lookup[i]);
if (!pki && i > 0) {
pki_base *p = lookup[i];
QString f = QString("Invalid Type of ItemId(%1) %2 %3."
" Expected to be %4.")
.arg(i).arg(typeid(p).name())
.arg(p?p->getIntName() : "<NULL item>")
.arg(typeid(T*).name());
qCritical(CCHAR(f));
}
return pki;
}
template <class T> static T *lookupPki(QVariant v)
{
return lookupPki<T>(v.toULongLong());
}
static void flushLookup()
{
lookup.clear();
}
template <class T> static QList<T *>
sqlSELECTpki(QString query,
QList<QVariant> values = QList<QVariant>())
{
XSqlQuery q = sqlSELECTpki(query, values);
QList<T *> x;
while (q.next()) {
T *pki = lookupPki<T>(q.value(0));
if (pki)
x << pki;
}
return x;
}
virtual pki_base *newPKI(enum pki_type type = none);
pki_base *rootItem;
db_base(MainWindow *mw);
virtual void updateHeaders();
virtual ~db_base();
virtual void insertPKI(pki_base *pki);
pki_base *getByName(QString desc);
pki_base *getByReference(pki_base *refpki);
pki_base *getByPtr(void *);
virtual void loadContainer();
template <class T> QList<T *> getAll()
{
return sqlSELECTpki<T>(
QString("SELECT item FROM %1")
.arg(sqlHashTable));
}
virtual pki_base* insert(pki_base *item);
virtual void inToCont(pki_base *pki);
virtual void remFromCont(QModelIndex &idx);
QPixmap *loadImg(const char *name);
void writeAll(void);
void dump(QString dirname);
QModelIndex index(int row, int column, const QModelIndex &parent)const;
QModelIndex index(pki_base *pki)const;
QModelIndex parent(const QModelIndex &index) const;
int rowCount(const QModelIndex &parent) const;
int columnCount(const QModelIndex &parent) const;
QVariant data(const QModelIndex &index, int role) const;
QVariant headerData(int section, Qt::Orientation orientation,
int role) const;
Qt::ItemFlags flags(const QModelIndex &index) const;
bool setData(const QModelIndex &index, const QVariant &value, int role);
void deleteSelectedItems(QModelIndexList indexes);
void load_default(load_base &load);
void insertChild(pki_base *parent, pki_base *child);
void createSuccess(pki_base *pki);
bool columnHidden(int col) const;
bool isNumericCol(int col) const;
virtual void saveHeaderState();
void initHeaderView(QHeaderView *hv);
void setVisualIndex(int i, int visualIndex);
bool fixedHeaderSize(int sect);
void colResizeStart()
{
colResizing++;
}
void colResizeEnd()
{
colResizing--;
}
virtual void store(QModelIndexList indexes);
virtual void store(QModelIndex index) { (void)index; };
dbheaderList getAllHeaders() {
return allHeaders;
}
void pem2clipboard(QModelIndexList indexes) const;
QString pem2QString(QModelIndexList indexes) const;
void deletePKI(QModelIndex idx);
QMimeData *mimeData(const QModelIndexList &indexes) const;
void editComment(const QModelIndex &index);
public slots:
virtual void newItem() { }
virtual void load() { }
void columnResetDefaults();
virtual void showPki(pki_base *) {};
virtual void showItem(const QModelIndex &index);
virtual void showItem(const QString keyname);
void sectionResized(int i, int, int newSize);
void sortIndicatorChanged(int, Qt::SortOrder);
signals:
void connNewX509(NewX509 *dlg);
void resetHeader();
void updateHeader();
void columnsContentChanged();
};
#endif