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) {
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) {
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);
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
virtual bool OnDeleteKey(int key)
从 key 相关的表中删除 key
int GetCount(int parentId=0)
得到指定id节点下的所有节点和叶子数。不递归。
QList< TreeItem > GetLeaves(int nodeId)
Get the leaves under nodeId
virtual bool OnInitializeDatabase() override
Initialize database
virtual bool OnInitializeDatabase()
Initialize database
bool SetDatabase(const CDatabase *db)
Share an existing database