Browse Source

Optimization

Vova Tkach 6 years ago
parent
commit
c0a080d7f8

+ 19 - 0
engine/wrapper/wrapper.go

@@ -235,3 +235,22 @@ func (this *Wrapper) RenderBackEnd(tcont []byte, data interface{}) {
 	}
 	this.W.Write(tpl.Bytes())
 }
+
+func (this *Wrapper) DBTrans(queries func(tx *sql.Tx) error) error {
+	if queries == nil {
+		return errors.New("queries is not set for transaction")
+	}
+
+	tx, err := this.DB.Begin()
+	if err != nil {
+		return err
+	}
+
+	err = queries(tx)
+	if err != nil {
+		tx.Rollback()
+		return err
+	}
+
+	return tx.Commit()
+}

+ 13 - 22
modules/module_blog_act_delete.go

@@ -1,6 +1,9 @@
 package modules
 
 import (
+	"database/sql"
+	_ "github.com/go-sql-driver/mysql"
+
 	"golang-fave/engine/wrapper"
 	"golang-fave/utils"
 )
@@ -18,28 +21,16 @@ func (this *Modules) RegisterAction_BlogDelete() *Action {
 			return
 		}
 
-		// Start transaction
-		tx, err := wrap.DB.Begin()
-		if err != nil {
-			wrap.MsgError(err.Error())
-			return
-		}
-
-		// Delete target post with category connection data
-		if _, err = tx.Exec("DELETE FROM blog_posts WHERE id = ?;", pf_id); err != nil {
-			tx.Rollback()
-			wrap.MsgError(err.Error())
-			return
-		}
-		if _, err = tx.Exec("DELETE FROM blog_cat_post_rel WHERE post_id = ?;", pf_id); err != nil {
-			tx.Rollback()
-			wrap.MsgError(err.Error())
-			return
-		}
-
-		// Commit all changes
-		err = tx.Commit()
-		if err != nil {
+		if err := wrap.DBTrans(func(tx *sql.Tx) error {
+			// Delete target post with category connection data
+			if _, err := tx.Exec("DELETE FROM blog_posts WHERE id = ?;", pf_id); err != nil {
+				return err
+			}
+			if _, err := tx.Exec("DELETE FROM blog_cat_post_rel WHERE post_id = ?;", pf_id); err != nil {
+				return err
+			}
+			return nil
+		}); err != nil {
 			wrap.MsgError(err.Error())
 			return
 		}

+ 112 - 143
modules/module_blog_act_modify.go

@@ -1,6 +1,10 @@
 package modules
 
 import (
+	"database/sql"
+	_ "github.com/go-sql-driver/mysql"
+
+	"errors"
 	"strings"
 
 	"golang-fave/engine/wrapper"
@@ -43,166 +47,131 @@ func (this *Modules) RegisterAction_BlogModify() *Action {
 		}
 
 		if pf_id == "0" {
-			// Start transaction
-			tx, err := wrap.DB.Begin()
-			if err != nil {
-				wrap.MsgError(err.Error())
-				return
-			}
-
-			// Insert row
-			res, err := tx.Exec(
-				`INSERT INTO blog_posts SET
-					user = ?,
-					name = ?,
-					alias = ?,
-					content = ?,
-					datetime = ?,
-					active = ?
-				;`,
-				wrap.User.A_id,
-				pf_name,
-				pf_alias,
-				pf_content,
-				utils.UnixTimestampToMySqlDateTime(utils.GetCurrentUnixTimestamp()),
-				pf_active,
-			)
-			if err != nil {
-				tx.Rollback()
-				wrap.MsgError(err.Error())
-				return
-			}
-
-			lastID, err := res.LastInsertId()
-			if err != nil {
-				tx.Rollback()
-				wrap.MsgError(err.Error())
-				return
-			}
-
-			// Insert post and categories relations
-			catids := utils.GetPostArrayInt("cats[]", wrap.R)
-			if len(catids) > 0 {
-				var catsCount int
-				err = tx.QueryRow(`
-					SELECT
-						COUNT(*)
-					FROM
-						blog_cats
-					WHERE
-						id IN(` + strings.Join(utils.ArrayOfIntToArrayOfString(catids), ",") + `)
+			if err := wrap.DBTrans(func(tx *sql.Tx) error {
+				// Insert row
+				res, err := tx.Exec(
+					`INSERT INTO blog_posts SET
+						user = ?,
+						name = ?,
+						alias = ?,
+						content = ?,
+						datetime = ?,
+						active = ?
 					;`,
-				).Scan(
-					&catsCount,
+					wrap.User.A_id,
+					pf_name,
+					pf_alias,
+					pf_content,
+					utils.UnixTimestampToMySqlDateTime(utils.GetCurrentUnixTimestamp()),
+					pf_active,
 				)
 				if err != nil {
-					tx.Rollback()
-					wrap.MsgError(err.Error())
-					return
-				}
-				if len(catids) != catsCount {
-					tx.Rollback()
-					wrap.MsgError(`Inner system error`)
-					return
-				}
-				var balkInsertArr []string
-				for _, el := range catids {
-					balkInsertArr = append(balkInsertArr, `(NULL,`+utils.Int64ToStr(lastID)+`,`+utils.IntToStr(el)+`)`)
+					return err
 				}
-				if _, err = tx.Exec(
-					`INSERT INTO blog_cat_post_rel (id,post_id,category_id) VALUES ` + strings.Join(balkInsertArr, ",") + `;`,
-				); err != nil {
-					tx.Rollback()
-					wrap.MsgError(err.Error())
-					return
+
+				// Get inserted post id
+				lastID, err := res.LastInsertId()
+				if err != nil {
+					return err
 				}
-			}
 
-			// Commit all changes
-			err = tx.Commit()
-			if err != nil {
+				// Insert post and categories relations
+				catids := utils.GetPostArrayInt("cats[]", wrap.R)
+				if len(catids) > 0 {
+					var catsCount int
+					err = tx.QueryRow(`
+						SELECT
+							COUNT(*)
+						FROM
+							blog_cats
+						WHERE
+							id IN(` + strings.Join(utils.ArrayOfIntToArrayOfString(catids), ",") + `)
+						;`,
+					).Scan(
+						&catsCount,
+					)
+					if err != nil {
+						return err
+					}
+					if len(catids) != catsCount {
+						return errors.New("Inner system error")
+					}
+					var balkInsertArr []string
+					for _, el := range catids {
+						balkInsertArr = append(balkInsertArr, `(NULL,`+utils.Int64ToStr(lastID)+`,`+utils.IntToStr(el)+`)`)
+					}
+					if _, err = tx.Exec(
+						`INSERT INTO blog_cat_post_rel (id,post_id,category_id) VALUES ` + strings.Join(balkInsertArr, ",") + `;`,
+					); err != nil {
+						return err
+					}
+				}
+				return nil
+			}); err != nil {
 				wrap.MsgError(err.Error())
 				return
 			}
 
 			wrap.Write(`window.location='/cp/blog/';`)
 		} else {
-			// Start transaction
-			tx, err := wrap.DB.Begin()
-			if err != nil {
-				wrap.MsgError(err.Error())
-				return
-			}
-
-			// Update row
-			if _, err = tx.Exec(
-				`UPDATE blog_posts SET
-					name = ?,
-					alias = ?,
-					content = ?,
-					active = ?
-				WHERE
-					id = ?
-				;`,
-				pf_name,
-				pf_alias,
-				pf_content,
-				pf_active,
-				utils.StrToInt(pf_id),
-			); err != nil {
-				tx.Rollback()
-				wrap.MsgError(err.Error())
-				return
-			}
-
-			// Delete post and categories relations
-			if _, err = tx.Exec("DELETE FROM blog_cat_post_rel WHERE post_id = ?;", pf_id); err != nil {
-				tx.Rollback()
-				wrap.MsgError(err.Error())
-				return
-			}
-
-			// Insert post and categories relations
-			catids := utils.GetPostArrayInt("cats[]", wrap.R)
-			if len(catids) > 0 {
-				var catsCount int
-				err = tx.QueryRow(`
-					SELECT
-						COUNT(*)
-					FROM
-						blog_cats
+			if err := wrap.DBTrans(func(tx *sql.Tx) error {
+				// Update row
+				if _, err := tx.Exec(
+					`UPDATE blog_posts SET
+						name = ?,
+						alias = ?,
+						content = ?,
+						active = ?
 					WHERE
-						id IN(` + strings.Join(utils.ArrayOfIntToArrayOfString(catids), ",") + `)
+						id = ?
 					;`,
-				).Scan(
-					&catsCount,
-				)
-				if err != nil {
-					tx.Rollback()
-					wrap.MsgError(err.Error())
-					return
-				}
-				if len(catids) != catsCount {
-					tx.Rollback()
-					wrap.MsgError(`Inner system error`)
-					return
-				}
-				var balkInsertArr []string
-				for _, el := range catids {
-					balkInsertArr = append(balkInsertArr, `(NULL,`+pf_id+`,`+utils.IntToStr(el)+`)`)
-				}
-				if _, err = tx.Exec(
-					`INSERT INTO blog_cat_post_rel (id,post_id,category_id) VALUES ` + strings.Join(balkInsertArr, ",") + `;`,
+					pf_name,
+					pf_alias,
+					pf_content,
+					pf_active,
+					utils.StrToInt(pf_id),
 				); err != nil {
-					tx.Rollback()
-					wrap.MsgError(err.Error())
-					return
+					return err
 				}
-			}
 
-			// Commit all changes
-			err = tx.Commit()
-			if err != nil {
+				// Delete post and categories relations
+				if _, err := tx.Exec("DELETE FROM blog_cat_post_rel WHERE post_id = ?;", pf_id); err != nil {
+					return err
+				}
+
+				// Insert post and categories relations
+				catids := utils.GetPostArrayInt("cats[]", wrap.R)
+				if len(catids) > 0 {
+					var catsCount int
+					err := tx.QueryRow(`
+						SELECT
+							COUNT(*)
+						FROM
+							blog_cats
+						WHERE
+							id IN(` + strings.Join(utils.ArrayOfIntToArrayOfString(catids), ",") + `)
+						;`,
+					).Scan(
+						&catsCount,
+					)
+					if err != nil {
+						return err
+					}
+					if len(catids) != catsCount {
+						return errors.New("Inner system error")
+					}
+					var balkInsertArr []string
+					for _, el := range catids {
+						balkInsertArr = append(balkInsertArr, `(NULL,`+pf_id+`,`+utils.IntToStr(el)+`)`)
+					}
+					if _, err := tx.Exec(
+						`INSERT INTO blog_cat_post_rel (id,post_id,category_id) VALUES ` + strings.Join(balkInsertArr, ",") + `;`,
+					); err != nil {
+						return err
+					}
+				}
+				return nil
+			}); err != nil {
 				wrap.MsgError(err.Error())
 				return
 			}

+ 24 - 40
modules/module_blog_categories_act_delete.go

@@ -1,6 +1,9 @@
 package modules
 
 import (
+	"database/sql"
+	_ "github.com/go-sql-driver/mysql"
+
 	"golang-fave/engine/wrapper"
 	"golang-fave/utils"
 )
@@ -18,47 +21,28 @@ func (this *Modules) RegisterAction_BlogCategoriesDelete() *Action {
 			return
 		}
 
-		// Start transaction
-		tx, err := wrap.DB.Begin()
-		if err != nil {
-			wrap.MsgError(err.Error())
-			return
-		}
-
-		// Update and delete target category
-		if _, err = tx.Exec("SELECT @ml := lft, @mr := rgt FROM blog_cats WHERE id = ?;", pf_id); err != nil {
-			tx.Rollback()
-			wrap.MsgError(err.Error())
-			return
-		}
-		if _, err = tx.Exec("DELETE FROM blog_cats WHERE id = ?;", pf_id); err != nil {
-			tx.Rollback()
-			wrap.MsgError(err.Error())
-			return
-		}
-		if _, err = tx.Exec("UPDATE blog_cats SET lft = lft - 1, rgt = rgt - 1 WHERE lft > @ml AND rgt < @mr;"); err != nil {
-			tx.Rollback()
-			wrap.MsgError(err.Error())
-			return
-		}
-		if _, err = tx.Exec("UPDATE blog_cats SET lft = lft - 2 WHERE lft > @mr;"); err != nil {
-			tx.Rollback()
-			wrap.MsgError(err.Error())
-			return
-		}
-		if _, err = tx.Exec("UPDATE blog_cats SET rgt = rgt - 2 WHERE rgt > @mr;"); err != nil {
-			tx.Rollback()
-			wrap.MsgError(err.Error())
-			return
-		}
-		if _, err = tx.Exec("DELETE FROM blog_cat_post_rel WHERE category_id = ?;", pf_id); err != nil {
-			tx.Rollback()
-			wrap.MsgError(err.Error())
-			return
-		}
+		err := wrap.DBTrans(func(tx *sql.Tx) error {
+			if _, err := tx.Exec("SELECT @ml := lft, @mr := rgt FROM blog_cats WHERE id = ?;", pf_id); err != nil {
+				return err
+			}
+			if _, err := tx.Exec("DELETE FROM blog_cats 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
+			}
+			if _, err := tx.Exec("DELETE FROM blog_cat_post_rel WHERE category_id = ?;", pf_id); err != nil {
+				return err
+			}
+			return nil
+		})
 
-		// Commit all changes
-		err = tx.Commit()
 		if err != nil {
 			wrap.MsgError(err.Error())
 			return

+ 53 - 83
modules/module_blog_categories_act_modify.go

@@ -1,46 +1,32 @@
 package modules
 
 import (
+	"database/sql"
+	_ "github.com/go-sql-driver/mysql"
+
 	"golang-fave/engine/wrapper"
 	"golang-fave/utils"
 )
 
 func (this *Modules) blog_ActionCategoryAdd(wrap *wrapper.Wrapper, pf_id, pf_name, pf_alias, pf_parent string) error {
-	// Start transaction
-	tx, err := wrap.DB.Begin()
-	if err != nil {
-		return err
-	}
-
-	// Update and insert new category
-	if _, err = tx.Exec("SELECT @mr := rgt FROM blog_cats WHERE id = ?;", pf_parent); err != nil {
-		tx.Rollback()
-		return err
-	}
-	if _, err = tx.Exec("UPDATE blog_cats SET rgt = rgt + 2 WHERE rgt > @mr;"); err != nil {
-		tx.Rollback()
-		return err
-	}
-	if _, err = tx.Exec("UPDATE blog_cats SET lft = lft + 2 WHERE lft > @mr;"); err != nil {
-		tx.Rollback()
-		return err
-	}
-	if _, err = tx.Exec("UPDATE blog_cats SET rgt = rgt + 2 WHERE id = ?;", pf_parent); err != nil {
-		tx.Rollback()
-		return err
-	}
-	if _, err = tx.Exec("INSERT INTO blog_cats (id, user, name, alias, lft, rgt) VALUES (NULL, ?, ?, ?, @mr, @mr + 1);", wrap.User.A_id, pf_name, pf_alias); err != nil {
-		tx.Rollback()
-		return err
-	}
-
-	// Commit all changes
-	err = tx.Commit()
-	if err != nil {
-		return err
-	}
-
-	return nil
+	return wrap.DBTrans(func(tx *sql.Tx) error {
+		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("INSERT INTO blog_cats (id, user, name, alias, lft, rgt) VALUES (NULL, ?, ?, ?, @mr, @mr + 1);", wrap.User.A_id, pf_name, pf_alias); err != nil {
+			return err
+		}
+		return nil
+	})
 }
 
 func (this *Modules) blog_ActionCategoryUpdate(wrap *wrapper.Wrapper, pf_id, pf_name, pf_alias, pf_parent string) error {
@@ -48,79 +34,63 @@ func (this *Modules) blog_ActionCategoryUpdate(wrap *wrapper.Wrapper, pf_id, pf_
 
 	if utils.StrToInt(pf_parent) == parentId {
 		// If parent not changed, just update category data
-		_, err := wrap.DB.Exec(`
-			UPDATE blog_cats SET
-				name = ?,
-				alias = ?
-			WHERE
-				id > 1 AND
-				id = ?
-			;`,
-			pf_name,
-			pf_alias,
-			pf_id,
-		)
-		return err
-	} else {
-		// Parent is changed, move category to new parent
-		// Start transaction
-		tx, err := wrap.DB.Begin()
-		if err != nil {
-			return err
-		}
+		return wrap.DBTrans(func(tx *sql.Tx) error {
+			if _, err := tx.Exec(`
+				UPDATE blog_cats SET
+					name = ?,
+					alias = ?
+				WHERE
+					id > 1 AND
+					id = ?
+				;`,
+				pf_name,
+				pf_alias,
+				pf_id,
+			); err != nil {
+				return err
+			}
+			return nil
+		})
+	}
 
+	// Parent is changed, move category to new parent
+	return wrap.DBTrans(func(tx *sql.Tx) error {
 		// Shift
-		if _, err = tx.Exec("SELECT @ml := lft, @mr := rgt FROM blog_cats WHERE id = ?;", pf_id); err != nil {
-			tx.Rollback()
+		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 {
-			tx.Rollback()
+		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 {
-			tx.Rollback()
+		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 {
-			tx.Rollback()
+		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 {
-			tx.Rollback()
+		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 {
-			tx.Rollback()
-			return err
-		}
-		if _, err = tx.Exec("UPDATE blog_cats SET rgt = rgt + 2 WHERE rgt > @mr;"); err != nil {
-			tx.Rollback()
+		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 lft = lft + 2 WHERE lft > @mr;"); err != nil {
-			tx.Rollback()
+		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 rgt = rgt + 2 WHERE id = ?;", pf_parent); err != nil {
-			tx.Rollback()
+		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 name = ?, alias = ?, lft = @mr, rgt = @mr + 1 WHERE id = ?;", pf_name, pf_alias, pf_id); err != nil {
-			tx.Rollback()
+		if _, err := tx.Exec("UPDATE blog_cats SET rgt = rgt + 2 WHERE id = ?;", pf_parent); err != nil {
 			return err
 		}
-
-		// Commit all changes
-		err = tx.Commit()
-		if err != nil {
+		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
+		return nil
+	})
 }
 
 func (this *Modules) RegisterAction_BlogCategoriesModify() *Action {

+ 6 - 15
modules/module_index.go

@@ -415,22 +415,13 @@ func (this *Modules) RegisterAction_IndexDelete() *Action {
 			return
 		}
 
-		// Start transaction
-		tx, err := wrap.DB.Begin()
-		if err != nil {
-			wrap.MsgError(err.Error())
-			return
-		}
-
-		// Delete page
-		if _, err = tx.Exec("DELETE FROM pages WHERE id = ?;", pf_id); err != nil {
-			tx.Rollback()
-			wrap.MsgError(err.Error())
-			return
-		}
+		err := wrap.DBTrans(func(tx *sql.Tx) error {
+			if _, err := tx.Exec("DELETE FROM pages WHERE id = ?;", pf_id); err != nil {
+				return err
+			}
+			return nil
+		})
 
-		// Commit all changes
-		err = tx.Commit()
 		if err != nil {
 			wrap.MsgError(err.Error())
 			return

+ 18 - 30
modules/module_users_act_delete.go

@@ -1,6 +1,9 @@
 package modules
 
 import (
+	"database/sql"
+	_ "github.com/go-sql-driver/mysql"
+
 	"golang-fave/engine/wrapper"
 	"golang-fave/utils"
 )
@@ -18,37 +21,22 @@ func (this *Modules) RegisterAction_UsersDelete() *Action {
 			return
 		}
 
-		// Start transaction
-		tx, err := wrap.DB.Begin()
-		if err != nil {
-			wrap.MsgError(err.Error())
-			return
-		}
-
-		// Update and delete target user
-		if _, err = tx.Exec("UPDATE blog_cats SET user = 1 WHERE user = ?;", pf_id); err != nil {
-			tx.Rollback()
-			wrap.MsgError(err.Error())
-			return
-		}
-		if _, err = tx.Exec("UPDATE blog_posts SET user = 1 WHERE user = ?;", pf_id); err != nil {
-			tx.Rollback()
-			wrap.MsgError(err.Error())
-			return
-		}
-		if _, err = tx.Exec("UPDATE pages SET user = 1 WHERE user = ?;", pf_id); err != nil {
-			tx.Rollback()
-			wrap.MsgError(err.Error())
-			return
-		}
-		if _, err = tx.Exec("DELETE FROM users WHERE id = ? and id > 1;", pf_id); err != nil {
-			tx.Rollback()
-			wrap.MsgError(err.Error())
-			return
-		}
+		err := wrap.DBTrans(func(tx *sql.Tx) error {
+			if _, err := tx.Exec("UPDATE blog_cats SET user = 1 WHERE user = ?;", pf_id); err != nil {
+				return err
+			}
+			if _, err := tx.Exec("UPDATE blog_posts SET user = 1 WHERE user = ?;", pf_id); err != nil {
+				return err
+			}
+			if _, err := tx.Exec("UPDATE pages SET user = 1 WHERE user = ?;", pf_id); err != nil {
+				return err
+			}
+			if _, err := tx.Exec("DELETE FROM users WHERE id = ? and id > 1;", pf_id); err != nil {
+				return err
+			}
+			return nil
+		})
 
-		// Commit all changes
-		err = tx.Commit()
 		if err != nil {
 			wrap.MsgError(err.Error())
 			return