8#include <QLoggingCategory>
10#include "DatabaseTree.h"
12static Q_LOGGING_CATEGORY(log,
"DB.Tree")
17 m_Data.m_ParentId = 0;
18 m_Data.m_SortOrder = 0;
21TreeItem::TreeItem(
const TreeItem &item)
32bool TreeItem::IsNode()
const
34 return Node == GetType();
37bool TreeItem::IsLeaf()
const
39 return Leaf == GetType();
42TreeItem::TYPE TreeItem::GetType()
const
47void TreeItem::SetType(TYPE type)
52int TreeItem::GetId()
const
57void TreeItem::SetId(
int newId)
62QString TreeItem::GetName()
const
64 return m_Data.m_szName;
67void TreeItem::SetName(
const QString &newName)
69 m_Data.m_szName = newName;
72int TreeItem::GetParentId()
const
74 return m_Data.m_ParentId;
77void TreeItem::SetParentId(
int newParentId)
79 m_Data.m_ParentId = newParentId;
82int TreeItem::GetSortOrder()
const
84 return m_Data.m_SortOrder;
87void TreeItem::SetSortOrder(
int newSortOrder)
89 m_Data.m_SortOrder = newSortOrder;
92int TreeItem::GetKey()
const
97void TreeItem::SetKey(
int newNKey)
99 m_Data.m_nKey = newNKey;
102QDateTime TreeItem::GetCreateTime()
const
104 return m_Data.m_CreateTime;
107void TreeItem::SetCreateTime(
const QDateTime &newCreateTime)
109 m_Data.m_CreateTime = newCreateTime;
112QDateTime TreeItem::GetModifyTime()
const
114 return m_Data.m_ModifyTime;
117void TreeItem::SetModifyTime(
const QDateTime &newModifyTime)
119 m_Data.m_ModifyTime = newModifyTime;
122QDateTime TreeItem::GetLastVisitTime()
const
124 return m_Data.m_LastVisitTime;
127void TreeItem::SetLastVisitTime(
const QDateTime &newLastVisitTime)
129 m_Data.m_LastVisitTime = newLastVisitTime;
132CDatabaseNode::CDatabaseNode(
const QString &szPrefix, QObject *parent)
135 m_szTableName =
"folders";
136 if(!szPrefix.isEmpty())
137 m_szTableName = szPrefix +
"_" + m_szTableName;
138 m_szConnectName =
"connect_" + m_szTableName;
141bool CDatabaseNode::OnInitializeSqliteDatabase()
143 QSqlQuery query(GetDatabase());
146 query.exec(
"PRAGMA foreign_keys = ON");
148 "CREATE TABLE IF NOT EXISTS "
151 " id INTEGER PRIMARY KEY AUTOINCREMENT,"
152 " name TEXT NOT NULL,"
153 " parent_id INTEGER DEFAULT 0,"
154 " sort_order INTEGER DEFAULT 0,"
155 " created_time DATETIME DEFAULT CURRENT_TIMESTAMP"
158 bool bRet = query.exec(szSql);
160 SetError(
"Failed to create folders sqlite table: "
161 + query.lastError().text()
162 +
"; Sql: " + szSql);
163 qCritical(log) << GetError();
168 szSql =
"CREATE INDEX IF NOT EXISTS idx_" + m_szTableName +
"_parent ON " + m_szTableName +
"(parent_id)";
169 bRet = query.exec(szSql);
171 qDebug(log) <<
"Failed to create index idx_" + m_szTableName +
"_parent:" << query.lastError().text()
172 <<
"; Sql: " + szSql;
177bool CDatabaseNode::OnInitializeMySqlDatabase()
179 QSqlQuery query(GetDatabase());
182 query.exec(
"PRAGMA foreign_keys = ON");
186 "CREATE TABLE IF NOT EXISTS "
189 " id INTEGER PRIMARY KEY AUTO_INCREMENT,"
190 " name TEXT NOT NULL,"
191 " parent_id INTEGER DEFAULT 0,"
192 " sort_order INTEGER DEFAULT 0,"
193 " created_time DATETIME DEFAULT CURRENT_TIMESTAMP,"
194 " INDEX idx_parent (parent_id),"
195 " INDEX idx_parent_sort (parent_id, sort_order)"
197 bool bRet = query.exec(szSql);
199 qCritical(log) <<
"Failed to create folders mysql table:"
200 << m_szTableName << query.lastError().text()
208int CDatabaseNode::AddNode(
const QString &name,
int parentId)
211 QSqlQuery query(GetDatabase());
214 query.prepare(
"SELECT id FROM `" + m_szTableName +
"` "
215 " WHERE `parent_id` = :parent_id "
218 query.bindValue(
":parent_id", parentId);
219 query.bindValue(
":name", name);
222 SetError(
"Failed to add folders: " + query.lastError().text()
223 +
"; Sql: " + query.executedQuery());
224 qCritical(log) << GetError();
228 return query.value(0).toInt();
232 query.prepare(
"SELECT MAX(sort_order) FROM `" + m_szTableName +
"` "
233 " WHERE `parent_id` = :parent_id");
234 query.bindValue(
":parent_id", parentId);
237 SetError(
"Failed to get max sort_order: " + query.lastError().text()
238 +
"; Sql: " + query.executedQuery());
239 qCritical(log) << GetError();
244 maxOrder = query.value(0).toInt() + 1;
248 "INSERT INTO `" + m_szTableName +
"` "
249 " (`name`, `parent_id`, `sort_order`) "
250 " VALUES (:name, :parent_id, :sort_order) "
252 query.bindValue(
":name", name);
253 query.bindValue(
":parent_id", parentId);
254 query.bindValue(
":sort_order", maxOrder);
259 id = query.lastInsertId().toInt();
261 emit sigAddNode(
id, parentId);
265 SetError(
"Failed to add folders: " + query.lastError().text()
266 +
"; Sql: " + query.executedQuery());
267 qCritical(log) << GetError();
273bool CDatabaseNode::RenameNode(
int id,
const QString &newName)
275 QSqlQuery query(GetDatabase());
276 query.prepare(
"UPDATE `" + m_szTableName +
"` "
277 " SET `name` = :name WHERE `id` = :id");
278 query.bindValue(
":id",
id);
279 query.bindValue(
":name", newName);
280 bool bRet = query.exec();
284 SetError(
"Failed to rename folders: " + query.lastError().text()
285 +
"; Sql: " + query.executedQuery());
286 qCritical(log) << GetError();
291bool CDatabaseNode::DeleteNode(
292 int id, std::function<
bool (
int)> cbDeleteLeaf,
bool checkReturn)
296 auto folders = GetSubNodes(
id);
297 foreach(
auto f, folders) {
298 bRet = DeleteNode(f.GetId(), cbDeleteLeaf, checkReturn);
299 if(checkReturn && !bRet)
305 bRet = cbDeleteLeaf(
id);
306 if(checkReturn && !bRet) {
307 SetError(
"Failed to call cbDeleteLeaf");
308 qCritical(log) << GetError();
313 bRet = OnDeleteLeafs(
id);
314 if(checkReturn && !bRet) {
315 SetError(
"Failed to call OnDeleteLeafs");
316 qCritical(log) << GetError();
321 QSqlQuery query(GetDatabase());
322 query.prepare(
"DELETE FROM `" + m_szTableName +
"` WHERE `id` = :id");
323 query.bindValue(
":id",
id);
328 SetError(
"Failed to delete folders: " + query.lastError().text()
329 +
"; Sql: " + query.executedQuery());
330 qCritical(log) << GetError();
336bool CDatabaseNode::OnDeleteLeafs(
int id)
342bool CDatabaseNode::MoveNode(
int id,
int newParentId)
344 if(
id == newParentId) {
345 SetError(
"Failed to move node. The same node: " +
id);
346 qWarning(log) << GetError();
350 bool bRet = InSubNode(
id, newParentId);
352 SetError(
"The id is the parent of newParentId. "
353 + QString::number(
id) +
" is the parent of "
354 + QString::number(newParentId));
355 qWarning(log) << GetError();
358 QSqlQuery query(GetDatabase());
359 query.prepare(
"UPDATE `" + m_szTableName +
"` "
360 " SET `parent_id` = :parent_id WHERE `id` = :id");
361 query.bindValue(
":id",
id);
362 query.bindValue(
":parent_id", newParentId);
367 SetError(
"Failed to move folders: " + query.lastError().text()
368 +
"; Sql: " + query.executedQuery());
369 qCritical(log) << GetError();
374TreeItem CDatabaseNode::GetNode(
int id)
377 if(0 >=
id)
return folder;
378 QSqlQuery query(GetDatabase());
380 "SELECT `id`, `name`, `parent_id`, `sort_order`, `created_time` "
381 "FROM `" + m_szTableName +
"` "
384 query.bindValue(
":id",
id);
387 folder.SetId(query.value(0).toInt());
388 folder.SetName(query.value(1).toString());
389 folder.SetParentId(query.value(2).toInt());
390 folder.SetSortOrder(query.value(3).toInt());
391 folder.SetCreateTime(query.value(4).toDateTime());
394 SetError(
"Failed to get folder: " + query.lastError().text()
395 +
"; Sql: " + query.executedQuery() + QString::number(
id));
396 qCritical(log) << GetError();
401QList<TreeItem> CDatabaseNode::GetAllNodes()
403 QList<TreeItem> folders;
404 QSqlQuery query(GetDatabase());
406 "SELECT `id`, `name`, `parent_id`, `sort_order`, `created_time` "
407 " FROM `" + m_szTableName +
"` "
408 " ORDER BY `parent_id`, `sort_order`, `name`"
411 while (query.next()) {
413 folder.SetId(query.value(0).toInt());
414 folder.SetName(query.value(1).toString());
415 folder.SetParentId(query.value(2).toInt());
416 folder.SetSortOrder(query.value(3).toInt());
417 folder.SetCreateTime(query.value(4).toDateTime());
418 folders.append(folder);
421 SetError(
"Failed to get all folders: " + query.lastError().text()
422 +
"; Sql: " + query.executedQuery());
423 qCritical(log) << GetError();
429QList<TreeItem> CDatabaseNode::GetSubNodes(
int parentId)
431 QList<TreeItem> folders;
433 QSqlQuery query(GetDatabase());
435 "SELECT `id`, `name`, `parent_id`, `sort_order`, `created_time` "
436 "FROM `" + m_szTableName +
"` "
437 "WHERE `parent_id` = :parent_id "
438 "ORDER BY `sort_order`, `name`"
440 query.bindValue(
":parent_id", parentId);
442 while (query.next()) {
444 folder.SetId(query.value(0).toInt());
445 folder.SetName(query.value(1).toString());
446 folder.SetParentId(query.value(2).toInt());
447 folder.SetSortOrder(query.value(3).toInt());
448 folder.SetCreateTime(query.value(4).toDateTime());
449 folders.append(folder);
452 SetError(
"Failed to get sub folders: " + query.lastError().text()
453 +
"; Sql: " + query.executedQuery()
454 +
"; parentId: " + QString::number(parentId));
455 qCritical(log) << GetError();
461bool CDatabaseNode::InSubNode(
int parentId,
int id)
464 auto items = GetSubNodes(parentId);
465 foreach(
auto it, items) {
468 bRet = InSubNode(it.GetId(),
id);
469 if(bRet)
return true;
476 QSqlQuery query(GetDatabase());
478 query.prepare(
"SELECT COUNT(*) FROM `" + m_szTableName +
"`");
480 query.prepare(
"SELECT COUNT(*) FROM `" + m_szTableName +
"` WHERE `parent_id`=:id");
481 query.bindValue(
":id", parentId);
485 return query.value(0).toInt();
487 SetError(
"Failed to get count: " + query.lastError().text()
488 +
"; parentId: " + QString::number(parentId));
489 qCritical(log) << GetError();
494bool CDatabaseNode::ExportToJson(QJsonObject& obj)
496 QSqlQuery query(GetDatabase());
498 "SELECT `id`, `name`, `parent_id`, `sort_order`, `created_time` "
499 "FROM `" + m_szTableName +
"` "
501 bool success = query.exec();
503 SetError(
"Failed to export folder to json: " + query.lastError().text()
504 +
"; Sql: " + query.executedQuery());
505 qCritical(log) << GetError();
509 while(query.next()) {
511 f.insert(
"id", query.value(0).toInt());
512 f.insert(
"name", query.value(1).toString());
513 f.insert(
"parent_id", query.value(2).toInt());
514 f.insert(
"sort_order", query.value(3).toInt());
515 f.insert(
"created_time", query.value(4).toDateTime().toString());
518 if(!folder.isEmpty())
519 obj.insert(
"folder", folder);
523bool CDatabaseNode::ImportFromJson(
const QJsonObject& obj)
528CDatabaseTree::CDatabaseTree(
const QString &szPrefix, QObject *parent)
530 , m_FolderDB(szPrefix)
532 m_szTableName =
"tree";
533 if(!szPrefix.isEmpty())
534 m_szTableName = szPrefix +
"_" + m_szTableName;
535 m_szConnectName =
"connect_" + m_szTableName;
543 if(!bRet)
return false;
544 bRet = m_FolderDB.
SetDatabase(GetDatabase(), m_pPara);
545 if(!bRet)
return false;
546 bRet = connect(&m_FolderDB, &CDatabaseNode::sigAddNode,
547 this, &CDatabaseTree::sigAddNode);
553bool CDatabaseTree::OnInitializeSqliteDatabase()
555 QSqlQuery query(GetDatabase());
558 query.exec(
"PRAGMA foreign_keys = ON");
561 "CREATE TABLE IF NOT EXISTS `" + m_szTableName +
"` (" +
562 " `id` INTEGER PRIMARY KEY AUTOINCREMENT,"
563 " `parent_id` INTEGER DEFAULT 0,"
565 " `key` INTEGER DEFAULT 0,"
566 " `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP,"
567 " `modified_time` DATETIME DEFAULT CURRENT_TIMESTAMP,"
568 " `last_visit_time` DATETIME"
570 bool bRet = query.exec(szSql);
572 SetError(
"Failed to create tree sqlite table: " + query.lastError().text()
573 +
"; Sql: " + szSql);
574 qCritical(log) << GetError();
579 query.exec(
"CREATE INDEX IF NOT EXISTS `idx_" + m_szTableName +
"_key` ON " + m_szTableName +
"(`key`)");
580 query.exec(
"CREATE INDEX IF NOT EXISTS `idx_" + m_szTableName +
"_parent_id` ON " + m_szTableName +
"(`parent_id`)");
585bool CDatabaseTree::OnInitializeMySqlDatabase()
587 QSqlQuery query(GetDatabase());
590 query.exec(
"PRAGMA foreign_keys = ON");
593 "CREATE TABLE IF NOT EXISTS `" + m_szTableName +
"` (" +
594 " `id` INTEGER PRIMARY KEY AUTO_INCREMENT,"
595 " `parent_id` INTEGER DEFAULT 0,"
597 " `key` INTEGER DEFAULT 0,"
598 " `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP,"
599 " `modified_time` DATETIME DEFAULT CURRENT_TIMESTAMP,"
600 " `last_visit_time` DATETIME,"
601 " INDEX `idx_key` (`key`),"
602 " INDEX `idx_parent_id` (`parent_id`)"
604 bool bRet = query.exec(szSql);
606 SetError(
"Failed to create tree mysql table: " + query.lastError().text()
607 +
"; Sql: " + szSql);
608 qCritical(log) << GetError();
620 qCritical(log) <<
"The item is not leaf";
624 QSqlQuery query(GetDatabase());
628 "SELECT `id` FROM `" + m_szTableName +
"` "
629 " WHERE `key`=:key AND `parent_id`=:parent_id"
631 query.bindValue(
":key", item.GetKey());
632 query.bindValue(
":parent_id", item.GetParentId());
635 SetError(
"Failed to add tree: " + query.lastError().text()
636 +
"; Sql: " + query.executedQuery());
637 qCritical(log) << GetError();
641 return query.value(0).toInt();
646 "INSERT INTO `" + m_szTableName +
"` (`name`, `key`, "
647 "`created_time`, `modified_time`, `last_visit_time`, `parent_id`) "
648 "VALUES (:name, :key, "
649 ":created_time, :modified_time, :last_visit_time, :parent_id)"
651 query.bindValue(
":name", item.GetName());
652 query.bindValue(
":key", item.GetKey());
653 QDateTime time = QDateTime::currentDateTime();
654 query.bindValue(
":created_time", time);
655 query.bindValue(
":modified_time", time);
656 query.bindValue(
":last_visit_time", time);
657 query.bindValue(
":parent_id", item.GetParentId());
659 bool bRet = query.exec();
661 SetError(
"Failed to add tree item: " + query.lastError().text()
662 +
"; Sql: " + query.executedQuery());
663 qCritical(log) << GetError();
667 int id = query.lastInsertId().toInt();
669 emit sigAdd(
id, item.GetParentId());
673bool CDatabaseTree::Update(
const TreeItem &item)
677 qCritical(log) <<
"The item is not leaf";
681 QSqlQuery query(GetDatabase());
683 "UPDATE `" + m_szTableName +
"` SET "
686 "`created_time` = :created_time, "
687 "`modified_time` = :modified_time, "
688 "`last_visit_time` = :last_visit_time, "
689 "`parent_id` = :parent_id "
692 query.bindValue(
":name", item.GetName());
693 query.bindValue(
":key", item.GetKey());
694 query.bindValue(
":created_time", item.GetCreateTime());
695 query.bindValue(
":modified_time", QDateTime::currentDateTime());
696 query.bindValue(
":last_visit_time", item.GetLastVisitTime());
697 query.bindValue(
":parent_id", item.GetParentId());
698 query.bindValue(
":id", item.GetId());
699 qDebug(log) <<
"Sql:" << query.executedQuery();
700 qDebug(log) <<
"Bound value:" << query.boundValues();
701 bool bRet = query.exec();
703 SetError(
"Failed to update tree item: " + query.lastError().text()
704 +
"; Sql: " + query.executedQuery());
705 qCritical(log) << GetError();
710bool CDatabaseTree::Delete(
int id,
bool delKey)
714 auto leaf = GetLeaf(
id);
715 if(leaf.GetKey() > 0) {
717 if(leaves.count() == 1) {
718 bool ok = OnDeleteKey(leaf.GetKey());
724 QSqlQuery query(GetDatabase());
725 query.prepare(
"DELETE FROM `" + m_szTableName +
"` WHERE `id` = :id");
726 query.bindValue(
":id",
id);
727 bool bRet = query.exec();
729 SetError(
"Failed to delete item: " + query.lastError().text()
730 +
"; Sql: " + query.executedQuery()
731 +
"; table: " + m_szTableName
732 +
"; id: " + QString::number(
id));
733 qCritical(log) << GetError();
738bool CDatabaseTree::Delete(QList<int> items,
bool delKey)
740 if(items.isEmpty())
return false;
743 foreach(
auto id, items) {
745 auto leaf = GetLeaf(
id);
746 if(leaf.GetKey() > 0) {
748 if(leaves.count() == 1) {
749 bool ok = OnDeleteKey(leaf.GetKey());
757 QSqlQuery query(GetDatabase());
758 QString szSql =
"DELETE FROM `" + m_szTableName +
"` WHERE ";
760 foreach(
auto id, items) {
763 szSql +=
" `id` = " + QString::number(
id);
765 szSql +=
" OR `id` = " + QString::number(
id);
768 bool success = query.exec(szSql);
770 SetError(
"Failed to delete item: " + query.lastError().text()
771 +
"; Sql: " + query.executedQuery());
772 qCritical(log) << GetError();
778bool CDatabaseTree::DeleteChild(
int parentId,
bool delKey)
782 foreach(
auto leaf, leaves) {
783 if(!Delete(leaf.GetId(), delKey))
788 QSqlQuery query(GetDatabase());
789 query.prepare(
"DELETE FROM `" + m_szTableName +
"` WHERE `parent_id` = :parent_id");
790 query.bindValue(
":parent_id", parentId);
791 bool success = query.exec();
793 SetError(
"Failed to delete child item:" + query.lastError().text()
794 +
"; Sql: " + query.executedQuery());
795 qCritical(log) << GetError();
801bool CDatabaseTree::Move(
int id,
int newParent)
803 QSqlQuery query(GetDatabase());
805 "UPDATE `" + m_szTableName +
"` SET "
806 "`parent_id` = :parent_id WHERE `id` = :id");
807 query.bindValue(
":parent_id", newParent);
808 query.bindValue(
":id",
id);
809 bool bRet = query.exec();
811 SetError(
"Failed to add tree item: " + query.lastError().text()
812 +
"; Sql: " + query.executedQuery());
813 qCritical(log) << GetError();
818TreeItem CDatabaseTree::GetLeaf(
int id)
822 QSqlQuery query(GetDatabase());
824 "SELECT `name`, `key`, `created_time`, `modified_time`, `last_visit_time`, `parent_id` "
825 " FROM `" + m_szTableName +
"` "
826 " WHERE `id` = :id");
827 query.bindValue(
":id",
id);
828 bool bRet = query.exec();
831 =
"Failed to get leaf: " + query.lastError().text()
832 +
"; Sql: " + query.executedQuery()
833 +
"; id: " + QString::number(
id);
835 qCritical(log) << GetError();
841 item.SetName(query.value(0).toString());
842 item.SetKey(query.value(1).toInt());
843 item.SetCreateTime(query.value(2).toDateTime());
844 item.SetModifyTime(query.value(3).toDateTime());
845 item.SetLastVisitTime(query.value(4).toDateTime());
846 item.SetParentId(query.value(5).toInt());
854 QList<TreeItem> items;
855 QSqlQuery query(GetDatabase());
857 szSql =
"SELECT `id`, `name`, `key`, "
858 "`created_time`, `modified_time`, `last_visit_time`, `parent_id` "
859 "FROM `" + m_szTableName +
"`";
861 szSql +=
" WHERE `parent_id` = :parent_id";
862 query.prepare(szSql);
863 query.bindValue(
":parent_id", nodeId);
864 bool bRet = query.exec();
866 SetError(
"Failed to get leaves: " + query.lastError().text()
867 +
"; Sql: " + query.executedQuery()
868 +
"; parentId: " + QString::number(nodeId));
869 qCritical(log) << GetError();
872 while(query.next()) {
874 item.SetId(query.value(0).toInt());
875 item.SetName(query.value(1).toString());
876 item.SetKey(query.value(2).toInt());
877 item.SetCreateTime(query.value(3).toDateTime());
878 item.SetModifyTime(query.value(4).toDateTime());
879 item.SetLastVisitTime(query.value(5).toDateTime());
880 item.SetParentId(query.value(6).toInt());
889 QList<TreeItem> items;
890 QSqlQuery query(GetDatabase());
892 szSql =
"SELECT `id`, `name`, "
893 " `created_time`, `modified_time`, `last_visit_time`, `parent_id` "
894 " FROM `" + m_szTableName +
"` "
895 " WHERE `key` = :key";
896 query.prepare(szSql);
897 query.bindValue(
":key", key);
898 bool success = query.exec();
900 SetError(
"Failed to get leaves by key: " + query.lastError().text()
901 +
"; Sql: " + query.executedQuery()
902 +
"; key: " + QString::number(key));
905 while(query.next()) {
907 item.SetId(query.value(0).toInt());
908 item.SetName(query.value(1).toString());
910 item.SetCreateTime(query.value(2).toDateTime());
911 item.SetModifyTime(query.value(3).toDateTime());
912 item.SetLastVisitTime(query.value(4).toDateTime());
913 item.SetParentId(query.value(5).toInt());
922 QList<TreeItem> items;
923 if(key.isEmpty())
return items;
925 QSqlQuery query(GetDatabase());
927 szSql =
"SELECT `id`, `name`, `key`, "
928 " `created_time`, `modified_time`, `last_visit_time`, `parent_id` "
929 " FROM `" + m_szTableName +
"` "
932 foreach(
auto KeyId, key) {
934 szSql +=
" `key` = " + QString::number(KeyId);
937 szSql +=
" OR `key` = " + QString::number(KeyId);
939 bool success = query.exec(szSql);
941 SetError(
"Failed to get leaves by key: " + query.lastError().text()
942 +
"; Sql: " + szSql);
943 qCritical(log) << GetError();
946 while(query.next()) {
948 item.SetId(query.value(0).toInt());
949 item.SetName(query.value(1).toString());
950 item.SetKey(query.value(2).toInt());
951 item.SetCreateTime(query.value(3).toDateTime());
952 item.SetModifyTime(query.value(4).toDateTime());
953 item.SetLastVisitTime(query.value(5).toDateTime());
954 item.SetParentId(query.value(6).toInt());
961int CDatabaseTree::GetLeafCount(
int parentId)
963 QSqlQuery query(GetDatabase());
965 query.prepare(
"SELECT COUNT(*) FROM `" + m_szTableName +
"`");
967 query.prepare(
"SELECT COUNT(*) FROM `" + m_szTableName +
"` WHERE `parent_id`=:id");
968 query.bindValue(
":id", parentId);
972 return query.value(0).toInt();
974 SetError(
"Failed to get leaf count: " + query.lastError().text()
975 +
"; Sql: " + query.executedQuery());
976 qCritical(log) << GetError();
981int CDatabaseTree::AddNode(
const QString &name,
int parentId)
983 return m_FolderDB.AddNode(name, parentId);
986bool CDatabaseTree::RenameNode(
int id,
const QString &newName)
988 return m_FolderDB.RenameNode(
id, newName);
991bool CDatabaseTree::DeleteNode(
int id,
bool delKey)
993 return m_FolderDB.DeleteNode(
995 [&, delKey](
int parentId)->
bool {
996 return DeleteChild(parentId, delKey);
1001bool CDatabaseTree::MoveNode(
int id,
int newParentId)
1003 return m_FolderDB.MoveNode(
id, newParentId);
1006TreeItem CDatabaseTree::GetNode(
int id)
1008 return m_FolderDB.GetNode(
id);
1011QList<TreeItem> CDatabaseTree::GetAllNodes()
1013 return m_FolderDB.GetAllNodes();
1016QList<TreeItem> CDatabaseTree::GetSubNodes(
int parentId)
1018 return m_FolderDB.GetSubNodes(parentId);
1021int CDatabaseTree::GetNodeCount(
int nParentId)
1023 return m_FolderDB.
GetCount(nParentId);
1028 return GetNodeCount(parentId) + GetLeafCount(parentId);
1031bool CDatabaseTree::OnDeleteKey(
int key)
1036bool CDatabaseTree::ExportToJson(QJsonObject& obj)
1040 QSqlQuery query(GetDatabase());
1042 "SELECT `id`, `parent_id`, `name`, `key`, "
1043 " `created_time`, `modified_time`, `last_visit_time` "
1044 " FROM `" + m_szTableName +
"`");
1045 bRet = query.exec();
1047 SetError(
"Failed to export tree to json: " + query.lastError().text()
1048 +
"; Sql: " + query.executedQuery());
1049 qCritical(log) << GetError();
1054 while(query.next()) {
1056 t.insert(
"id", query.value(0).toInt());
1057 t.insert(
"parent_id", query.value(1).toInt());
1058 t.insert(
"name", query.value(2).toString());
1059 t.insert(
"key", query.value(3).toInt());
1060 t.insert(
"created_time", query.value(4).toDateTime().toString());
1061 t.insert(
"modified_time", query.value(5).toDateTime().toString());
1062 t.insert(
"last_visit_time", query.value(6).toDateTime().toString());
1066 obj.insert(
"tree", tree);
1068 bRet = m_FolderDB.ExportToJson(obj);
1072bool CDatabaseTree::ImportFromJson(
const QJsonObject& obj)
1075 bRet = m_FolderDB.ImportFromJson(obj);
int GetCount(int parentId=0)
Get count.
virtual int Add(const TreeItem &item)
Add item.
QList< TreeItem > GetLeavesByKey(int key)
Get leaves.
int GetCount(int parentId=0)
Get the count of parentId.
QList< TreeItem > GetLeaves(int nodeId)
Get the leaves under nodeId.
virtual bool OnInitializeDatabase() override
Initialize database.
Provide interfaces such as opening the database and initializing the database.
virtual bool OnInitializeDatabase()
Initialize database.
bool SetDatabase(const CDatabase *db)
Share an existing database.