1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
|
/* vi: set sw=4 ts=4:
*
* Copyright (C) 2020 Christian Hohnstaedt.
*
* All rights reserved.
*/
#ifndef __DATABASE_MODEL_H
#define __DATABASE_MODEL_H
#include <QList>
#include <QObject>
#include <QDebug>
#include <QStringList>
#include <QSqlDatabase>
#include "sql.h"
#include "db_base.h"
#include "lib/Passwd.h"
typedef QMap<QString, QString> DbMap;
class database_model: public QObject
{
Q_OBJECT
private:
QList<db_base*> models{};
int dbTimer{};
QString dbName{};
QString db_provider{};
void openSqlDB();
QSqlError initSqlDB();
const QString &detect_provider();
bool checkForOldDbFormat(const QString &dbfile) const;
enum open_result verifyOldDbPass(const QString &dbname) const;
void importOldDatabase(const QString &dbfile);
QString get_default_db() const;
QString checkPre2Xdatabase() const;
enum open_result initPass(const QString &dbName,
const QString &passhash) const;
void restart_timer();
static void openDatabase(const QString &descriptor,
const Passwd &pass);
static void openRemoteDatabase(const QString &connName,
const DbMap ¶ms,
const Passwd &pass);
static void openLocalDatabase(const QString &connName,
const QString &descriptor);
private slots:
void pkiChangedSlot(pki_base *pki);
public:
static bool open_without_password;
database_model(const QString &dbName,
const Passwd &pass = Passwd());
~database_model();
void timerEvent(QTimerEvent *event);
db_base *modelForPki(const pki_base *pki) const;
QString dbname() const
{
return dbName;
}
void dump_database(const QString &dirname) const;
QList<db_base*> getModels() const
{
return models;
}
template <class T> T *model() const
{
foreach(db_base *model, models) {
T *m = dynamic_cast<T*>(model);
if (m)
return m;
}
return nullptr;
}
pki_base *insert(pki_base *pki);
static DbMap splitRemoteDbName(const QString &db);
static bool isRemoteDB(const QString &db);
static void as_default_database(const QString &db);
signals:
void pkiChanged(pki_base *pki) const;
};
class xca_db
{
private:
database_model *db{};
public:
xca_db() { }
~xca_db()
{
close();
}
void open(const QString &dbName, const Passwd &pass = Passwd())
{
close();
db = new database_model(dbName, pass);
qDebug() << "Opening database:" << name();
}
void open_default()
{
open(QString());
}
void close()
{
if (db) {
qDebug() << "Closing database:" << name();
delete db;
db = NULL;
}
}
QString name() const
{
return db ? db->dbname() : QString();
}
bool isOpen()
{
return db != NULL;
}
template <class T> T *model() const
{
return db ? db->model<T>() : NULL;
}
void dump(const QString &dirname) const
{
if (db)
db->dump_database(dirname);
}
void as_default() const
{
database_model::as_default_database(name());
}
QList<db_base*> getModels() const
{
return db ? db->getModels() : QList<db_base*>();
}
pki_base *insert(pki_base *pki)
{
return db ? db->insert(pki) : NULL;
}
db_base *modelForPki(const pki_base *pki) const
{
return db ? db->modelForPki(pki) : NULL;
}
void connectToDbChangeEvt(QObject *o, const char *slot)
{
if (db)
QObject::connect(
db, SIGNAL(pkiChanged(pki_base*)),
o, slot);
}
};
extern xca_db Database;
#endif
|