Browse Source

:art: 自动校验数据库索引 https://github.com/siyuan-note/siyuan/issues/7016

Liang Ding 2 years ago
parent
commit
c631b64d00
2 changed files with 36 additions and 16 deletions
  1. 18 11
      kernel/model/transaction.go
  2. 18 5
      kernel/sql/block_query.go

+ 18 - 11
kernel/model/transaction.go

@@ -1237,18 +1237,21 @@ func autoFixIndex() {
 	autoFixLock.Lock()
 	defer autoFixLock.Unlock()
 
-	rootUpdated := treenode.GetRootUpdated()
+	rootUpdatedMap := treenode.GetRootUpdated()
 	i := -1
-	size := len(rootUpdated)
-	for rootID, updated := range rootUpdated {
+	size := len(rootUpdatedMap)
+	for rootID, updated := range rootUpdatedMap {
 		if isFullReindexing {
 			break
 		}
 
 		i++
 
-		root := sql.GetBlock(rootID)
-		if nil == root {
+		rootUpdated, err := sql.GetRootUpdated(rootID)
+		if nil != err {
+			continue
+		}
+		if "" == rootUpdated {
 			logging.LogWarnf("not found tree [%s] in database, reindex it", rootID)
 			reindexTree(rootID, i, size)
 			continue
@@ -1261,20 +1264,24 @@ func autoFixIndex() {
 		}
 
 		btUpdated, _ := time.Parse("20060102150405", updated)
-		dbUpdated, _ := time.Parse("20060102150405", root.Updated)
+		dbUpdated, _ := time.Parse("20060102150405", rootUpdated)
 		if dbUpdated.Before(btUpdated.Add(-1 * time.Minute)) {
 			logging.LogWarnf("tree [%s] is not up to date, reindex it", rootID)
 			reindexTree(rootID, i, size)
 			continue
 		}
+	}
 
-		roots := sql.GetBlockRedundant(rootID)
-		if 1 < len(roots) {
-			logging.LogWarnf("exist more than one tree [%s], reindex it", rootID)
-			sql.RemoveTreeQueue(root.Box, rootID)
-			reindexTree(rootID, i, size)
+	duplicatedRootIDs := sql.GetDuplicatedRootIDs()
+	for _, rootID := range duplicatedRootIDs {
+		root := sql.GetBlock(rootID)
+		if nil == root {
 			continue
 		}
+
+		logging.LogWarnf("exist more than one tree [%s], reindex it", rootID)
+		sql.RemoveTreeQueue(root.Box, rootID)
+		reindexTree(rootID, i, size)
 	}
 }
 

+ 18 - 5
kernel/sql/block_query.go

@@ -581,17 +581,30 @@ func GetBlock(id string) (ret *Block) {
 	return
 }
 
-func GetBlockRedundant(id string) (ret []*Block) {
-	rows, err := query("SELECT * FROM blocks WHERE id = ?", id)
+func GetRootUpdated(rootID string) (ret string, err error) {
+	rows, err := query("SELECT updated FROM blocks WHERE root_id = ? AND type = 'd'", rootID)
 	if nil != err {
 		logging.LogErrorf("sql query failed: %s", err)
 		return
 	}
 	defer rows.Close()
 	for rows.Next() {
-		if block := scanBlockRows(rows); nil != block {
-			ret = append(ret, block)
-		}
+		rows.Scan(&ret)
+	}
+	return
+}
+
+func GetDuplicatedRootIDs() (ret []string) {
+	rows, err := query("SELECT DISTINCT root_id FROM blocks GROUP BY id HAVING COUNT(*) > 1")
+	if nil != err {
+		logging.LogErrorf("sql query failed: %s", err)
+		return
+	}
+	defer rows.Close()
+	for rows.Next() {
+		var id string
+		rows.Scan(&id)
+		ret = append(ret, id)
 	}
 	return
 }