玉兔远程控制 0.1.0-bate6
载入中...
搜索中...
未找到
DatabaseUrl.cpp
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
9static Q_LOGGING_CATEGORY(log, "DB.Url")
10CDatabaseUrl::CDatabaseUrl(QObject *parent)
11 : CDatabase{parent}
12{}
13
14
15bool 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
43int 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 qDebug(log) << "Sql:" << query.executedQuery();
90 qDebug(log) << "Bound values:" << query.boundValues();
91 bool success = query.exec();
92 if (!success) {
93 nId = 0;
94 qCritical(log) << "Failed to add url:" << url << query.lastError().text();
95 } else {
96 if(0 == nId)
97 nId = query.lastInsertId().toInt();
98 }
99
100 return nId;
101}
102
103bool CDatabaseUrl::DeleteUrl(const QString &url)
104{
105 if (url.isEmpty()) return false;
106
107 QSqlQuery query(GetDatabase());
108
109 query.prepare("DELETE from url WHERE url = :url");
110 query.bindValue(":url", url);
111
112 bool success = query.exec();
113 if (!success) {
114 qCritical(log) << "Failed to delete url:" << url << query.lastError().text();
115 }
116
117 return success;
118}
119
120bool CDatabaseUrl::DeleteUrl(int id)
121{
122 if (0 >= id) return false;
123
124 QSqlQuery query(GetDatabase());
125
126 query.prepare("DELETE from url WHERE id = :id");
127 query.bindValue(":id", id);
128
129 bool success = query.exec();
130 if (!success) {
131 qCritical(log) << "Failed to delete url:" << id << query.lastError().text();
132 }
133
134 return success;
135}
136
137bool CDatabaseUrl::UpdateUrl(const QString &url, const QString &title, const QIcon &icon)
138{
139 if (url.isEmpty()) return false;
140 if(title.isEmpty() && icon.isNull()) return false;
141
142 QSqlQuery query(GetDatabase());
143
144 QString szSql;
145 szSql += "visit_time=\"" + QDateTime::currentDateTime().toString() + "\" ";
146 if(!title.isEmpty())
147 szSql += ", title=\"" + title + "\" ";
148 if(!icon.isNull()) {
149 szSql += ", icon=" + QString::number(m_iconDB.GetIcon(icon)) + " ";
150 }
151
152 szSql = "UPDATE url SET " + szSql;
153 szSql += "WHERE url=\"" + url + "\"";
154
155 bool success = query.exec(szSql);
156 if (!success) {
157 qCritical(log) << "Failed to update url:" << szSql << query.lastError().text();
158 }
159
160 return success;
161}
162
163bool CDatabaseUrl::UpdateUrl(int id, const QString &title, const QIcon &icon)
164{
165 if (0 >= id) return false;
166
167 if(title.isEmpty() && icon.isNull()) return false;
168 QString szSql;
169 szSql += "visit_time=\"" + QDateTime::currentDateTime().toString() + "\" ";
170 if(!title.isEmpty())
171 szSql += ", title=\"" + title + "\" ";
172 if(!icon.isNull()) {
173 szSql += ", icon=" + QString::number(m_iconDB.GetIcon(icon)) + " ";
174 }
175
176 QSqlQuery query(GetDatabase());
177 query.prepare("SELECT title, icon FROM url WHERE id = :id");
178 query.bindValue(":id", id);
179
180 if (query.exec() && query.next()) {
181 if(szSql.isEmpty())
182 return false;
183
184 szSql = "UPDATE url SET " + szSql;
185 szSql += "WHERE id = " + QString::number(id);
186 } else {
187 qCritical(log) << "Failed to update url, url is not exist:" << id;
188 return false;
189 }
190
191 bool success = query.exec();
192 if (!success) {
193 qCritical(log) << "Failed to update url:" << szSql << query.lastError().text();
194 }
195
196 return success;
197}
198
199CDatabaseUrl::UrlItem CDatabaseUrl::GetItem(int id)
200{
201 UrlItem item;
202 if (0 >= id) return item;
203
204 QSqlQuery query(GetDatabase());
205
206 query.prepare("SELECT url, title, icon, visit_time FROM url "
207 "WHERE id = :id");
208 query.bindValue(":id", id);
209
210 if (query.exec() && query.next()) {
211 item.id = id;
212 item.szUrl = query.value(0).toString();
213 item.szTitle = query.value(1).toString();
214 item.iconId = query.value(2).toInt();
215 item.icon = m_iconDB.GetIcon(item.iconId);
216 item.visit_time = query.value(3).toDateTime();
217 }
218 return item;
219}
220
221CDatabaseUrl::UrlItem CDatabaseUrl::GetItem(const QString& url)
222{
223 UrlItem item;
224 if (url.isEmpty()) return item;
225
226 QSqlQuery query(GetDatabase());
227
228 query.prepare("SELECT id, title, icon, visit_time FROM url "
229 "WHERE url = :url");
230 query.bindValue(":url", url);
231
232 if (query.exec() && query.next()) {
233 item.szUrl = url;
234 item.id = query.value(0).toInt();
235 item.szTitle = query.value(1).toString();
236 item.iconId = query.value(2).toInt();
237 item.icon = m_iconDB.GetIcon(item.iconId);
238 item.visit_time = query.value(3).toDateTime();
239 }
240 return item;
241}
242
243int CDatabaseUrl::GetId(const QString& url)
244{
245 if (url.isEmpty()) return 0;
246
247 QSqlQuery query(GetDatabase());
248
249 query.prepare("SELECT id, title, icon FROM url "
250 "WHERE url = :url");
251 query.bindValue(":url", url);
252
253 if (query.exec() && query.next()) {
254 return query.value(0).toInt();
255 }
256 return 0;
257}
258
259QList<int> CDatabaseUrl::GetDomain(const QString &szDomain)
260{
261 QList<int> ret;
262 QSqlQuery query(GetDatabase());
263 query.prepare("SELECT id FROM url WHERE url LIKE :url");
264 query.bindValue(":url", QString("%%://%%%1%%").arg(szDomain));
265
266 bool bRet = query.exec();
267 if (bRet) {
268 while(query.next()) {
269 ret << query.value(0).toInt();
270 }
271 } else {
272 qCritical(log) << "Failed to get domain:" << query.lastError().text();
273 }
274
275 return ret;
276}
277
278QList<CDatabaseUrl::UrlItem> CDatabaseUrl::Search(const QString &keyword)
279{
280 QList<UrlItem> items;
281
282 QSqlQuery query(GetDatabase());
283 QString searchPattern = "%" + keyword + "%";
284 query.prepare(
285 "SELECT id, url, title, visit_time, icon "
286 "FROM url "
287 "WHERE url LIKE :pattern OR title LIKE :pattern "
288 "ORDER BY visit_time DESC"
289 );
290 query.bindValue(":pattern", searchPattern);
291
292 if (query.exec()) {
293 while (query.next()) {
294 UrlItem item;
295 item.id = query.value(0).toInt();
296 item.szUrl = query.value(1).toString();
297 item.szTitle = query.value(2).toString();
298 item.visit_time = query.value(3).toDateTime();
299 item.icon = m_iconDB.GetIcon(query.value(4).toInt());
300 items.append(item);
301 }
302 }
303
304 return items;
305}
306
307bool CDatabaseUrl::ExportToJson(QJsonObject &obj)
308{
309 return true;
310}
311
312bool CDatabaseUrl::ImportFromJson(const QJsonObject &obj)
313{
314 return true;
315}
int GetIcon(const QIcon &icon)
Get icon id
Definition Database.cpp:392