-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathdatabasetest.cc
95 lines (78 loc) · 2.9 KB
/
databasetest.cc
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
#include "databasetest.hpp"
#include "databaseutils.hpp"
#include <QDir>
#include <QMutex>
#include <QSqlDriver>
#include <QSqlError>
#include <QSqlQuery>
#include <QThread>
class DataBaseTest::DataBaseTestPrivate
{
public:
explicit DataBaseTestPrivate(DataBaseTest *q)
: q_ptr(q)
{
dataBaseConnection.dataBasePath = QString("%1/%2").arg(QDir::tempPath()).arg("test.db");
dataBaseConnection.connectionName = getDatabaseConnectionName();
createTable();
qInfo() << "DataBaseTestPrivate connectionName: " << dataBaseConnection.connectionName
<< QThread::currentThread();
}
~DataBaseTestPrivate() { removeDatabase(dataBaseConnection.connectionName); }
bool createTable()
{
const auto createTable
= QString("CREATE TABLE [%1]("
" [id] INTEGER NOT NULL ON CONFLICT REPLACE UNIQUE ON CONFLICT "
"REPLACE COLLATE BINARY, "
" [brand] TEXT, "
" [num] TEXT, "
" [create_time] TIMESTAMP DEFAULT CURRENT_TIMESTAMP, "
" PRIMARY KEY([id] COLLATE [BINARY] ASC) ON CONFLICT REPLACE)")
.arg(tableName);
QMutexLocker locker(&mutex);
auto db = getDatabase(dataBaseConnection);
CHECK_DATABASE_VALIDITY(db)
auto *driver = db.driver();
qInfo() << "Support Transactions: " << driver->hasFeature(QSqlDriver::Transactions)
<< "Support LastInsertId: " << driver->hasFeature(QSqlDriver::LastInsertId)
<< "Support BatchOperations: " << driver->hasFeature(QSqlDriver::BatchOperations)
<< "Support SimpleLocking: " << driver->hasFeature(QSqlDriver::SimpleLocking);
if (db.tables().contains(tableName)) {
return true;
}
QSqlQuery query(db);
if (!query.exec(createTable)) {
qWarning() << query.lastError().text();
return false;
}
return true;
}
DataBaseTest *q_ptr;
DataBaseConnection dataBaseConnection;
const QString tableName = "phone";
static QMutex mutex;
};
QMutex DataBaseTest::DataBaseTestPrivate::mutex;
DataBaseTest::DataBaseTest(QObject *parent)
: QObject{parent}
, d_ptr(new DataBaseTestPrivate(this))
{}
DataBaseTest::~DataBaseTest() {}
bool DataBaseTest::insert(const QString &brand, int num)
{
QMutexLocker locker(&d_ptr->mutex);
auto db = getDatabase(d_ptr->dataBaseConnection);
CHECK_DATABASE_VALIDITY(db)
QSqlQuery query(db);
query.prepare(
QString("INSERT INTO %1 (brand, num) VALUES (:brand, :num)").arg(d_ptr->tableName));
query.bindValue(":brand", brand);
query.bindValue(":num", num);
if (!query.exec()) {
qCritical() << query.lastError().text();
return false;
}
qInfo() << "Last inserted id:" << query.lastInsertId().toInt();
return true;
}