12#include <QLoggingCategory>
13#include "RecentDatabase.h"
15#include "RabbitCommonDir.h"
17static Q_LOGGING_CATEGORY(log,
"App.Recent.Db")
21 qDebug(log) << Q_FUNC_INFO;
24CRecentDatabase::~CRecentDatabase()
26 qDebug(log) << Q_FUNC_INFO;
30bool CRecentDatabase::OnInitializeDatabase()
33 bRet = CDatabase::OnInitializeDatabase();
34 if(!bRet)
return false;
37 m_IconDB.SetDatabase(GetDatabase(), m_pPara);
38 bRet = m_IconDB.OnInitializeDatabase();
39 if(!bRet)
return bRet;
40 m_FileDB.SetDatabase(GetDatabase(), m_pPara);
41 bRet = m_FileDB.OnInitializeDatabase();
45bool CRecentDatabase::OnInitializeSqliteDatabase()
47 QSqlQuery query(GetDatabase());
50 bool success = query.exec(
51 "CREATE TABLE IF NOT EXISTS recent ("
52 " id INTEGER PRIMARY KEY AUTOINCREMENT,"
53 " operate_id TEXT NOT NULL,"
54 " icon INTEGER DEFAULT 0,"
55 " name TEXT NOT NULL,"
58 " file TEXT UNIQUE NOT NULL,"
59 " time DATETIME DEFAULT CURRENT_TIMESTAMP,"
65 qCritical(log) <<
"Failed to create recent table:" << query.lastError().text();
70 success = query.exec(
"CREATE INDEX IF NOT EXISTS idx_recent_file ON recent(file)");
72 qWarning(log) <<
"Failed to drop index idx_recent_file:"
73 << query.lastError().text()
74 <<
"Sql:" << query.executedQuery();
77 if (!query.exec(
"DROP TRIGGER IF EXISTS delete_icon_after_recent")) {
78 qDebug(log) <<
"Failed to drop trigger delete_icon_after_recent:"
79 << query.lastError().text()
80 <<
"Sql:" << query.executedQuery();
84 CREATE TRIGGER delete_icon_after_recent
85 AFTER DELETE ON recent
92 SELECT 1 FROM favorite WHERE icon = OLD.icon
95 SELECT 1 FROM recent WHERE icon = OLD.icon
99 success = query.exec(szSql);
101 qWarning(log) <<
"Failed to create trigger delete_icon_after_recent."
102 << query.lastError().text()
103 <<
"Sql:" << query.executedQuery();
109bool CRecentDatabase::OnInitializeMySqlDatabase()
111 bool success =
false;
112 QSqlQuery query(GetDatabase());
115 success = query.exec(
116 "CREATE TABLE IF NOT EXISTS recent ("
117 " id INTEGER PRIMARY KEY AUTO_INCREMENT,"
118 " operate_id TEXT NOT NULL,"
119 " icon INTEGER DEFAULT 0,"
120 " name TEXT NOT NULL,"
122 " operate_type TEXT,"
123 " file TEXT NOT NULL,"
124 " time DATETIME DEFAULT CURRENT_TIMESTAMP,"
126 " UNIQUE KEY uk_recent_file (file(255))"
130 qCritical(log) <<
"Failed to create recent table:"
131 << query.lastError().text()
132 <<
"Sql:" << query.executedQuery();
137 if (!query.exec(
"DROP TRIGGER IF EXISTS delete_icon_after_recent")) {
138 qDebug(log) <<
"Failed to drop trigger delete_icon_after_recent:"
139 << query.lastError().text()
140 <<
"Sql:" << query.executedQuery();
144 CREATE TRIGGER delete_icon_after_recent
145 AFTER DELETE ON recent
148 DECLARE favorite_count INT DEFAULT 0;
149 DECLARE recent_count INT DEFAULT 0;
151 IF OLD.icon != 0 THEN
152 -- 统计favorite表中引用该icon的数量
153 SELECT COUNT(*) INTO favorite_count
155 WHERE icon = OLD.icon;
157 -- 统计recent表中引用该icon的数量
158 SELECT COUNT(*) INTO recent_count
160 WHERE icon = OLD.icon;
163 IF favorite_count = 0 AND recent_count = 0 THEN
164 DELETE FROM icon WHERE id = OLD.icon;
169 success = query.exec(szSql);
171 qWarning(log) <<
"Failed to create trigger delete_icon_after_recent."
172 << query.lastError().text()
173 <<
"Sql:" << query.executedQuery();
179int CRecentDatabase::AddRecent(
const RecentItem &item)
181 QSqlQuery query(GetDatabase());
182 if(item.szFile.isEmpty())
185 "SELECT id FROM recent "
188 query.bindValue(
":file", item.szFile);
189 if (query.exec() && query.next()) {
191 int id = query.value(0).toInt();
197 "description=:description "
200 query.bindValue(
":name", item.szName);
201 query.bindValue(
":time", item.time);
202 query.bindValue(
":description", item.szDescription);
203 query.bindValue(
":id",
id);
206 "INSERT INTO recent (operate_id, icon, name, protocol, operate_type, file, time, description)"
207 "VALUES (:operate_id, :icon, :name, :protocol, :type, :file, :time, :description)"
209 query.bindValue(
":operate_id", item.szOperateId);
210 query.bindValue(
":icon", m_IconDB.
GetIcon(item.icon));
211 query.bindValue(
":name", item.szName);
212 query.bindValue(
":protocol", item.szProtocol);
213 query.bindValue(
":type", item.szType);
214 query.bindValue(
":file", item.szFile);
215 query.bindValue(
":time", item.time);
216 query.bindValue(
":description", item.szDescription);
218 bool success = query.exec();
220 qCritical(log) <<
"Failed to add recent:" << query.lastError().text();
224 qDebug(log) <<
"Insert recent id:" << query.lastInsertId().toInt();
226 return query.lastInsertId().toInt();
229bool CRecentDatabase::UpdateRecent(
230 const QString &szFile,
const QString& szName,
const QString& szDescription)
232 QSqlQuery query(GetDatabase());
237 "description=:description "
240 query.bindValue(
":name", szName);
241 query.bindValue(
":file", szFile);
242 query.bindValue(
":description", szDescription);
244 bool success = query.exec();
246 qCritical(log) <<
"Failed to update recent:" << query.lastError().text();
252bool CRecentDatabase::DeleteRecent(
int id)
254 if(0 >=
id)
return false;
255 QSqlQuery query(GetDatabase());
256 query.prepare(
"DELETE FROM recent WHERE id=:id");
257 query.bindValue(
":id",
id);
258 bool success = query.exec();
260 qCritical(log) <<
"Failed to delete recent id:"
261 <<
id << query.lastError().text();
266QList<CRecentDatabase::RecentItem> CRecentDatabase::GetRecents(
int limit,
int offset)
268 QList<RecentItem> items;
270 QSqlQuery query(GetDatabase());
273 "SELECT id, operate_id, icon, name, protocol, operate_type, file, time, description "
275 "ORDER BY time DESC "
279 "SELECT id, operate_id, icon, name, protocol, operate_type, file, time, description "
281 "ORDER BY time DESC "
282 "LIMIT :limit OFFSET :offset"
284 query.bindValue(
":limit", limit);
285 query.bindValue(
":offset", offset);
288 while (query.next()) {
290 item.id = query.value(0).toInt();
291 item.szOperateId = query.value(1).toString();
292 item.icon = m_IconDB.
GetIcon(query.value(2).toInt());
293 item.szName = query.value(3).toString();
294 item.szProtocol = query.value(4).toString();
295 item.szType = query.value(5).toString();
296 item.szFile = query.value(6).toString();
297 item.time = query.value(7).toDateTime();
298 item.szDescription = query.value(8).toString();
302 qCritical(log) <<
"Failed to get recents:" << query.lastError().text();
308bool CRecentDatabase::ExportToJson(QJsonObject &obj)
311 auto items = GetRecents();
312 foreach(
auto it, items) {
315 bool bRet = CDatabaseFile::ExportFileToJson(it.szFile, itemObj);
318 itemObj.insert(
"OperateId", it.szOperateId);
320 bRet = CDatabaseIcon::ExportIconToJson(it.icon, itemObj);
323 itemObj.insert(
"Name", it.szName);
324 itemObj.insert(
"Protocol", it.szProtocol);
325 itemObj.insert(
"Type", it.szType);
326 itemObj.insert(
"Time", it.time.toString());
327 itemObj.insert(
"Description", it.szDescription);
329 recents.append(itemObj);
331 if(recents.isEmpty())
333 obj.insert(
"Recent", recents);
337bool CRecentDatabase::ImportFromJson(
const QJsonObject &obj)
339 QJsonArray recents = obj[
"Recent"].toArray();
340 if(recents.isEmpty()){
341 qCritical(log) <<
"The file format is error. Don't find recents";
345 for(
auto it = recents.begin(); it != recents.end(); it++) {
346 QJsonObject itemObj = it->toObject();
349 bool bRet = m_FileDB.ImportFileToDatabaseFromJson(itemObj, item.szFile);
353 QSqlQuery query(GetDatabase());
355 "SELECT id FROM recent "
358 query.bindValue(
":file", item.szFile);
359 if (query.exec() && query.next()) {
363 bRet = CDatabaseIcon::ImportIconFromJson(itemObj, item.icon);
366 item.szOperateId = itemObj[
"OperateId"].toString();
367 item.szName = itemObj[
"Name"].toString();
368 item.szProtocol = itemObj[
"Protocol"].toString();
369 item.szType = itemObj[
"Type"].toString();
371 item.time = QDateTime::fromString(itemObj[
"Time"].toString());
372 if(!item.time.isValid())
373 item.time = QDateTime::currentDateTime();
375 item.szDescription = itemObj[
"Description"].toString();
int GetIcon(const QIcon &icon)
Get icon id