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