7#include <QStandardPaths>
12#include <QLoggingCategory>
15#include "BookmarkDatabase.h"
17static Q_LOGGING_CATEGORY(log,
"WebBrowser.Bookmark.DB")
21 , m_TreeDB("bookmarks")
23 qDebug(log) << Q_FUNC_INFO;
26CBookmarkDatabase::~CBookmarkDatabase()
28 qDebug(log) << Q_FUNC_INFO;
35 if(!bRet)
return false;
36 bRet = m_TreeDB.
SetDatabase(GetDatabase(), m_pPara);
37 if(!bRet)
return false;
39 if(m_TreeDB.GetNodeCount() == 0) {
40 m_TreeDB.AddNode(tr(
"Bookmarks"), 0);
41 m_TreeDB.AddNode(tr(
"Other"), 0);
42 m_TreeDB.AddNode(tr(
"Favorites"), 1);
43 m_TreeDB.AddNode(tr(
"Frequently Used Websites"), 1);
48int CBookmarkDatabase::addBookmark(
const BookmarkItem &item)
50 int urlId = m_UrlDB.AddUrl(item.url, item.title, item.icon);
51 auto tree = BookmarkToTree(item);
53 return m_TreeDB.
Add(tree);
56bool CBookmarkDatabase::updateBookmark(
const BookmarkItem &item)
58 bool success = m_UrlDB.UpdateUrl(item.url, item.title, item.icon);
60 qCritical(log) <<
"Failed to update bookmark" << item.url;
63 TreeItem tree = BookmarkToTree(item,
true);
64 success = m_TreeDB.Update(tree);
66 qCritical(log) <<
"Failed to update bookmark" << item.url;
71bool CBookmarkDatabase::deleteBookmark(
int id)
73 return m_TreeDB.Delete(
id);
76bool CBookmarkDatabase::deleteBookmark(
const QList<BookmarkItem> &items)
79 qWarning(log) <<
"The items is empty";
83 foreach(
auto item, items) {
84 lstItems.push_back(item.id);
86 return m_TreeDB.Delete(lstItems);
89bool CBookmarkDatabase::moveBookmark(
int id,
int newFolderId)
91 return m_TreeDB.Move(
id, newFolderId);
94int CBookmarkDatabase::addFolder(
const QString &name,
int parentId)
96 return m_TreeDB.AddNode(name, parentId);
99bool CBookmarkDatabase::renameFolder(
int folderId,
const QString &newName)
101 return m_TreeDB.RenameNode(folderId, newName);
104bool CBookmarkDatabase::deleteFolder(
int folderId)
106 return m_TreeDB.DeleteNode(folderId);
109bool CBookmarkDatabase::moveFolder(
int folderId,
int newParentId)
111 return m_TreeDB.MoveNode(folderId, newParentId);
118 auto leaf = m_TreeDB.GetLeaf(
id);
119 if(leaf.GetId() == 0)
return item;
120 item = TreeToBookmark(leaf);
124QList<BookmarkItem> CBookmarkDatabase::getBookmarkByUrl(
const QString &url)
126 QList<BookmarkItem> lstItems;
129 auto urlItem = m_UrlDB.GetItem(url);
131 foreach(
auto leaf, leaves) {
132 item = TreeToBookmark(leaf, urlItem);
133 lstItems.push_back(item);
138QList<BookmarkItem> CBookmarkDatabase::getAllBookmarks(
int folderId)
140 QList<BookmarkItem> bookmarks;
142 auto leaves = m_TreeDB.
GetLeaves(folderId);
143 foreach(
auto leaf, leaves) {
144 auto item = TreeToBookmark(leaf);
150QList<BookmarkItem> CBookmarkDatabase::searchBookmarks(
const QString &keyword)
152 QList<BookmarkItem> bookmarks;
154 auto urlIds = m_UrlDB.Search(keyword);
155 foreach(
auto urlItem, urlIds) {
159 foreach(
auto t, trees) {
160 auto item = TreeToBookmark(t, urlItem);
170QList<BookmarkItem> CBookmarkDatabase::getAllFolders()
172 QList<BookmarkItem> folders;
174 auto items = m_TreeDB.GetAllNodes();
175 foreach(
auto it, items) {
176 auto book = TreeToBookmark(it);
182QList<BookmarkItem> CBookmarkDatabase::getSubFolders(
int folderId)
184 QList<BookmarkItem> folders;
186 auto items = m_TreeDB.GetSubNodes(folderId);
187 foreach(
auto it, items) {
188 auto book = TreeToBookmark(it);
197 type = tree.type == BookmarkType_Folder ? TreeItem::Node: TreeItem::Leaf;
200 item.SetParentId(tree.folderId);
201 item.SetCreateTime(tree.createdTime);
202 item.SetModifyTime(tree.modifiedTime);
203 item.SetLastVisitTime(tree.lastVisitTime);
204 if(setKey && BookmarkType_Bookmark == tree.type && !tree.url.isEmpty()) {
205 int id = m_UrlDB.GetId(tree.url);
215 item = TreeToBookmark(tree, url);
223 item.id = tree.GetId();
224 item.folderId = tree.GetParentId();
225 item.createdTime = tree.GetCreateTime();
226 item.modifiedTime = tree.GetModifyTime();
227 item.lastVisitTime = tree.GetLastVisitTime();
230 item.type = BookmarkType_Folder;
231 item.title = tree.GetName();
233 item.type = BookmarkType_Bookmark;
234 item.title = url.szTitle;
235 item.url = url.szUrl;
236 item.icon = url.icon;
241bool CBookmarkDatabase::ExportToJson(QJsonObject &obj)
245 bRet = ExportToJson(0, root);
247 obj.insert(
"browser_bookmark", root);
251bool CBookmarkDatabase::ImportFromJson(
const QJsonObject &obj)
254 QJsonArray bookmark = obj[
"browser_bookmark"].toArray();
255 if(bookmark.isEmpty()) {
256 SetError(tr(
"The file format is error. Json without \"browser_bookmark\""));
257 qCritical(log) << GetError();
261 bRet = ImportFromJson(0, bookmark);
265bool CBookmarkDatabase::ImportFromJson(
int parentId,
const QJsonArray &obj)
267 for(
auto it = obj.begin(); it != obj.end(); it++) {
268 QJsonObject itemObj = it->toObject();
269 if(itemObj.isEmpty())
continue;
270 if(BookmarkType::BookmarkType_Folder == itemObj[
"type"].toInt()) {
271 QString szName = itemObj[
"name"].toString();
272 int id = addFolder(szName, parentId);
273 QJsonArray items = itemObj[szName].toArray();
274 if(items.isEmpty())
continue;
275 ImportFromJson(
id, items);
280 item.title = itemObj[
"title"].toString();
281 item.url = itemObj[
"url"].toString();
282 item.folderId = parentId;
285 bool bRet = CDatabaseIcon::ImportIconFromJson(itemObj, icon);
295bool CBookmarkDatabase::ExportToJson(
int parentId, QJsonArray &obj)
297 auto items = getSubFolders(parentId);
298 foreach(
auto item, items) {
300 if(item.isFolder()) {
302 bool bRet = ExportToJson(item.id, aItem);
305 oItem.insert(
"type", item.type);
306 oItem.insert(
"name", item.title);
307 oItem.insert(item.title, aItem);
309 Q_ASSERT_X(
false,
"ExportBookmark",
"The item is not node");
316 items = getAllBookmarks(parentId);
317 foreach(
auto item, items) {
319 if(item.isBookmark()) {
320 oItem.insert(
"type", item.type);
321 oItem.insert(
"title", item.title);
322 oItem.insert(
"url", item.url);
324 bool bRet = CDatabaseIcon::ExportIconToJson(item.getIcon(), oItem);
327 Q_ASSERT_X(
false,
"ExportBookmark",
"The item is not bookmark");
The CBookmarkDatabase class.
bool OnInitializeDatabase() override
Initialize database.
virtual int Add(const TreeItem &item)
Add item.
QList< TreeItem > GetLeavesByKey(int key)
Get leaves.
QList< TreeItem > GetLeaves(int nodeId)
Get the leaves under nodeId.
Provide interfaces such as opening the database and initializing the database.
bool SetDatabase(const CDatabase *db)
Share an existing database.