Rabbit Remote Control 0.1.0-bate8
Loading...
Searching...
No Matches
BookmarkDatabase.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QSqlDatabase>
4#include <QSqlQuery>
5#include <QSqlError>
6#include <QMessageBox>
7#include <QStandardPaths>
8#include <QDir>
9#include <QDebug>
10#include <QFile>
11#include <QTextStream>
12#include <QLoggingCategory>
13#include <QJsonArray>
14
15#include "BookmarkDatabase.h"
16
17static Q_LOGGING_CATEGORY(log, "WebBrowser.Bookmark.DB")
18
20 : CDatabase(parent)
21 , m_TreeDB("bookmarks")
22{
23 qDebug(log) << Q_FUNC_INFO;
24}
25
26CBookmarkDatabase::~CBookmarkDatabase()
27{
28 qDebug(log) << Q_FUNC_INFO;
29}
30
32{
33 bool bRet = false;
34 bRet = m_UrlDB.SetDatabase(GetDatabase(), m_pPara);
35 if(!bRet) return false;
36 bRet = m_TreeDB.SetDatabase(GetDatabase(), m_pPara);
37 if(!bRet) return false;
38
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);
44 }
45 return true;
46}
47
48int CBookmarkDatabase::addBookmark(const BookmarkItem &item)
49{
50 int urlId = m_UrlDB.AddUrl(item.url, item.title, item.icon);
51 auto tree = BookmarkToTree(item);
52 tree.SetKey(urlId);
53 return m_TreeDB.Add(tree);
54}
55
56bool CBookmarkDatabase::updateBookmark(const BookmarkItem &item)
57{
58 bool success = m_UrlDB.UpdateUrl(item.url, item.title, item.icon);
59 if(!success) {
60 qCritical(log) << "Failed to update bookmark" << item.url;
61 return false;
62 }
63 TreeItem tree = BookmarkToTree(item, true);
64 success = m_TreeDB.Update(tree);
65 if(!success) {
66 qCritical(log) << "Failed to update bookmark" << item.url;
67 }
68 return success;
69}
70
71bool CBookmarkDatabase::deleteBookmark(int id)
72{
73 return m_TreeDB.Delete(id);
74}
75
76bool CBookmarkDatabase::deleteBookmark(const QList<BookmarkItem> &items)
77{
78 if(items.isEmpty()) {
79 qWarning(log) << "The items is empty";
80 return false;
81 }
82 QList<int> lstItems;
83 foreach(auto item, items) {
84 lstItems.push_back(item.id);
85 }
86 return m_TreeDB.Delete(lstItems);
87}
88
89bool CBookmarkDatabase::moveBookmark(int id, int newFolderId)
90{
91 return m_TreeDB.Move(id, newFolderId);
92}
93
94int CBookmarkDatabase::addFolder(const QString &name, int parentId)
95{
96 return m_TreeDB.AddNode(name, parentId);
97}
98
99bool CBookmarkDatabase::renameFolder(int folderId, const QString &newName)
100{
101 return m_TreeDB.RenameNode(folderId, newName);
102}
103
104bool CBookmarkDatabase::deleteFolder(int folderId)
105{
106 return m_TreeDB.DeleteNode(folderId);
107}
108
109bool CBookmarkDatabase::moveFolder(int folderId, int newParentId)
110{
111 return m_TreeDB.MoveNode(folderId, newParentId);
112}
113
114BookmarkItem CBookmarkDatabase::getBookmark(int id)
115{
116 BookmarkItem item(BookmarkType_Bookmark);
117
118 auto leaf = m_TreeDB.GetLeaf(id);
119 if(leaf.GetId() == 0) return item;
120 item = TreeToBookmark(leaf);
121 return item;
122}
123
124QList<BookmarkItem> CBookmarkDatabase::getBookmarkByUrl(const QString &url)
125{
126 QList<BookmarkItem> lstItems;
127 BookmarkItem item(BookmarkType_Bookmark);
128
129 auto urlItem = m_UrlDB.GetItem(url);
130 auto leaves = m_TreeDB.GetLeavesByKey(urlItem.id);
131 foreach(auto leaf, leaves) {
132 item = TreeToBookmark(leaf, urlItem);
133 lstItems.push_back(item);
134 }
135 return lstItems;
136}
137
138QList<BookmarkItem> CBookmarkDatabase::getAllBookmarks(int folderId)
139{
140 QList<BookmarkItem> bookmarks;
141
142 auto leaves = m_TreeDB.GetLeaves(folderId);
143 foreach(auto leaf, leaves) {
144 auto item = TreeToBookmark(leaf);
145 bookmarks << item;
146 }
147 return bookmarks;
148}
149
150QList<BookmarkItem> CBookmarkDatabase::searchBookmarks(const QString &keyword)
151{
152 QList<BookmarkItem> bookmarks;
153
154 auto urlIds = m_UrlDB.Search(keyword);
155 foreach(auto urlItem, urlIds) {
156 if(0 == urlItem.id)
157 continue;
158 auto trees = m_TreeDB.GetLeavesByKey(urlItem.id);
159 foreach(auto t, trees) {
160 auto item = TreeToBookmark(t, urlItem);
161 if(0 == item.id)
162 continue;
163 bookmarks << item;
164 }
165 }
166
167 return bookmarks;
168}
169
170QList<BookmarkItem> CBookmarkDatabase::getAllFolders()
171{
172 QList<BookmarkItem> folders;
173
174 auto items = m_TreeDB.GetAllNodes();
175 foreach(auto it, items) {
176 auto book = TreeToBookmark(it);
177 folders << book;
178 }
179 return folders;
180}
181
182QList<BookmarkItem> CBookmarkDatabase::getSubFolders(int folderId)
183{
184 QList<BookmarkItem> folders;
185
186 auto items = m_TreeDB.GetSubNodes(folderId);
187 foreach(auto it, items) {
188 auto book = TreeToBookmark(it);
189 folders << book;
190 }
191 return folders;
192}
193
194TreeItem CBookmarkDatabase::BookmarkToTree(const BookmarkItem& tree, bool setKey)
195{
196 TreeItem::TYPE type;
197 type = tree.type == BookmarkType_Folder ? TreeItem::Node: TreeItem::Leaf;
198 TreeItem item(type);
199 item.SetId(tree.id);
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);
206 item.SetKey(id);
207 }
208 return item;
209}
210
211BookmarkItem CBookmarkDatabase::TreeToBookmark(const TreeItem& tree)
212{
213 BookmarkItem item(BookmarkType_Bookmark);
214 CDatabaseUrl::UrlItem url = m_UrlDB.GetItem(tree.GetKey());
215 item = TreeToBookmark(tree, url);
216 return item;
217}
218
219BookmarkItem CBookmarkDatabase::TreeToBookmark(
220 const TreeItem& tree, const CDatabaseUrl::UrlItem& url)
221{
222 BookmarkItem item(BookmarkType_Bookmark);
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();
228
229 if(tree.IsNode()) {
230 item.type = BookmarkType_Folder;
231 item.title = tree.GetName();
232 } else {
233 item.type = BookmarkType_Bookmark;
234 item.title = url.szTitle;
235 item.url = url.szUrl;
236 item.icon = url.icon;
237 }
238 return item;
239}
240
241bool CBookmarkDatabase::ExportToJson(QJsonObject &obj)
242{
243 bool bRet = true;
244 QJsonArray root;
245 bRet = ExportToJson(0, root);
246 if(bRet)
247 obj.insert("browser_bookmark", root);
248 return bRet;
249}
250
251bool CBookmarkDatabase::ImportFromJson(const QJsonObject &obj)
252{
253 bool bRet = false;
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();
258 return false;
259 }
260
261 bRet = ImportFromJson(0, bookmark);
262 return bRet;
263}
264
265bool CBookmarkDatabase::ImportFromJson(int parentId, const QJsonArray &obj)
266{
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);
276 continue;
277 }
278
279 BookmarkItem item(BookmarkType::BookmarkType_Bookmark);
280 item.title = itemObj["title"].toString();
281 item.url = itemObj["url"].toString();
282 item.folderId = parentId;
283
284 QIcon icon;
285 bool bRet = CDatabaseIcon::ImportIconFromJson(itemObj, icon);
286 if(!bRet) continue;
287 item.icon =icon;
288
289 addBookmark(item);
290 }
291
292 return true;
293}
294
295bool CBookmarkDatabase::ExportToJson(int parentId, QJsonArray &obj)
296{
297 auto items = getSubFolders(parentId);
298 foreach(auto item, items) {
299 QJsonObject oItem;
300 if(item.isFolder()) {
301 QJsonArray aItem;
302 bool bRet = ExportToJson(item.id, aItem);
303 if(!bRet) continue;
304
305 oItem.insert("type", item.type);
306 oItem.insert("name", item.title);
307 oItem.insert(item.title, aItem);
308 } else {
309 Q_ASSERT_X(false, "ExportBookmark", "The item is not node");
310 continue;
311 }
312
313 obj.append(oItem);
314 }
315
316 items = getAllBookmarks(parentId);
317 foreach(auto item, items) {
318 QJsonObject oItem;
319 if(item.isBookmark()) {
320 oItem.insert("type", item.type);
321 oItem.insert("title", item.title);
322 oItem.insert("url", item.url);
323 // Icon
324 bool bRet = CDatabaseIcon::ExportIconToJson(item.getIcon(), oItem);
325 if(!bRet) continue;
326 } else {
327 Q_ASSERT_X(false, "ExportBookmark", "The item is not bookmark");
328 continue;
329 }
330 obj.append(oItem);
331 }
332 return true;
333}
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.
Definition Database.h:21
bool SetDatabase(const CDatabase *db)
Share an existing database.
Definition Database.cpp:34