6#include <QLoggingCategory>
7#include "DatabaseUrl.h"
9static Q_LOGGING_CATEGORY(log,
"DB.Url")
15bool CDatabaseUrl::OnInitializeDatabase()
17 QSqlQuery query(GetDatabase());
20 bool success = query.exec(
21 "CREATE TABLE IF NOT EXISTS url ("
22 " id INTEGER PRIMARY KEY AUTOINCREMENT,"
23 " url TEXT UNIQUE NOT NULL,"
25 " icon INTEGER DEFAULT 0,"
26 " visit_time DATETIME DEFAULT CURRENT_TIMESTAMP"
31 qCritical(log) <<
"Failed to create url table:" << query.lastError().text();
36 query.exec(
"CREATE INDEX IF NOT EXISTS idx_url_url ON url(url)");
38 m_iconDB.SetDatabase(GetDatabase());
39 success = m_iconDB.OnInitializeDatabase();
43int CDatabaseUrl::AddUrl(
const QString &url,
const QString &title,
const QIcon &icon)
46 if (url.isEmpty())
return 0;
48 QSqlQuery query(GetDatabase());
51 query.prepare(
"SELECT id, title, icon FROM url WHERE url = :url");
52 query.bindValue(
":url", url);
54 if (query.exec() && query.next()) {
56 nId = query.value(0).toInt();
57 QString szTitle = query.value(1).toString();
60 int iconID = query.value(2).toInt();
62 iconID = m_iconDB.
GetIcon(icon);
68 "visit_time = :visit_time "
71 query.bindValue(
":title", szTitle);
72 query.bindValue(
":icon", iconID);
73 query.bindValue(
":visit_time", QDateTime::currentDateTime());
74 query.bindValue(
":id", nId);
78 "INSERT INTO url (url, title, icon) "
79 "VALUES (:url, :title, :icon)"
81 query.bindValue(
":url", url);
82 QString szTitle = title;
85 query.bindValue(
":title", szTitle);
86 query.bindValue(
":icon", m_iconDB.
GetIcon(icon));
89 qDebug(log) <<
"Sql:" << query.executedQuery();
90 qDebug(log) <<
"Bound values:" << query.boundValues();
91 bool success = query.exec();
94 qCritical(log) <<
"Failed to add url:" << url << query.lastError().text();
97 nId = query.lastInsertId().toInt();
103bool CDatabaseUrl::DeleteUrl(
const QString &url)
105 if (url.isEmpty())
return false;
107 QSqlQuery query(GetDatabase());
109 query.prepare(
"DELETE from url WHERE url = :url");
110 query.bindValue(
":url", url);
112 bool success = query.exec();
114 qCritical(log) <<
"Failed to delete url:" << url << query.lastError().text();
120bool CDatabaseUrl::DeleteUrl(
int id)
122 if (0 >=
id)
return false;
124 QSqlQuery query(GetDatabase());
126 query.prepare(
"DELETE from url WHERE id = :id");
127 query.bindValue(
":id",
id);
129 bool success = query.exec();
131 qCritical(log) <<
"Failed to delete url:" <<
id << query.lastError().text();
137bool CDatabaseUrl::UpdateUrl(
const QString &url,
const QString &title,
const QIcon &icon)
139 if (url.isEmpty())
return false;
140 if(title.isEmpty() && icon.isNull())
return false;
142 QSqlQuery query(GetDatabase());
145 szSql +=
"visit_time=\"" + QDateTime::currentDateTime().toString() +
"\" ";
147 szSql +=
", title=\"" + title +
"\" ";
149 szSql +=
", icon=" + QString::number(m_iconDB.
GetIcon(icon)) +
" ";
152 szSql =
"UPDATE url SET " + szSql;
153 szSql +=
"WHERE url=\"" + url +
"\"";
155 bool success = query.exec(szSql);
157 qCritical(log) <<
"Failed to update url:" << szSql << query.lastError().text();
163bool CDatabaseUrl::UpdateUrl(
int id,
const QString &title,
const QIcon &icon)
165 if (0 >=
id)
return false;
167 if(title.isEmpty() && icon.isNull())
return false;
169 szSql +=
"visit_time=\"" + QDateTime::currentDateTime().toString() +
"\" ";
171 szSql +=
", title=\"" + title +
"\" ";
173 szSql +=
", icon=" + QString::number(m_iconDB.
GetIcon(icon)) +
" ";
176 QSqlQuery query(GetDatabase());
177 query.prepare(
"SELECT title, icon FROM url WHERE id = :id");
178 query.bindValue(
":id",
id);
180 if (query.exec() && query.next()) {
184 szSql =
"UPDATE url SET " + szSql;
185 szSql +=
"WHERE id = " + QString::number(
id);
187 qCritical(log) <<
"Failed to update url, url is not exist:" << id;
191 bool success = query.exec();
193 qCritical(log) <<
"Failed to update url:" << szSql << query.lastError().text();
202 if (0 >=
id)
return item;
204 QSqlQuery query(GetDatabase());
206 query.prepare(
"SELECT url, title, icon, visit_time FROM url "
208 query.bindValue(
":id",
id);
210 if (query.exec() && query.next()) {
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();
224 if (url.isEmpty())
return item;
226 QSqlQuery query(GetDatabase());
228 query.prepare(
"SELECT id, title, icon, visit_time FROM url "
230 query.bindValue(
":url", url);
232 if (query.exec() && query.next()) {
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();
243int CDatabaseUrl::GetId(
const QString& url)
245 if (url.isEmpty())
return 0;
247 QSqlQuery query(GetDatabase());
249 query.prepare(
"SELECT id, title, icon FROM url "
251 query.bindValue(
":url", url);
253 if (query.exec() && query.next()) {
254 return query.value(0).toInt();
259QList<int> CDatabaseUrl::GetDomain(
const QString &szDomain)
262 QSqlQuery query(GetDatabase());
263 query.prepare(
"SELECT id FROM url WHERE url LIKE :url");
264 query.bindValue(
":url", QString(
"%%://%%%1%%").arg(szDomain));
266 bool bRet = query.exec();
268 while(query.next()) {
269 ret << query.value(0).toInt();
272 qCritical(log) <<
"Failed to get domain:" << query.lastError().text();
278QList<CDatabaseUrl::UrlItem> CDatabaseUrl::Search(
const QString &keyword)
280 QList<UrlItem> items;
282 QSqlQuery query(GetDatabase());
283 QString searchPattern =
"%" + keyword +
"%";
285 "SELECT id, url, title, visit_time, icon "
287 "WHERE url LIKE :pattern OR title LIKE :pattern "
288 "ORDER BY visit_time DESC"
290 query.bindValue(
":pattern", searchPattern);
293 while (query.next()) {
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());
307bool CDatabaseUrl::ExportToJson(QJsonObject &obj)
312bool CDatabaseUrl::ImportFromJson(
const QJsonObject &obj)
int GetIcon(const QIcon &icon)
Get icon id