File: database_model.h

package info (click to toggle)
xca 2.9.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 8,328 kB
  • sloc: cpp: 30,584; sh: 341; xml: 74; makefile: 56; python: 34
file content (163 lines) | stat: -rw-r--r-- 3,390 bytes parent folder | download | duplicates (2)
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 &params,
						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