Skip to content

Commit e99d223

Browse files
committed
Database: add mysql
1 parent ad85de8 commit e99d223

File tree

8 files changed

+314
-26
lines changed

8 files changed

+314
-26
lines changed

App/Client/Favorite/FavoriteDatabase.cpp

Lines changed: 79 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ CFavoriteDatabase::CFavoriteDatabase(QObject *parent)
1818
qDebug(log) << Q_FUNC_INFO;
1919
}
2020

21-
bool CFavoriteDatabase::OnInitializeDatabase()
21+
bool CFavoriteDatabase::OnInitializeSqliteDatabase()
2222
{
2323
QSqlQuery query(GetDatabase());
2424

@@ -69,10 +69,85 @@ bool CFavoriteDatabase::OnInitializeDatabase()
6969
if (!success) {
7070
qWarning(log) << "Failed to create trigger delete_icon_after_favorite." << query.lastError().text();
7171
}
72+
success = CDatabaseTree::OnInitializeSqliteDatabase();
73+
return success;
74+
}
7275

73-
m_IconDB.SetDatabase(GetDatabase());
74-
m_IconDB.OnInitializeDatabase();
75-
return CDatabaseTree::OnInitializeDatabase();
76+
bool CFavoriteDatabase::OnInitializeMySqlDatabase()
77+
{
78+
QSqlQuery query(GetDatabase());
79+
80+
// Create favorite table
81+
bool success = query.exec(
82+
"CREATE TABLE IF NOT EXISTS favorite ("
83+
" id INTEGER PRIMARY KEY AUTOINCREMENT," // the id is the key of tree table
84+
" name TEXT NOT NULL,"
85+
" icon INTEGER DEFAULT 0,"
86+
" file TEXT NOT NULL,"
87+
" description TEXT,"
88+
" UNIQUE KEY uk_favorite_file (file(255))"
89+
")"
90+
);
91+
92+
if (!success) {
93+
qCritical(log) << "Failed to create favorite table:" << query.lastError().text();
94+
return false;
95+
}
96+
97+
// Create index
98+
success = query.exec("CREATE INDEX IF NOT EXISTS idx_favorite_file ON favorite(file(255))");
99+
if (!success) {
100+
qWarning(log) << "Failed to create idx_favorite_file." << query.lastError().text();
101+
}
102+
103+
// Drop trigger if exists
104+
if (!query.exec("DROP TRIGGER IF EXISTS delete_icon_after_favorite")) {
105+
qDebug(log) << "Failed to drop trigger delete_icon_after_favorite:" << query.lastError().text();
106+
}
107+
// Create trigger
108+
QString szSql = R"(
109+
CREATE TRIGGER delete_icon_after_favorite
110+
AFTER DELETE ON favorite
111+
FOR EACH ROW
112+
BEGIN
113+
DECLARE favorite_count INT DEFAULT 0;
114+
DECLARE recent_count INT DEFAULT 0;
115+
116+
IF OLD.icon != 0 THEN
117+
-- 统计favorite表中引用该icon的数量
118+
SELECT COUNT(*) INTO favorite_count
119+
FROM favorite
120+
WHERE icon = OLD.icon;
121+
122+
-- 统计recent表中引用该icon的数量
123+
SELECT COUNT(*) INTO recent_count
124+
FROM recent
125+
WHERE icon = OLD.icon;
126+
127+
-- 如果都没有引用,则删除icon
128+
IF favorite_count = 0 AND recent_count = 0 THEN
129+
DELETE FROM icon WHERE id = OLD.icon;
130+
END IF;
131+
END IF;
132+
END
133+
)";
134+
success = query.exec(szSql);
135+
if (!success) {
136+
qWarning(log) << "Failed to create trigger delete_icon_after_favorite." << query.lastError().text();
137+
}
138+
139+
return CDatabaseTree::OnInitializeMySqlDatabase();
140+
}
141+
142+
bool CFavoriteDatabase::OnInitializeDatabase()
143+
{
144+
bool bRet = false;
145+
bRet = CDatabase::OnInitializeDatabase();
146+
if(!bRet) return false;
147+
148+
m_IconDB.SetDatabase(GetDatabase(), m_pPara);
149+
bRet = m_IconDB.OnInitializeDatabase();
150+
return bRet;
76151
}
77152

78153
int CFavoriteDatabase::AddFavorite(const QString &szFile,

App/Client/Favorite/FavoriteDatabase.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ class CFavoriteDatabase : public CDatabaseTree
5454

5555
private:
5656
bool OnInitializeDatabase() override;
57+
bool OnInitializeSqliteDatabase() override;
58+
bool OnInitializeMySqlDatabase() override;
5759
CDatabaseIcon m_IconDB;
5860

5961
// CDatabaseTree interface

App/Client/Recent/RecentDatabase.cpp

Lines changed: 82 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,18 @@ CRecentDatabase::~CRecentDatabase()
2828
}
2929

3030
bool CRecentDatabase::OnInitializeDatabase()
31+
{
32+
bool bRet = false;
33+
bRet = CDatabase::OnInitializeDatabase();
34+
if(!bRet) return false;
35+
36+
// Create icon table
37+
m_IconDB.SetDatabase(GetDatabase(), m_pPara);
38+
bRet = m_IconDB.OnInitializeDatabase();
39+
return bRet;
40+
}
41+
42+
bool CRecentDatabase::OnInitializeSqliteDatabase()
3143
{
3244
QSqlQuery query(GetDatabase());
3345

@@ -82,9 +94,76 @@ bool CRecentDatabase::OnInitializeDatabase()
8294
qWarning(log) << "Failed to create trigger delete_icon_after_recent." << query.lastError().text();
8395
}
8496

85-
// Create icon table
86-
m_IconDB.SetDatabase(GetDatabase());
87-
m_IconDB.OnInitializeDatabase();
97+
return true;
98+
}
99+
100+
bool CRecentDatabase::OnInitializeMySqlDatabase()
101+
{
102+
QSqlQuery query(GetDatabase());
103+
104+
// Create recent table
105+
bool success = query.exec(
106+
"CREATE TABLE IF NOT EXISTS recent ("
107+
" id INTEGER PRIMARY KEY AUTO_INCREMENT,"
108+
" operate_id TEXT NOT NULL,"
109+
" icon INTEGER DEFAULT 0,"
110+
" name TEXT NOT NULL,"
111+
" protocol TEXT,"
112+
" operate_type TEXT,"
113+
" file TEXT NOT NULL,"
114+
" time DATETIME DEFAULT CURRENT_TIMESTAMP,"
115+
" description TEXT,"
116+
" UNIQUE KEY uk_recent_file (file(255))"
117+
")"
118+
);
119+
120+
if (!success) {
121+
qCritical(log) << "Failed to create recent table:" << query.lastError().text();
122+
return false;
123+
}
124+
125+
// Create index
126+
success = query.exec("CREATE INDEX IF NOT EXISTS idx_recent_file ON recent(file(255))");
127+
if(!success) {
128+
qWarning(log) << "Failed to drop index idx_recent_file:" << query.lastError().text();
129+
}
130+
131+
// Create trigger
132+
if (!query.exec("DROP TRIGGER IF EXISTS delete_icon_after_recent")) {
133+
qDebug(log) << "Failed to drop trigger delete_icon_after_recent:" << query.lastError().text();
134+
}
135+
136+
QString szSql = R"(
137+
CREATE TRIGGER delete_icon_after_recent
138+
AFTER DELETE ON recent
139+
FOR EACH ROW
140+
BEGIN
141+
DECLARE favorite_count INT DEFAULT 0;
142+
DECLARE recent_count INT DEFAULT 0;
143+
144+
IF OLD.icon != 0 THEN
145+
-- 统计favorite表中引用该icon的数量
146+
SELECT COUNT(*) INTO favorite_count
147+
FROM favorite
148+
WHERE icon = OLD.icon;
149+
150+
-- 统计recent表中引用该icon的数量
151+
SELECT COUNT(*) INTO recent_count
152+
FROM recent
153+
WHERE icon = OLD.icon;
154+
155+
-- 如果都没有引用,则删除icon
156+
IF favorite_count = 0 AND recent_count = 0 THEN
157+
DELETE FROM icon WHERE id = OLD.icon;
158+
END IF;
159+
END IF;
160+
END
161+
)";
162+
success = query.exec(szSql);
163+
if (!success) {
164+
qWarning(log) << "Failed to create trigger delete_icon_after_recent." << query.lastError().text();
165+
}
166+
88167
return true;
89168
}
90169

App/Client/Recent/RecentDatabase.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ class CRecentDatabase : public CDatabase
3535

3636
private:
3737
bool OnInitializeDatabase() override;
38+
virtual bool OnInitializeSqliteDatabase() override;
39+
virtual bool OnInitializeMySqlDatabase() override;
3840
virtual bool ExportToJson(QJsonObject &obj) override;
3941
virtual bool ImportFromJson(const QJsonObject &obj) override;
4042

Src/Database.cpp

Lines changed: 57 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ static Q_LOGGING_CATEGORY(log, "DB")
1717
CDatabase::CDatabase(QObject *parent)
1818
: QObject{parent}
1919
, m_MinVersion("0.1.0")
20+
, m_pPara(nullptr)
2021
{
2122
qDebug(log) << Q_FUNC_INFO;
2223
m_szConnectName = "connect";
@@ -28,12 +29,12 @@ CDatabase::~CDatabase()
2829
CloseDatabase();
2930
}
3031

31-
void CDatabase::SetDatabase(QSqlDatabase db)
32+
void CDatabase::SetDatabase(QSqlDatabase db, CParameterDatabase *pPara)
3233
{
3334
QString szErr = "Only one of OpenDatabase and SetDatabase can be called, and it can only be called once";
34-
qCritical(log) << szErr;
3535
Q_ASSERT_X(!IsOpen(), "Database", szErr.toStdString().c_str());
3636
m_database = db;
37+
m_pPara = pPara;
3738
}
3839

3940
QSqlDatabase CDatabase::GetDatabase() const
@@ -46,6 +47,7 @@ bool CDatabase::OpenDatabase(CParameterDatabase *pPara)
4647
bool bRet = false;
4748
if(!pPara) return false;
4849

50+
m_pPara = pPara;
4951
QString szErr = "Only one of OpenDatabase or SetDatabase can be called, and it can only be called once";
5052
Q_ASSERT_X(!IsOpen(), "Database", szErr.toStdString().c_str());
5153

@@ -71,7 +73,8 @@ bool CDatabase::OpenDatabase(CParameterDatabase *pPara)
7173
qDebug(log) << "Multiple result sets:" << driver->hasFeature(QSqlDriver::MultipleResultSets);
7274
qDebug(log) << "Cancel query:" << driver->hasFeature(QSqlDriver::CancelQuery);
7375
}
74-
return bRet;
76+
77+
return OnInitializeDatabase();
7578
}
7679

7780
bool CDatabase::OpenSQLiteDatabase(
@@ -98,7 +101,7 @@ bool CDatabase::OpenSQLiteDatabase(
98101
m_database.setDatabaseName(databasePath);
99102

100103
if (!m_database.open()) {
101-
qCritical(log) << "Failed to open database:"
104+
qCritical(log) << "Failed to open sqlite database:"
102105
<< m_database.lastError().text()
103106
<< "connect name:" << m_database.connectionName()
104107
<< "database name:" << m_database.databaseName();
@@ -108,7 +111,7 @@ bool CDatabase::OpenSQLiteDatabase(
108111
qInfo(log) << "Open sqlite database connect:"
109112
<< m_database.connectionName()
110113
<< "database name:" << m_database.databaseName();
111-
return OnInitializeDatabase();
114+
return true;
112115
}
113116

114117
bool CDatabase::OpenMySqlDatabase(CParameterDatabase *pPara)
@@ -128,7 +131,7 @@ bool CDatabase::OpenMySqlDatabase(CParameterDatabase *pPara)
128131
m_database.setPassword(user.GetPassword());
129132

130133
if (!m_database.open()) {
131-
qCritical(log) << "Failed to open database:"
134+
qCritical(log) << "Failed to open mysql database:"
132135
<< m_database.lastError().text()
133136
<< "connect name:" << m_database.connectionName()
134137
<< "database name:" << m_database.databaseName();
@@ -138,7 +141,28 @@ bool CDatabase::OpenMySqlDatabase(CParameterDatabase *pPara)
138141
qInfo(log) << "Open mysql database connect:"
139142
<< m_database.connectionName()
140143
<< "database name:" << m_database.databaseName();
141-
return OnInitializeDatabase();
144+
return true;
145+
}
146+
147+
bool CDatabase::OnInitializeDatabase()
148+
{
149+
bool bRet = false;
150+
if(!m_pPara) return false;
151+
if(m_pPara->GetType() == "QSQLITE")
152+
bRet = OnInitializeSqliteDatabase();
153+
else if(m_pPara->GetType() == "QMYSQL")
154+
bRet = OnInitializeMySqlDatabase();
155+
return bRet;
156+
}
157+
158+
bool CDatabase::OnInitializeSqliteDatabase()
159+
{
160+
return true;
161+
}
162+
163+
bool CDatabase::OnInitializeMySqlDatabase()
164+
{
165+
return true;
142166
}
143167

144168
bool CDatabase::IsOpen() const
@@ -233,7 +257,7 @@ CDatabaseIcon::CDatabaseIcon(const QString &szPrefix, QObject *parent)
233257
m_szTableName = szPrefix + "_" + m_szTableName;
234258
}
235259

236-
bool CDatabaseIcon::OnInitializeDatabase()
260+
bool CDatabaseIcon::OnInitializeSqliteDatabase()
237261
{
238262
QSqlQuery query(GetDatabase());
239263

@@ -248,14 +272,38 @@ bool CDatabaseIcon::OnInitializeDatabase()
248272
;
249273
bool success = query.exec(szSql);
250274
if (!success) {
251-
qCritical(log) << "Failed to create icon table:" << m_szTableName << query.lastError().text();
275+
qCritical(log) << "Failed to create icon sqlite table:" << m_szTableName << query.lastError().text();
252276
return false;
253277
}
254278
query.exec("CREATE INDEX IF NOT EXISTS idx_" + m_szTableName + "_name ON " + m_szTableName + "(name)");
255279
query.exec("CREATE INDEX IF NOT EXISTS idx_" + m_szTableName + "_hash ON " + m_szTableName + "(hash)");
256280
return true;
257281
}
258282

283+
bool CDatabaseIcon::OnInitializeMySqlDatabase()
284+
{
285+
QSqlQuery query(GetDatabase());
286+
287+
// Create icon table
288+
QString szSql =
289+
"CREATE TABLE IF NOT EXISTS " + m_szTableName + " ("
290+
" id INTEGER PRIMARY KEY AUTO_INCREMENT,"
291+
" name TEXT UNIQUE," // Icon name. see QIcon::name()
292+
" hash TEXT," // Icon hash value
293+
" data LONGBLOB," // Icon binary data
294+
" UNIQUE KEY uk_icon_name (name(255))"
295+
")"
296+
;
297+
bool success = query.exec(szSql);
298+
if (!success) {
299+
qCritical(log) << "Failed to create icon mysql table:" << m_szTableName << query.lastError().text();
300+
return false;
301+
}
302+
query.exec("CREATE INDEX IF NOT EXISTS idx_" + m_szTableName + "_name ON " + m_szTableName + "(name(255))");
303+
query.exec("CREATE INDEX IF NOT EXISTS idx_" + m_szTableName + "_hash ON " + m_szTableName + "(hash(255))");
304+
return true;
305+
}
306+
259307
int CDatabaseIcon::GetIcon(const QIcon &icon)
260308
{
261309
bool bRet = false;

0 commit comments

Comments
 (0)