6#include <QLoggingCategory>
7#include "DatabaseUrl.h"
9static Q_LOGGING_CATEGORY(log,
"DB.Url")
15bool CDatabaseUrl::OnInitializeDatabase()
18 success = CDatabase::OnInitializeDatabase();
19 if(!success)
return success;
20 m_iconDB.SetDatabase(GetDatabase());
21 success = m_iconDB.OnInitializeDatabase();
25int CDatabaseUrl::AddUrl(
const QString &url,
const QString &title,
const QIcon &icon)
28 if (url.isEmpty())
return 0;
30 QSqlQuery query(GetDatabase());
33 query.prepare(
"SELECT id, title, icon FROM url WHERE url = :url");
34 query.bindValue(
":url", url);
36 if (query.exec() && query.next()) {
38 nId = query.value(0).toInt();
39 QString szTitle = query.value(1).toString();
42 int iconID = query.value(2).toInt();
44 iconID = m_iconDB.
GetIcon(icon);
50 "visit_time = :visit_time "
53 query.bindValue(
":title", szTitle);
54 query.bindValue(
":icon", iconID);
55 query.bindValue(
":visit_time", QDateTime::currentDateTime());
56 query.bindValue(
":id", nId);
60 "INSERT INTO url (url, title, icon) "
61 "VALUES (:url, :title, :icon)"
63 query.bindValue(
":url", url);
64 QString szTitle = title;
67 query.bindValue(
":title", szTitle);
68 query.bindValue(
":icon", m_iconDB.
GetIcon(icon));
71 qDebug(log) <<
"Sql:" << query.executedQuery();
72 qDebug(log) <<
"Bound values:" << query.boundValues();
73 bool success = query.exec();
76 qCritical(log) <<
"Failed to add url:" << url << query.lastError().text();
79 nId = query.lastInsertId().toInt();
85bool CDatabaseUrl::DeleteUrl(
const QString &url)
87 if (url.isEmpty())
return false;
89 QSqlQuery query(GetDatabase());
91 query.prepare(
"DELETE from url WHERE url = :url");
92 query.bindValue(
":url", url);
94 bool success = query.exec();
96 qCritical(log) <<
"Failed to delete url:" << url << query.lastError().text();
102bool CDatabaseUrl::DeleteUrl(
int id)
104 if (0 >=
id)
return false;
106 QSqlQuery query(GetDatabase());
108 query.prepare(
"DELETE from url WHERE id = :id");
109 query.bindValue(
":id",
id);
111 bool success = query.exec();
113 qCritical(log) <<
"Failed to delete url:" <<
id << query.lastError().text();
119bool CDatabaseUrl::UpdateUrl(
const QString &url,
const QString &title,
const QIcon &icon)
121 if (url.isEmpty())
return false;
122 if(title.isEmpty() && icon.isNull())
return false;
124 QSqlQuery query(GetDatabase());
127 szSql +=
"visit_time=\"" + QDateTime::currentDateTime().toString() +
"\" ";
129 szSql +=
", title=\"" + title +
"\" ";
131 szSql +=
", icon=" + QString::number(m_iconDB.
GetIcon(icon)) +
" ";
134 szSql =
"UPDATE url SET " + szSql;
135 szSql +=
"WHERE url=\"" + url +
"\"";
137 bool success = query.exec(szSql);
139 qCritical(log) <<
"Failed to update url:" << szSql << query.lastError().text();
145bool CDatabaseUrl::UpdateUrl(
int id,
const QString &title,
const QIcon &icon)
147 if (0 >=
id)
return false;
149 if(title.isEmpty() && icon.isNull())
return false;
151 szSql +=
"visit_time=\"" + QDateTime::currentDateTime().toString() +
"\" ";
153 szSql +=
", title=\"" + title +
"\" ";
155 szSql +=
", icon=" + QString::number(m_iconDB.
GetIcon(icon)) +
" ";
158 QSqlQuery query(GetDatabase());
159 query.prepare(
"SELECT title, icon FROM url WHERE id = :id");
160 query.bindValue(
":id",
id);
162 if (query.exec() && query.next()) {
166 szSql =
"UPDATE url SET " + szSql;
167 szSql +=
"WHERE id = " + QString::number(
id);
169 qCritical(log) <<
"Failed to update url, url is not exist:" << id;
173 bool success = query.exec();
175 qCritical(log) <<
"Failed to update url:" << szSql << query.lastError().text();
184 if (0 >=
id)
return item;
186 QSqlQuery query(GetDatabase());
188 query.prepare(
"SELECT url, title, icon, visit_time FROM url "
190 query.bindValue(
":id",
id);
192 if (query.exec() && query.next()) {
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();
206 if (url.isEmpty())
return item;
208 QSqlQuery query(GetDatabase());
210 query.prepare(
"SELECT id, title, icon, visit_time FROM url "
212 query.bindValue(
":url", url);
214 if (query.exec() && query.next()) {
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();
225int CDatabaseUrl::GetId(
const QString& url)
227 if (url.isEmpty())
return 0;
229 QSqlQuery query(GetDatabase());
231 query.prepare(
"SELECT id, title, icon FROM url "
233 query.bindValue(
":url", url);
235 if (query.exec() && query.next()) {
236 return query.value(0).toInt();
241QList<int> CDatabaseUrl::GetDomain(
const QString &szDomain)
244 QSqlQuery query(GetDatabase());
245 query.prepare(
"SELECT id FROM url WHERE url LIKE :url");
246 query.bindValue(
":url", QString(
"%%://%%%1%%").arg(szDomain));
248 bool bRet = query.exec();
250 while(query.next()) {
251 ret << query.value(0).toInt();
254 qCritical(log) <<
"Failed to get domain:"
255 << query.lastError().text()
256 << query.executedQuery();
262QList<CDatabaseUrl::UrlItem> CDatabaseUrl::Search(
const QString &keyword)
264 QList<UrlItem> items;
266 QSqlQuery query(GetDatabase());
267 QString searchPattern =
"%" + keyword +
"%";
269 "SELECT id, url, title, visit_time, icon "
271 "WHERE url LIKE :pattern OR title LIKE :pattern "
272 "ORDER BY visit_time DESC"
274 query.bindValue(
":pattern", searchPattern);
277 while (query.next()) {
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());
287 qCritical(log) <<
"Failed to search:"
288 << query.lastError().text()
289 << query.executedQuery();
295bool CDatabaseUrl::ExportToJson(QJsonObject &obj)
300bool CDatabaseUrl::ImportFromJson(
const QJsonObject &obj)
305bool CDatabaseUrl::OnInitializeSqliteDatabase()
307 QSqlQuery query(GetDatabase());
310 bool success = query.exec(
311 "CREATE TABLE IF NOT EXISTS url ("
312 " id INTEGER PRIMARY KEY AUTOINCREMENT,"
313 " url TEXT UNIQUE NOT NULL,"
315 " icon INTEGER DEFAULT 0,"
316 " visit_time DATETIME DEFAULT CURRENT_TIMESTAMP"
321 qCritical(log) <<
"Failed to create url table:"
322 << query.lastError().text()
323 << query.executedQuery();
328 success = query.exec(
"CREATE INDEX IF NOT EXISTS idx_url_url ON url(url)");
330 qWarning(log) <<
"Failed to create index idx_url_url:"
331 << query.lastError().text()
332 << query.executedQuery();
338bool CDatabaseUrl::OnInitializeMySqlDatabase()
340 QSqlQuery query(GetDatabase());
343 bool success = query.exec(
344 "CREATE TABLE IF NOT EXISTS url ("
345 " id INTEGER PRIMARY KEY AUTO_INCREMENT,"
346 " url TEXT NOT NULL,"
348 " icon INTEGER DEFAULT 0,"
349 " visit_time DATETIME DEFAULT CURRENT_TIMESTAMP,"
350 " INDEX idx_url_url (url)"
355 qCritical(log) <<
"Failed to create url table:"
356 << query.lastError().text()
357 << query.executedQuery();
int GetIcon(const QIcon &icon)
Get icon id