Timesheets-Server
Timesheets server
Načítám...
Vyhledávám...
Nebylo nic nalezeno
msqlquery.cpp
1#include "msqlquery.h"
2#include "pdebug.h"
3#include "backtrace.h"
4#include <QSqlError>
5
6using namespace Db;
7
8
9MSqlQuery::~MSqlQuery() {
10 if (!m_inTransaction) {
11 return;
12 }
13 Q_ASSERT(m_commit == true || m_rollback == true);
14}
15
16
17MSqlQuery::MSqlQuery() : QSqlQuery() {
18 m_inTransaction = false;
19 m_rollback = false;
20 m_success = true;
21 m_commit = false;
22 setForwardOnly(true);
23}
24
25
26MSqlQuery::MSqlQuery(QSqlDatabase db) : QSqlQuery(db) {
27 m_inTransaction = false;
28 m_rollback = false;
29 m_success = true;
30 m_commit = false;
31 setForwardOnly(true);
32}
33
34
35void MSqlQuery::jeChyba() {
36 m_success = false;
37 QSqlError e = QSqlQuery::lastError();
38 if (e.type() == QSqlError::NoError) {
39 return;
40 }
41 QString text = lastBoundQuery();
42 QString a = QString("%1\n%2\n%3\n")
43 .arg(e.databaseText())
44 .arg(e.driverText())
45 .arg(text)
46 ;
47 // PDEBUG << a << "\n" << stacktrace(16);
48 PDEBUG << a;
49 if (m_inTransaction) { rollback(); }
50}
51
52
53QString MSqlQuery::lastBoundQuery() const {
54 QString text = lastQuery();
55 QMap<QString, QVariant> bvals = boundValues();
56 QMapIterator<QString, QVariant> iterator(bvals);
57 while (iterator.hasNext()) {
58 iterator.next();
59 QString key = iterator.key();
60 QVariant val = bvals[key];
61 switch ((QMetaType::Type)(val.type())) {
62 case QMetaType::Int:
63 case QMetaType::UInt:
64 case QMetaType::Double:
65 case QMetaType::Float:
66 case QMetaType::Long:
67 case QMetaType::LongLong:
68 case QMetaType::Short:
69 case QMetaType::UShort:
70 text.replace(key, QString("%1").arg(val.toString()));
71 break;
72 default:
73 text.replace(key, QString("'%1'").arg(val.toString()));
74 break;
75 };
76 }
77 return text;
78}
79
80
81bool MSqlQuery::exec (const QString& q) {
82 Q_ASSERT(m_commit == false);
83 Q_ASSERT(m_rollback == false);
84 if (m_inTransaction && !m_success) { return false; }
85 if (!QSqlQuery::exec(q)) {
86 jeChyba();
87 return false;
88 }
89 return true;
90}
91
92
93bool MSqlQuery::exec () {
94 // Q_ASSERT(m_commit == false);
95 // Q_ASSERT(m_rollback == false);
96 if (m_inTransaction && !m_success) { return false; }
97 if (!QSqlQuery::exec()) {
98 jeChyba();
99 return false;
100 }
101 return true;
102}
103
104void MSqlQuery::begin() {
105 QSqlQuery::exec("begin;");
106 m_commit = false;
107 m_rollback = false;
108 m_inTransaction = true;
109}
110
111
112void MSqlQuery::rollback() {
113 Q_ASSERT(m_commit == false);
114 Q_ASSERT(m_inTransaction == true);
115 if (m_rollback) {
116 return;
117 }
118 m_success = false;
119 m_rollback = true;
120 QSqlQuery::exec("rollback;");
121}
122
123
124bool MSqlQuery::commit() {
125 // Q_ASSERT(m_rollback == false);
126 Q_ASSERT(m_inTransaction == true);
127 if (m_rollback) { return m_success; }
128 if (m_success) {
129 m_commit = true;
130 QSqlQuery::exec("commit;");
131 return m_success;
132 }
133 if (!m_success) {
134 m_rollback = true;
135 QSqlQuery::exec("rollback;");
136 return m_success;
137 }
138 return m_success;
139}
140