Browse Source

Change parent for category from right to left, fixes

Vova Tkach 6 years ago
parent
commit
200bdec6be
3 changed files with 110 additions and 29 deletions
  1. 1 1
      engine/sqlw/log.go
  2. 10 0
      engine/sqlw/txw.go
  3. 99 28
      modules/module_blog_categories_act_modify.go

+ 1 - 1
engine/sqlw/log.go

@@ -22,7 +22,7 @@ func log(query string, s time.Time, e error, transaction bool) {
 	if reg, err := regexp.Compile("[\\s\\t]+;$"); err == nil {
 		msg = reg.ReplaceAllString(msg, ";")
 	}
-	eStr := " (nil) "
+	eStr := " (nil)"
 	if e != nil {
 		eStr = " (" + e.Error() + ") "
 	}

+ 10 - 0
engine/sqlw/txw.go

@@ -51,3 +51,13 @@ func (this *Tx) QueryRow(query string, args ...interface{}) *sql.Row {
 	}
 	return this.tx.QueryRow(query, args...)
 }
+
+func (this *Tx) Query(query string, args ...interface{}) (*sql.Rows, error) {
+	if consts.ParamDebug {
+		s := time.Now()
+		r, e := this.tx.Query(query, args...)
+		log("[TX] "+query, s, e, true)
+		return r, e
+	}
+	return this.tx.Query(query, args...)
+}

+ 99 - 28
modules/module_blog_categories_act_modify.go

@@ -1,6 +1,7 @@
 package modules
 
 import (
+	// "golang-fave/engine/sqlw"
 	"golang-fave/engine/wrapper"
 	"golang-fave/utils"
 )
@@ -61,45 +62,115 @@ func (this *Modules) blog_ActionCategoryUpdate(wrap *wrapper.Wrapper, pf_id, pf_
 
 	// Parent is changed, move category to new parent
 	return wrap.DB.Transaction(func(tx *wrapper.Tx) error {
-		// Block rows
+		// Block all rows
 		if _, err := tx.Exec("SELECT id FROM blog_cats FOR UPDATE;"); err != nil {
 			return err
 		}
 
-		// Shift
-		if _, err := tx.Exec("SELECT @ml := lft, @mr := rgt FROM blog_cats WHERE id = ?;", pf_id); err != nil {
-			return err
-		}
-		if _, err := tx.Exec("UPDATE blog_cats SET lft = 0, rgt = 0 WHERE id = ?;", pf_id); err != nil {
-			return err
-		}
-		if _, err := tx.Exec("UPDATE blog_cats SET lft = lft - 1, rgt = rgt - 1 WHERE lft > @ml AND rgt < @mr;"); err != nil {
-			return err
-		}
-		if _, err := tx.Exec("UPDATE blog_cats SET lft = lft - 2 WHERE lft > @mr;"); err != nil {
-			return err
-		}
-		if _, err := tx.Exec("UPDATE blog_cats SET rgt = rgt - 2 WHERE rgt > @mr;"); err != nil {
-			return err
-		}
+		wrap.LogError("Start update!")
+		wrap.LogError("--------------------------------")
 
-		// Update
-		if _, err := tx.Exec("SELECT @mr := rgt FROM blog_cats WHERE id = ?;", pf_parent); err != nil {
-			return err
-		}
-		if _, err := tx.Exec("UPDATE blog_cats SET rgt = rgt + 2 WHERE rgt > @mr;"); err != nil {
+		var parentL int
+		var parentR int
+		if err := tx.QueryRow(`SELECT lft, rgt FROM blog_cats WHERE id = ?;`, pf_parent).Scan(&parentL, &parentR); err != nil {
 			return err
 		}
-		if _, err := tx.Exec("UPDATE blog_cats SET lft = lft + 2 WHERE lft > @mr;"); err != nil {
-			return err
-		}
-		if _, err := tx.Exec("UPDATE blog_cats SET rgt = rgt + 2 WHERE id = ?;", pf_parent); err != nil {
+
+		var targetL int
+		var targetR int
+		if err := tx.QueryRow(`SELECT lft, rgt FROM blog_cats WHERE id = ?;`, pf_id).Scan(&targetL, &targetR); err != nil {
 			return err
 		}
-		if _, err := tx.Exec("UPDATE blog_cats SET name = ?, alias = ?, lft = @mr, rgt = @mr + 1 WHERE id = ?;", pf_name, pf_alias, pf_id); err != nil {
-			return err
+
+		wrap.LogError("parentL = %d, parentR = %d", parentL, parentR)
+		wrap.LogError("targetL = %d, targetR = %d", targetL, targetR)
+
+		// From right to left
+		if targetL > parentR {
+			// Select data
+			rows, err := tx.Query("SELECT id, lft, rgt FROM blog_cats WHERE lft >= ? and rgt <= ? ORDER BY lft ASC", targetL, targetR)
+			if err != nil {
+				return err
+			}
+			defer rows.Close()
+			var rows_id []int
+			var rows_lft []int
+			var rows_rgt []int
+			for rows.Next() {
+				var row_id int
+				var row_lft int
+				var row_rgt int
+				if err := rows.Scan(&row_id, &row_lft, &row_rgt); err == nil {
+					rows_id = append(rows_id, row_id)
+					rows_lft = append(rows_lft, row_lft)
+					rows_rgt = append(rows_rgt, row_rgt)
+				}
+			}
+
+			wrap.LogError("rows_id = %v", rows_id)
+			wrap.LogError("rows_lft = %v", rows_lft)
+			wrap.LogError("rows_rgt = %v", rows_rgt)
+
+			// Shift
+			step := targetR - targetL + 1
+			if _, err := tx.Exec("UPDATE blog_cats SET lft = lft + ? WHERE lft > ? and lft < ?;", step, parentR, targetL); err != nil {
+				return err
+			}
+			if _, err := tx.Exec("UPDATE blog_cats SET rgt = rgt + ? WHERE rgt > ? and rgt < ?;", step, parentR, targetL); err != nil {
+				return err
+			}
+			if _, err := tx.Exec("UPDATE blog_cats SET rgt = rgt + ? WHERE id = ?;", step, pf_parent); err != nil {
+				return err
+			}
+
+			// Update target rows
+			for i, _ := range rows_id {
+				new_lft := rows_lft[i] - (targetL - parentR)
+				new_rgt := rows_rgt[i] - (targetL - parentR)
+				if _, err := tx.Exec("UPDATE blog_cats SET lft = ?, rgt = ? WHERE id = ?;", new_lft, new_rgt, rows_id[i]); err != nil {
+					return err
+				}
+			}
 		}
 
+		wrap.LogError("--------------------------------")
+
+		/*
+			// Shift
+			if _, err := tx.Exec("SELECT @ml := lft, @mr := rgt FROM blog_cats WHERE id = ?;", pf_id); err != nil {
+				return err
+			}
+			if _, err := tx.Exec("UPDATE blog_cats SET lft = 0, rgt = 0 WHERE id = ?;", pf_id); err != nil {
+				return err
+			}
+			if _, err := tx.Exec("UPDATE blog_cats SET lft = lft - 1, rgt = rgt - 1 WHERE lft > @ml AND rgt < @mr;"); err != nil {
+				return err
+			}
+			if _, err := tx.Exec("UPDATE blog_cats SET lft = lft - 2 WHERE lft > @mr;"); err != nil {
+				return err
+			}
+			if _, err := tx.Exec("UPDATE blog_cats SET rgt = rgt - 2 WHERE rgt > @mr;"); err != nil {
+				return err
+			}
+
+			// Update
+			if _, err := tx.Exec("SELECT @mr := rgt FROM blog_cats WHERE id = ?;", pf_parent); err != nil {
+				return err
+			}
+			if _, err := tx.Exec("UPDATE blog_cats SET rgt = rgt + 2 WHERE rgt > @mr;"); err != nil {
+				return err
+			}
+			if _, err := tx.Exec("UPDATE blog_cats SET lft = lft + 2 WHERE lft > @mr;"); err != nil {
+				return err
+			}
+			if _, err := tx.Exec("UPDATE blog_cats SET rgt = rgt + 2 WHERE id = ?;", pf_parent); err != nil {
+				return err
+			}
+			if _, err := tx.Exec("UPDATE blog_cats SET name = ?, alias = ?, lft = @mr, rgt = @mr + 1 WHERE id = ?;", pf_name, pf_alias, pf_id); err != nil {
+				return err
+			}
+		*/
+
 		return nil
 	})
 }