6#include <QLoggingCategory>
7#include "DatabaseUrl.h"
9static Q_LOGGING_CATEGORY(log,
"DB.Url")
13 m_szTableName =
"url";
14 if(!szSuffix.isEmpty()) {
15 m_szTableName = m_szTableName +
"_" + szSuffix;
17 m_szConnectName =
"connect_" + m_szTableName;
24 if(!success)
return success;
25 success = m_iconDB.
SetDatabase(GetDatabase(), m_pPara);
29bool CDatabaseUrl::OnInitializeSqliteDatabase()
31 QSqlQuery query(GetDatabase());
32 bool bRet = query.prepare(
33 "CREATE TABLE IF NOT EXISTS " + m_szTableName +
" ("
34 " id INTEGER PRIMARY KEY AUTOINCREMENT,"
35 " url TEXT UNIQUE NOT NULL,"
37 " icon INTEGER DEFAULT 0,"
38 " visit_time DATETIME DEFAULT CURRENT_TIMESTAMP"
42 SetError(
"Failed to create " + m_szTableName +
" sqlite table. Error: " + query.lastError().text());
43 qCritical(log) << GetError();
48 SetError(
"Failed to create " + m_szTableName +
" sqlite table: " + query.lastError().text()
49 +
"; Sql: " + query.executedQuery());
54 query.prepare(
"CREATE INDEX IF NOT EXISTS idx_" + m_szTableName +
"_url ON " + m_szTableName +
"(url)");
57 qWarning(log) <<
"Failed to create index idx_" + m_szTableName +
"_url:"
58 << query.lastError().text()
59 << query.executedQuery();
65bool CDatabaseUrl::OnInitializeMySqlDatabase()
67 QSqlQuery query(GetDatabase());
70 bool bRet = query.prepare(
71 "CREATE TABLE IF NOT EXISTS `" + m_szTableName +
"` ("
72 " `id` INTEGER PRIMARY KEY AUTO_INCREMENT,"
73 " `url` TEXT NOT NULL,"
75 " `icon` INTEGER DEFAULT 0,"
76 " `visit_time` DATETIME DEFAULT CURRENT_TIMESTAMP,"
77 " UNIQUE KEY `idx_url` (`url`(255))"
81 SetError(
"Failed to create " + m_szTableName +
" mysql table. Error: " + query.lastError().text());
82 qCritical(log) << GetError();
87 SetError(
"Failed to create " + m_szTableName +
" mysql table. Error: " + query.lastError().text()
88 +
"; Sql: " + query.executedQuery());
89 qCritical(log) << GetError();
96int CDatabaseUrl::AddUrl(
const QString &url,
const QString &title,
const QIcon &icon)
99 if (url.isEmpty())
return 0;
101 QSqlQuery query(GetDatabase());
104 query.prepare(
"SELECT id, title, icon FROM " + m_szTableName +
" WHERE url = :url");
105 query.bindValue(
":url", url);
107 SetError(
"Failed to exec: " + query.executedQuery()
108 +
"; Error: " + query.lastError().text());
109 qCritical(log) << GetError();
114 nId = query.value(0).toInt();
115 QString szTitle = query.value(1).toString();
118 int iconID = query.value(2).toInt();
120 iconID = m_iconDB.
GetIcon(icon);
122 "UPDATE " + m_szTableName +
" SET "
125 "visit_time = :visit_time "
128 query.bindValue(
":title", szTitle);
129 query.bindValue(
":icon", iconID);
130 query.bindValue(
":visit_time", QDateTime::currentDateTime());
131 query.bindValue(
":id", nId);
135 "INSERT INTO " + m_szTableName +
" (url, title, icon) "
136 "VALUES (:url, :title, :icon)"
138 query.bindValue(
":url", url);
139 QString szTitle = title;
140 if(szTitle.isEmpty())
142 query.bindValue(
":title", szTitle);
143 query.bindValue(
":icon", m_iconDB.
GetIcon(icon));
146 qDebug(log) <<
"Sql:" << query.executedQuery();
147 qDebug(log) <<
"Bound values:" << query.boundValues();
148 bool success = query.exec();
151 SetError(
"Failed to add " + m_szTableName +
": " + url
152 +
"; Error: " + query.lastError().text()
153 +
"; Sql: " + query.executedQuery());
154 qCritical(log) << GetError();
157 nId = query.lastInsertId().toInt();
163bool CDatabaseUrl::DeleteUrl(
const QString &url)
165 if (url.isEmpty())
return false;
167 QSqlQuery query(GetDatabase());
168 query.prepare(
"DELETE from " + m_szTableName +
" WHERE url = :url");
169 query.bindValue(
":url", url);
170 bool bRet = query.exec();
172 SetError(
"Failed to delete " + m_szTableName +
": " + url
173 +
"; Error: " + query.lastError().text()
174 +
"; Sql: " + query.executedQuery());
175 qCritical(log) << GetError();
181bool CDatabaseUrl::DeleteUrl(
int id)
183 if (0 >=
id)
return false;
185 QSqlQuery query(GetDatabase());
187 query.prepare(
"DELETE from " + m_szTableName +
" WHERE id = :id");
188 query.bindValue(
":id",
id);
190 bool success = query.exec();
192 SetError(
"Failed to delete " + m_szTableName +
": " + QString::number(
id)
193 +
"; Error: " + query.lastError().text()
194 +
"; Sql: " + query.executedQuery());
195 qCritical(log) << GetError();
201bool CDatabaseUrl::UpdateUrl(
const QString &url,
const QString &title,
const QIcon &icon)
203 if (url.isEmpty())
return false;
204 if(title.isEmpty() && icon.isNull())
return false;
207 szSql +=
"visit_time=\"" + QDateTime::currentDateTime().toString(Qt::ISODate) +
"\" ";
209 szSql +=
", title=\"" + title +
"\" ";
211 szSql +=
", icon=" + QString::number(m_iconDB.
GetIcon(icon)) +
" ";
214 szSql =
"UPDATE " + m_szTableName +
" SET " + szSql;
215 szSql +=
" WHERE url=\"" + url +
"\"";
217 QSqlQuery query(GetDatabase());
218 bool success = query.exec(szSql);
220 SetError(
"Failed to update url: " + query.lastError().text() +
"; Sql: " + szSql);
221 qCritical(log) << GetError();
227bool CDatabaseUrl::UpdateUrl(
int id,
const QString &title,
const QIcon &icon)
229 if (0 >=
id)
return false;
230 if(title.isEmpty() && icon.isNull())
return false;
233 szSql +=
"visit_time=\"" + QDateTime::currentDateTime().toString(Qt::ISODate) +
"\" ";
235 szSql +=
", title=\"" + title +
"\" ";
237 szSql +=
", icon=" + QString::number(m_iconDB.
GetIcon(icon)) +
" ";
239 szSql =
"UPDATE " + m_szTableName +
" SET " + szSql;
240 szSql +=
" WHERE id = " + QString::number(
id);
242 QSqlQuery query(GetDatabase());
243 query.prepare(szSql);
244 query.bindValue(
":id",
id);
245 bool success = query.exec();
247 SetError(
"Failed to update url: " + query.lastError().text() +
"; Sql: " + szSql);
248 qCritical(log) << GetError();
257 if (0 >=
id)
return item;
259 QSqlQuery query(GetDatabase());
260 query.prepare(
"SELECT url, title, icon, visit_time FROM " + m_szTableName +
262 query.bindValue(
":id",
id);
263 if (query.exec() && query.next()) {
265 item.szUrl = query.value(0).toString();
266 item.szTitle = query.value(1).toString();
267 item.iconId = query.value(2).toInt();
268 item.icon = m_iconDB.
GetIcon(item.iconId);
269 item.visit_time = query.value(3).toDateTime();
277 if (url.isEmpty())
return item;
279 QSqlQuery query(GetDatabase());
280 query.prepare(
"SELECT id, title, icon, visit_time FROM " + m_szTableName +
281 " WHERE url = :url");
282 query.bindValue(
":url", url);
283 if (query.exec() && query.next()) {
285 item.id = query.value(0).toInt();
286 item.szTitle = query.value(1).toString();
287 item.iconId = query.value(2).toInt();
288 item.icon = m_iconDB.
GetIcon(item.iconId);
289 item.visit_time = query.value(3).toDateTime();
294int CDatabaseUrl::GetId(
const QString& url)
296 if (url.isEmpty())
return 0;
297 QSqlQuery query(GetDatabase());
298 bool bRet = query.prepare(
"SELECT id, title, icon FROM " + m_szTableName +
299 " WHERE url = :url");
301 SetError(
"Failed to get id prepare: " + query.lastError().text() +
"; url: " + url);
302 qCritical(log) << GetError();
305 query.bindValue(
":url", url);
308 SetError(
"Failed to get id: " + query.lastError().text()
309 +
"; Sql: " + query.executedQuery() +
"; url: " + url);
310 qCritical(log) << GetError();
313 return query.value(0).toInt();
318QList<int> CDatabaseUrl::GetDomain(
const QString &szDomain)
321 QSqlQuery query(GetDatabase());
322 query.prepare(
"SELECT id FROM " + m_szTableName +
" WHERE url LIKE :url");
323 query.bindValue(
":url", QString(
"%%://%%%1%%").arg(szDomain));
324 bool bRet = query.exec();
326 while(query.next()) {
327 ret << query.value(0).toInt();
330 qCritical(log) <<
"Failed to get domain:"
331 << query.lastError().text()
332 << query.executedQuery();
337QList<CDatabaseUrl::UrlItem> CDatabaseUrl::Search(
const QString &keyword)
339 QList<UrlItem> items;
341 QSqlQuery query(GetDatabase());
342 QString searchPattern =
"%" + keyword +
"%";
344 "SELECT id, url, title, visit_time, icon "
345 "FROM " + m_szTableName +
" "
346 "WHERE url LIKE :pattern OR title LIKE :pattern "
347 "ORDER BY visit_time DESC"
349 query.bindValue(
":pattern", searchPattern);
351 while (query.next()) {
353 item.id = query.value(0).toInt();
354 item.szUrl = query.value(1).toString();
355 item.szTitle = query.value(2).toString();
356 item.visit_time = query.value(3).toDateTime();
357 item.icon = m_iconDB.
GetIcon(query.value(4).toInt());
361 SetError(
"Failed to search:" + query.lastError().text()
362 +
"; Sql: " + query.executedQuery());
363 qCritical(log) << GetError();
369bool CDatabaseUrl::ExportToJson(QJsonObject &obj)
374bool CDatabaseUrl::ImportFromJson(
const QJsonObject &obj)
int GetIcon(const QIcon &icon)
Get icon id
virtual bool OnInitializeDatabase() override
Initialize database
virtual bool OnInitializeDatabase()
Initialize database
bool SetDatabase(const CDatabase *db)
Share an existing database