Repository navigation
Expand file tree
/
Copy pathdb.cpp
More file actions
160 lines (127 loc) · 3.63 KB
/
Copy pathdb.cpp
File metadata and controls
160 lines (127 loc) · 3.63 KB
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
#include <db.h>
DBDestroyer::DBDestroyer(DB *p_instance) { this->p_instance = p_instance; }
DBDestroyer::~DBDestroyer() { delete p_instance; }
void DB::open() {
if (db.isOpen()) {
return;
}
qDebug() << "Opening database\n";
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("Test.db");
if (!db.open()) {
qDebug() << "Error opening database: " << db.lastError().text();
}
}
DB &DB::getInstance() {
static DB instance;
return instance;
}
void DB::init() {
getInstance();
open();
createTables();
}
void DB::close() {
if (db.isOpen()) {
db.close();
}
}
bool DB::insertData(const QString &queryString) {
open();
QSqlQuery query(db);
query.exec("PRAGMA foreign_keys = ON");
if (!query.exec(queryString)) {
qDebug() << "Error executing query:" << query.lastError().text();
return false;
}
return true;
}
QMap<QString, QVariant> DB::getData(const QString &request) {
QMap<QString, QVariant> resultMap;
open();
QSqlQuery query(db);
if (!query.exec(request)) {
qDebug() << "Error executing query:" << query.lastError().text();
return resultMap;
}
while (query.next()) {
QSqlRecord record = query.record();
for (int i = 0; i < record.count(); i++) {
resultMap[record.fieldName(i)] = query.value(i);
}
}
db.close();
return resultMap;
}
QSqlQuery DB::getQsqlData(const QString &request) {
open();
QSqlQuery query(db);
if (!query.exec(request)) {
qDebug() << "Error executing query:" << query.lastError().text();
}
return query;
}
bool DB::makeInsertQuery(const QMap<QString, QMap<QString, QVariant>> &data) {
QString table = data.firstKey();
QMap<QString, QVariant> columnData = data.value(table);
QString query = QString("INSERT INTO %1 (").arg(table);
QStringList columns;
QList<QString> values;
for (auto it = columnData.constBegin(); it != columnData.constEnd(); ++it) {
if (it.key() != "command") {
columns.append(it.key());
values.append(it.value().toString());
}
}
query += columns.join(", ");
query += QString(") VALUES ('%1')").arg(values.join("', '"));
if (insertData(query)) {
qDebug() << "Query executed successfully";
return true;
} else {
qDebug() << "Error executing query";
return false;
}
}
int DB::getLastInsertId() {
QSqlQuery query;
query.exec("SELECT last_insert_rowid();");
if (query.next()) {
return query.value(0).toInt();
}
return -1; // Возвращаем -1 в случае ошибки или отсутствия вставки
}
void DB::createTables() {
QSqlQuery query(db);
query.exec("PRAGMA foreign_keys = ON");
insertData("CREATE TABLE IF NOT EXISTS user ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"login TEXT UNIQUE,"
"password TEXT,"
"role_id INTEGER"
");");
;
insertData("CREATE TABLE IF NOT EXISTS grade ("
"student_id INTEGER,"
"exercise INTEGER,"
"grade INTEGER"
");");
insertData("CREATE TABLE IF NOT EXISTS student ("
"user_id INTEGER,"
"firstname TEXT,"
"surname TEXT,"
"lastname TEXT,"
"studygroup TEXT,"
"FOREIGN KEY(user_id) REFERENCES user(id)"
");");
// Администратор
insertData("INSERT INTO user (login, password, role_id) VALUES "
"('admin', 'admin', 0);");
}
void DB::dropTables() {
insertData("DROP TABLE IF EXISTS grade;");
insertData("DROP TABLE IF EXISTS user;");
insertData("DROP TABLE IF EXISTS role;");
insertData("DROP TABLE IF EXISTS student;");
}
QSqlDatabase DB::db;