Skip to content

Commit 28d9909

Browse files
committed
Plugins::WebBrowser: add CDatabaseUrl
1 parent e3c0b8d commit 28d9909

File tree

10 files changed

+524
-270
lines changed

10 files changed

+524
-270
lines changed

Plugins/WebBrowser/CMakeLists.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ set(WebBrowser_SOURCE_FILES
3535
PasswordStore.cpp
3636
CaptureFullPage.cpp
3737
MultimediaRecord.cpp
38+
AddressCompleter.cpp
39+
DatabaseUrl.cpp
3840
History/FrmHistory.cpp
3941
History/HistoryDatabase.cpp
4042
History/HistoryModel.cpp
41-
42-
AddressCompleter.cpp
4343
Bookmark/BookmarkDatabase.cpp
4444
Bookmark/FrmBookmark.cpp
4545
Bookmark/FrmAddBookmark.cpp
@@ -57,11 +57,11 @@ set(WebBrowser_HEADER_FILES
5757
PasswordStore.h
5858
CaptureFullPage.h
5959
MultimediaRecord.h
60+
AddressCompleter.h
61+
DatabaseUrl.h
6062
History/FrmHistory.h
6163
History/HistoryDatabase.h
6264
History/HistoryModel.h
63-
64-
AddressCompleter.h
6565
Bookmark/BookmarkDatabase.h
6666
Bookmark/FrmBookmark.h
6767
Bookmark/FrmAddBookmark.h

Plugins/WebBrowser/DatabaseUrl.cpp

Lines changed: 325 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,325 @@
1+
// Author: Kang Lin <kl222@126.com>
2+
3+
#include <QSqlQuery>
4+
#include <QSqlError>
5+
#include <QDateTime>
6+
#include <QLoggingCategory>
7+
#include "DatabaseUrl.h"
8+
9+
static Q_LOGGING_CATEGORY(log, "DB.Url")
10+
CDatabaseUrl::CDatabaseUrl(QObject *parent)
11+
: CDatabase{parent}
12+
{}
13+
14+
15+
bool CDatabaseUrl::OnInitializeDatabase()
16+
{
17+
QSqlQuery query(GetDatabase());
18+
19+
// 创建历史记录表
20+
bool success = query.exec(
21+
"CREATE TABLE IF NOT EXISTS url ("
22+
" id INTEGER PRIMARY KEY AUTOINCREMENT,"
23+
" url TEXT UNIQUE NOT NULL,"
24+
" title TEXT,"
25+
" icon INTEGER DEFAULT 0,"
26+
" visit_time DATETIME DEFAULT CURRENT_TIMESTAMP"
27+
")"
28+
);
29+
30+
if (!success) {
31+
qCritical(log) << "Failed to create url table:" << query.lastError().text();
32+
return false;
33+
}
34+
35+
// 创建索引
36+
query.exec("CREATE INDEX IF NOT EXISTS idx_url_url ON url(url)");
37+
38+
m_iconDB.SetDatabase(GetDatabase());
39+
success = m_iconDB.OnInitializeDatabase();
40+
return success;
41+
}
42+
43+
int CDatabaseUrl::AddUrl(const QString &url, const QString &title, const QIcon &icon)
44+
{
45+
int nId = 0;
46+
if (url.isEmpty()) return 0;
47+
48+
QSqlQuery query(GetDatabase());
49+
50+
// 检查URL是否已存在
51+
query.prepare("SELECT id, title, icon FROM url WHERE url = :url");
52+
query.bindValue(":url", url);
53+
54+
if (query.exec() && query.next()) {
55+
// 更新现有记录
56+
nId = query.value(0).toInt();
57+
QString szTitle = query.value(1).toString();
58+
if(!title.isEmpty())
59+
szTitle = title;
60+
int iconID = query.value(2).toInt();
61+
if(!icon.isNull())
62+
iconID = m_iconDB.GetIcon(icon);
63+
64+
query.prepare(
65+
"UPDATE url SET "
66+
"title = :title, "
67+
"icon = :icon "
68+
"visit_time = :visit_time"
69+
"WHERE id = :id"
70+
);
71+
query.bindValue(":title", szTitle);
72+
query.bindValue(":icon", iconID);
73+
query.bindValue(":visit_time", QDateTime::currentDateTime());
74+
query.bindValue(":id", nId);
75+
} else {
76+
// 插入新记录
77+
query.prepare(
78+
"INSERT INTO url (url, title, icon) "
79+
"VALUES (:url, :title, :icon)"
80+
);
81+
query.bindValue(":url", url);
82+
QString szTitle = title;
83+
if(szTitle.isEmpty())
84+
szTitle = url;
85+
query.bindValue(":title", szTitle);
86+
query.bindValue(":icon", m_iconDB.GetIcon(icon));
87+
}
88+
89+
bool success = query.exec();
90+
if (!success) {
91+
nId = 0;
92+
qCritical(log) << "Failed to add url:" << url << query.lastError().text();
93+
} else {
94+
if(0 == nId)
95+
nId = query.lastInsertId().toInt();
96+
}
97+
98+
return nId;
99+
}
100+
101+
bool CDatabaseUrl::DeleteUrl(const QString &url)
102+
{
103+
if (url.isEmpty()) return false;
104+
105+
QSqlQuery query(GetDatabase());
106+
107+
query.prepare("DELETE from url WHERE url = :url");
108+
query.bindValue(":url", url);
109+
110+
bool success = query.exec();
111+
if (!success) {
112+
qCritical(log) << "Failed to delete url:" << url << query.lastError().text();
113+
}
114+
115+
return success;
116+
}
117+
118+
bool CDatabaseUrl::DeleteUrl(int id)
119+
{
120+
if (0 >= id) return false;
121+
122+
QSqlQuery query(GetDatabase());
123+
124+
query.prepare("DELETE from url WHERE id = :id");
125+
query.bindValue(":id", id);
126+
127+
bool success = query.exec();
128+
if (!success) {
129+
qCritical(log) << "Failed to delete url:" << id << query.lastError().text();
130+
}
131+
132+
return success;
133+
}
134+
135+
bool CDatabaseUrl::UpdateUrl(const QString &url, const QString &title, const QIcon &icon)
136+
{
137+
if (url.isEmpty()) return false;
138+
139+
QSqlQuery query(GetDatabase());
140+
141+
query.prepare("SELECT id, title, icon FROM url WHERE url = :url");
142+
query.bindValue(":url", url);
143+
144+
if (query.exec() && query.next()) {
145+
int id = query.value(0).toInt();
146+
QString szTitle = query.value(1).toString();
147+
if(!title.isEmpty())
148+
szTitle = title;
149+
int iconID = query.value(2).toInt();
150+
if(!icon.isNull())
151+
iconID = m_iconDB.GetIcon(icon);
152+
153+
query.prepare(
154+
"UPDATE url SET "
155+
"title = :title, "
156+
"icon = :icon, "
157+
"visit_time = :visit_time "
158+
"WHERE id = :id"
159+
);
160+
query.bindValue(":title", szTitle);
161+
query.bindValue(":icon", iconID);
162+
query.bindValue(":visit_time", QDateTime::currentDateTime());
163+
query.bindValue(":id", id);
164+
165+
} else {
166+
qCritical(log) << "Failed to update url, url is not exist:" << url;
167+
return false;
168+
}
169+
170+
bool success = query.exec();
171+
if (!success) {
172+
qCritical(log) << "Failed to update url:" << url << query.lastError().text();
173+
}
174+
175+
return success;
176+
}
177+
178+
bool CDatabaseUrl::UpdateUrl(int id, const QString &title, const QIcon &icon)
179+
{
180+
if (0 >= id) return false;
181+
182+
if(title.isEmpty() && icon.isNull()) return false;
183+
QSqlQuery query(GetDatabase());
184+
185+
query.prepare("SELECT title, icon FROM url WHERE id = :id");
186+
query.bindValue(":id", id);
187+
188+
if (query.exec() && query.next()) {
189+
QString szTitle = query.value(0).toString();
190+
int iconID = query.value(1).toInt();
191+
if(!icon.isNull())
192+
iconID = m_iconDB.GetIcon(icon);
193+
if(!title.isEmpty())
194+
szTitle = title;
195+
196+
query.prepare(
197+
"UPDATE url SET "
198+
"title = :title, "
199+
"icon = :icon, "
200+
"visit_time = :visit_time "
201+
"WHERE id = :id"
202+
);
203+
query.bindValue(":title", szTitle);
204+
query.bindValue(":icon", iconID);
205+
query.bindValue(":visit_time", QDateTime::currentDateTime());
206+
query.bindValue(":id", id);
207+
} else {
208+
qCritical(log) << "Failed to update url, url is not exist:" << id;
209+
return false;
210+
}
211+
212+
bool success = query.exec();
213+
if (!success) {
214+
qCritical(log) << "Failed to update url:" << id << query.lastError().text();
215+
}
216+
217+
return success;
218+
}
219+
220+
CDatabaseUrl::UrlItem CDatabaseUrl::GetItem(int id)
221+
{
222+
UrlItem item;
223+
if (0 >= id) return item;
224+
225+
QSqlQuery query(GetDatabase());
226+
227+
query.prepare("SELECT url, title, icon, visit_time FROM url "
228+
"WHERE id = :id");
229+
query.bindValue(":id", id);
230+
231+
if (query.exec() && query.next()) {
232+
item.id = id;
233+
item.szUrl = query.value(0).toString();
234+
item.szTitle = query.value(1).toString();
235+
item.iconId = query.value(2).toInt();
236+
item.icon = m_iconDB.GetIcon(item.iconId);
237+
item.visit_time = query.value(3).toDateTime();
238+
}
239+
return item;
240+
}
241+
242+
CDatabaseUrl::UrlItem CDatabaseUrl::GetItem(const QString& url)
243+
{
244+
UrlItem item;
245+
if (url.isEmpty()) return item;
246+
247+
QSqlQuery query(GetDatabase());
248+
249+
query.prepare("SELECT id, title, icon, visit_time FROM url "
250+
"WHERE url = :url");
251+
query.bindValue(":url", url);
252+
253+
if (query.exec() && query.next()) {
254+
item.szUrl = url;
255+
item.id = query.value(0).toInt();
256+
item.szTitle = query.value(1).toString();
257+
item.iconId = query.value(2).toInt();
258+
item.icon = m_iconDB.GetIcon(item.iconId);
259+
item.visit_time = query.value(3).toDateTime();
260+
}
261+
return item;
262+
}
263+
264+
int CDatabaseUrl::GetId(const QString& url)
265+
{
266+
if (url.isEmpty()) return 0;
267+
268+
QSqlQuery query(GetDatabase());
269+
270+
query.prepare("SELECT id, title, icon FROM url "
271+
"WHERE url = :url");
272+
query.bindValue(":url", url);
273+
274+
if (query.exec() && query.next()) {
275+
return query.value(0).toInt();
276+
}
277+
return 0;
278+
}
279+
280+
QList<int> CDatabaseUrl::GetDomain(const QString &szDomain)
281+
{
282+
QList<int> ret;
283+
QSqlQuery query(GetDatabase());
284+
query.prepare("SELECT id FROM url WHERE url LIKE :url");
285+
query.bindValue(":url", QString("%%://%%%1%%").arg(szDomain));
286+
287+
bool bRet = query.exec();
288+
if (bRet) {
289+
while(query.next()) {
290+
ret << query.value(0).toInt();
291+
}
292+
} else {
293+
qCritical(log) << "Failed to get domain:" << query.lastError().text();
294+
}
295+
296+
return ret;
297+
}
298+
299+
QList<CDatabaseUrl::UrlItem> CDatabaseUrl::Search(const QString &keyword)
300+
{
301+
QList<UrlItem> items;
302+
303+
QSqlQuery query(GetDatabase());
304+
QString searchPattern = "%" + keyword + "%";
305+
query.prepare(
306+
"SELECT id, url, title, visit_time "
307+
"FROM url "
308+
"WHERE url LIKE :pattern OR title LIKE :pattern "
309+
"ORDER BY visit_time DESC"
310+
);
311+
query.bindValue(":pattern", searchPattern);
312+
313+
if (query.exec()) {
314+
while (query.next()) {
315+
UrlItem item;
316+
item.id = query.value(0).toInt();
317+
item.szUrl = query.value(1).toString();
318+
item.szTitle = query.value(2).toString();
319+
item.visit_time = query.value(3).toDateTime();
320+
items.append(item);
321+
}
322+
}
323+
324+
return items;
325+
}

Plugins/WebBrowser/DatabaseUrl.h

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Author: Kang Lin <kl222@126.com>
2+
3+
#pragma once
4+
#include <QIcon>
5+
#include "Database.h"
6+
7+
class CDatabaseUrl : public CDatabase
8+
{
9+
Q_OBJECT
10+
public:
11+
explicit CDatabaseUrl(QObject *parent = nullptr);
12+
13+
struct UrlItem {
14+
int id;
15+
QString szUrl;
16+
QString szTitle;
17+
QIcon icon;
18+
QDateTime visit_time;
19+
int iconId;
20+
UrlItem()
21+
: iconId(0)
22+
{}
23+
};
24+
25+
int AddUrl(const QString& url, const QString& title = QString(), const QIcon& icon = QIcon());
26+
bool DeleteUrl(const QString& url);
27+
bool DeleteUrl(int id);
28+
bool UpdateUrl(const QString& url, const QString& title = QString(), const QIcon& icon = QIcon());
29+
bool UpdateUrl(int id, const QString& title = QString(), const QIcon& icon = QIcon());
30+
UrlItem GetItem(int id);
31+
UrlItem GetItem(const QString& url);
32+
int GetId(const QString& url);
33+
QList<int> GetDomain(const QString& szDomain);
34+
QList<UrlItem> Search(const QString& keyword);
35+
36+
virtual bool OnInitializeDatabase() override;
37+
38+
private:
39+
CDatabaseIcon m_iconDB;
40+
};
41+

0 commit comments

Comments
 (0)