xormplus 9 years ago
parent
commit
1c30da1168
1 changed files with 356 additions and 147 deletions
  1. 356 147
      sql_executor.go

+ 356 - 147
sql_executor.go

@@ -14,6 +14,11 @@ type SqlsExecutor struct {
 }
 
 func (sqlsExecutor *SqlsExecutor) Execute() ([][]map[string]interface{}, map[string][]map[string]interface{}, error) {
+	defer sqlsExecutor.session.resetStatement()
+	if sqlsExecutor.session.IsAutoClose {
+		defer sqlsExecutor.session.Close()
+	}
+
 	if sqlsExecutor.err != nil {
 		return nil, nil, sqlsExecutor.err
 	}
@@ -23,6 +28,13 @@ func (sqlsExecutor *SqlsExecutor) Execute() ([][]map[string]interface{}, map[str
 
 	sqlModel := 1
 
+	if sqlsExecutor.session.IsSqlFuc == true {
+		err := sqlsExecutor.session.Begin()
+		if err != nil {
+			return nil, nil, err
+		}
+	}
+
 	switch sqlsExecutor.sqls.(type) {
 	case string:
 		sqlStr := strings.TrimSpace(sqlsExecutor.sqls.(string))
@@ -32,16 +44,24 @@ func (sqlsExecutor *SqlsExecutor) Execute() ([][]map[string]interface{}, map[str
 			switch sqlCmd {
 			case "select", "desc":
 				model_1_results = sqlsExecutor.session.Sql(sqlStr).Query()
-
-			case "insert", "delete", "update", "create":
+				sqlModel = 1
+			case "insert", "delete", "update", "create", "drop":
 				model_2_results, err = sqlsExecutor.session.Sql(sqlStr).Execute()
 				sqlModel = 2
+			default:
+				sqlModel = 3
 			}
 		} else {
 			switch sqlsExecutor.parmas.(type) {
 			case []map[string]interface{}:
 				parmaMap, ok := sqlsExecutor.parmas.([]map[string]interface{})
 				if !ok {
+					if sqlsExecutor.session.IsSqlFuc == true {
+						err1 := sqlsExecutor.session.Rollback()
+						if err1 != nil {
+							return nil, nil, err1
+						}
+					}
 					return nil, nil, ErrParamsType
 				}
 				key := NewV4().String() + time.Now().String()
@@ -49,16 +69,24 @@ func (sqlsExecutor *SqlsExecutor) Execute() ([][]map[string]interface{}, map[str
 				switch sqlCmd {
 				case "select", "desc":
 					model_1_results = sqlsExecutor.session.SqlMapClient(key, &parmaMap[0]).Query()
-
-				case "insert", "delete", "update", "create":
+					sqlModel = 1
+				case "insert", "delete", "update", "create", "drop":
 					model_2_results, err = sqlsExecutor.session.SqlMapClient(key, &parmaMap[0]).Execute()
 					sqlModel = 2
+				default:
+					sqlModel = 3
 
 				}
 				sqlsExecutor.session.Engine.RemoveSql(key)
 			case map[string]interface{}:
 				parmaMap, ok := sqlsExecutor.parmas.(map[string]interface{})
 				if !ok {
+					if sqlsExecutor.session.IsSqlFuc == true {
+						err1 := sqlsExecutor.session.Rollback()
+						if err1 != nil {
+							return nil, nil, err1
+						}
+					}
 					return nil, nil, ErrParamsType
 				}
 				key := NewV4().String() + time.Now().String()
@@ -66,12 +94,21 @@ func (sqlsExecutor *SqlsExecutor) Execute() ([][]map[string]interface{}, map[str
 				switch sqlCmd {
 				case "select", "desc":
 					model_1_results = sqlsExecutor.session.SqlMapClient(key, &parmaMap).Query()
-				case "insert", "delete", "update", "create":
+					sqlModel = 1
+				case "insert", "delete", "update", "create", "drop":
 					model_2_results, err = sqlsExecutor.session.SqlMapClient(key, &parmaMap).Execute()
 					sqlModel = 2
+				default:
+					sqlModel = 3
 				}
 				sqlsExecutor.session.Engine.RemoveSql(key)
 			default:
+				if sqlsExecutor.session.IsSqlFuc == true {
+					err1 := sqlsExecutor.session.Rollback()
+					if err1 != nil {
+						return nil, nil, err1
+					}
+				}
 				return nil, nil, ErrParamsType
 			}
 		}
@@ -80,14 +117,26 @@ func (sqlsExecutor *SqlsExecutor) Execute() ([][]map[string]interface{}, map[str
 
 		if sqlModel == 1 {
 			if model_1_results.Error != nil {
+				if sqlsExecutor.session.IsSqlFuc == true {
+					err1 := sqlsExecutor.session.Rollback()
+					if err1 != nil {
+						return nil, nil, err1
+					}
+				}
 				return nil, nil, model_1_results.Error
 			}
 
 			resultSlice[0] = make([]map[string]interface{}, len(model_1_results.Results))
 			resultSlice[0] = model_1_results.Results
 			return resultSlice, nil, nil
-		} else {
+		} else if sqlModel == 2 {
 			if err != nil {
+				if sqlsExecutor.session.IsSqlFuc == true {
+					err1 := sqlsExecutor.session.Rollback()
+					if err1 != nil {
+						return nil, nil, err1
+					}
+				}
 				return nil, nil, err
 			}
 
@@ -105,211 +154,371 @@ func (sqlsExecutor *SqlsExecutor) Execute() ([][]map[string]interface{}, map[str
 			resultMap[0]["RowsAffected"] = RowsAffected
 			resultSlice[0] = resultMap
 			return resultSlice, nil, nil
+		} else {
+			resultSlice[0] = nil
 		}
 	case []string:
-		if sqlsExecutor.session.IsSqlFuc == true {
-			err := sqlsExecutor.session.Begin()
-			if err != nil {
-				return nil, nil, err
-			}
-		}
+
 		sqlsSlice := sqlsExecutor.sqls.([]string)
 		n := len(sqlsSlice)
 		resultSlice := make([][]map[string]interface{}, n)
 		parmaSlice := make([]map[string]interface{}, n)
-		switch sqlsExecutor.parmas.(type) {
-		case []map[string]interface{}:
-			parmaSlice = sqlsExecutor.parmas.([]map[string]interface{})
-
-		default:
-			if sqlsExecutor.session.IsSqlFuc == true {
-				err := sqlsExecutor.session.Rollback()
-				if err != nil {
-					return nil, nil, err
-				}
-			}
-			return nil, nil, ErrParamsType
-		}
 
-		for i, _ := range sqlsSlice {
-			sqlStr := strings.TrimSpace(sqlsSlice[i])
-			sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
-			if parmaSlice[i] == nil {
+		if sqlsExecutor.parmas == nil {
+			for i, _ := range sqlsSlice {
+				sqlStr := strings.TrimSpace(sqlsSlice[i])
+				sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
 				switch sqlCmd {
 				case "select", "desc":
 					model_1_results = sqlsExecutor.session.Sql(sqlStr).Query()
-
-				case "insert", "delete", "update", "create":
+					sqlModel = 1
+				case "insert", "delete", "update", "create", "drop":
 					model_2_results, err = sqlsExecutor.session.Sql(sqlStr).Execute()
 					sqlModel = 2
+				default:
+					sqlModel = 3
 				}
-			} else {
-				key := NewV4().String() + time.Now().String()
-				sqlsExecutor.session.Engine.AddSql(key, sqlStr)
-				switch sqlCmd {
-				case "select", "desc":
-					model_1_results = sqlsExecutor.session.SqlMapClient(key, &parmaSlice[i]).Query()
-				case "insert", "delete", "update", "create":
-					model_2_results, err = sqlsExecutor.session.SqlMapClient(key, &parmaSlice[i]).Execute()
-					sqlModel = 2
-				}
-				sqlsExecutor.session.Engine.RemoveSql(key)
-			}
 
-			if sqlModel == 1 {
-				if model_1_results.Error != nil {
-					if sqlsExecutor.session.IsSqlFuc == true {
-						err := sqlsExecutor.session.Rollback()
-						if err != nil {
-							return nil, nil, err
+				if sqlModel == 1 {
+					if model_1_results.Error != nil {
+						if sqlsExecutor.session.IsSqlFuc == true {
+							err1 := sqlsExecutor.session.Rollback()
+							if err1 != nil {
+								return nil, nil, err1
+							}
 						}
+						return nil, nil, model_1_results.Error
 					}
-					return nil, nil, model_1_results.Error
-				}
 
-				resultSlice[i] = make([]map[string]interface{}, len(model_1_results.Results))
-				resultSlice[i] = model_1_results.Results
+					resultSlice[i] = make([]map[string]interface{}, len(model_1_results.Results))
+					resultSlice[i] = model_1_results.Results
 
-			} else {
-				if err != nil {
-					if sqlsExecutor.session.IsSqlFuc == true {
-						err := sqlsExecutor.session.Rollback()
-						if err != nil {
-							return nil, nil, err
+				} else if sqlModel == 2 {
+					if err != nil {
+						if sqlsExecutor.session.IsSqlFuc == true {
+							err1 := sqlsExecutor.session.Rollback()
+							if err1 != nil {
+								return nil, nil, err1
+							}
+						}
+						return nil, nil, err
+					}
+
+					resultMap := make([]map[string]interface{}, 1)
+					resultMap[0] = make(map[string]interface{})
+
+					//todo all database support LastInsertId
+					LastInsertId, _ := model_2_results.LastInsertId()
+
+					resultMap[0]["LastInsertId"] = LastInsertId
+					RowsAffected, err := model_2_results.RowsAffected()
+					if err != nil {
+						if sqlsExecutor.session.IsSqlFuc == true {
+							err1 := sqlsExecutor.session.Rollback()
+							if err1 != nil {
+								return nil, nil, err1
+							}
 						}
+						return nil, nil, err
 					}
-					return nil, nil, err
+					resultMap[0]["RowsAffected"] = RowsAffected
+					resultSlice[i] = make([]map[string]interface{}, 1)
+					resultSlice[i] = resultMap
+
+				} else {
+					resultSlice[i] = nil
 				}
 
-				resultMap := make([]map[string]interface{}, 1)
-				resultMap[0] = make(map[string]interface{})
+			}
+
+		} else {
+			switch sqlsExecutor.parmas.(type) {
+			case []map[string]interface{}:
+				parmaSlice = sqlsExecutor.parmas.([]map[string]interface{})
 
-				//todo all database support LastInsertId
-				LastInsertId, _ := model_2_results.LastInsertId()
+			default:
+				if sqlsExecutor.session.IsSqlFuc == true {
+					err1 := sqlsExecutor.session.Rollback()
+					if err1 != nil {
+						return nil, nil, err1
+					}
+				}
+				return nil, nil, ErrParamsType
+			}
 
-				resultMap[0]["LastInsertId"] = LastInsertId
-				RowsAffected, err := model_2_results.RowsAffected()
-				if err != nil {
-					return nil, nil, err
+			for i, _ := range sqlsSlice {
+				sqlStr := strings.TrimSpace(sqlsSlice[i])
+				sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
+				if parmaSlice[i] == nil {
+					switch sqlCmd {
+					case "select", "desc":
+						model_1_results = sqlsExecutor.session.Sql(sqlStr).Query()
+						sqlModel = 1
+					case "insert", "delete", "update", "create", "drop":
+						model_2_results, err = sqlsExecutor.session.Sql(sqlStr).Execute()
+						sqlModel = 2
+					default:
+						sqlModel = 3
+					}
+				} else {
+					key := NewV4().String() + time.Now().String()
+					sqlsExecutor.session.Engine.AddSql(key, sqlStr)
+					switch sqlCmd {
+					case "select", "desc":
+						model_1_results = sqlsExecutor.session.SqlMapClient(key, &parmaSlice[i]).Query()
+						sqlModel = 1
+					case "insert", "delete", "update", "create", "drop":
+						model_2_results, err = sqlsExecutor.session.SqlMapClient(key, &parmaSlice[i]).Execute()
+						sqlModel = 2
+					default:
+						sqlModel = 3
+					}
+					sqlsExecutor.session.Engine.RemoveSql(key)
 				}
-				resultMap[0]["RowsAffected"] = RowsAffected
-				resultSlice[i] = make([]map[string]interface{}, 1)
-				resultSlice[i] = resultMap
 
+				if sqlModel == 1 {
+					if model_1_results.Error != nil {
+						if sqlsExecutor.session.IsSqlFuc == true {
+							err1 := sqlsExecutor.session.Rollback()
+							if err1 != nil {
+								return nil, nil, err1
+							}
+						}
+						return nil, nil, model_1_results.Error
+					}
+
+					resultSlice[i] = make([]map[string]interface{}, len(model_1_results.Results))
+					resultSlice[i] = model_1_results.Results
+
+				} else if sqlModel == 2 {
+					if err != nil {
+						if sqlsExecutor.session.IsSqlFuc == true {
+							err1 := sqlsExecutor.session.Rollback()
+							if err1 != nil {
+								return nil, nil, err1
+							}
+						}
+						return nil, nil, err
+					}
+
+					resultMap := make([]map[string]interface{}, 1)
+					resultMap[0] = make(map[string]interface{})
+
+					//todo all database support LastInsertId
+					LastInsertId, _ := model_2_results.LastInsertId()
+
+					resultMap[0]["LastInsertId"] = LastInsertId
+					RowsAffected, err := model_2_results.RowsAffected()
+					if err != nil {
+						if sqlsExecutor.session.IsSqlFuc == true {
+							err1 := sqlsExecutor.session.Rollback()
+							if err1 != nil {
+								return nil, nil, err1
+							}
+						}
+						return nil, nil, err
+					}
+					resultMap[0]["RowsAffected"] = RowsAffected
+					resultSlice[i] = make([]map[string]interface{}, 1)
+					resultSlice[i] = resultMap
+
+				} else {
+					resultSlice[i] = nil
+				}
 			}
+
 		}
 
 		if sqlsExecutor.session.IsSqlFuc == true {
-			err := sqlsExecutor.session.Commit()
-			if err != nil {
-				return nil, nil, err
+			err1 := sqlsExecutor.session.Commit()
+			if err1 != nil {
+				return nil, nil, err1
 			}
 		}
 		return resultSlice, nil, nil
 
 	case map[string]string:
-		if sqlsExecutor.session.IsSqlFuc == true {
-			err := sqlsExecutor.session.Begin()
-			if err != nil {
-				return nil, nil, err
-			}
-		}
+
 		sqlsMap := sqlsExecutor.sqls.(map[string]string)
 		n := len(sqlsMap)
 		resultsMap := make(map[string][]map[string]interface{}, n)
 		parmasMap := make(map[string]map[string]interface{}, n)
-		switch sqlsExecutor.parmas.(type) {
-		case map[string]map[string]interface{}:
-			parmasMap = sqlsExecutor.parmas.(map[string]map[string]interface{})
-
-		default:
-			if sqlsExecutor.session.IsSqlFuc == true {
-				err := sqlsExecutor.session.Rollback()
-				if err != nil {
-					return nil, nil, err
-				}
-			}
-			return nil, nil, ErrParamsType
-		}
 
-		for k, _ := range sqlsMap {
-			sqlStr := strings.TrimSpace(sqlsMap[k])
-			sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
-			if parmasMap[k] == nil {
+		if sqlsExecutor.parmas == nil {
+			for k, _ := range sqlsMap {
+				sqlStr := strings.TrimSpace(sqlsMap[k])
+				sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
 				switch sqlCmd {
 				case "select", "desc":
+					sqlModel = 1
 					model_1_results = sqlsExecutor.session.Sql(sqlStr).Query()
 
-				case "insert", "delete", "update", "create":
-					model_2_results, err = sqlsExecutor.session.Sql(sqlStr).Execute()
+				case "insert", "delete", "update", "create", "drop":
 					sqlModel = 2
+					model_2_results, err = sqlsExecutor.session.Sql(sqlStr).Execute()
+
+				default:
+					sqlModel = 3
 				}
-			} else {
-				key := NewV4().String() + time.Now().String()
-				sqlsExecutor.session.Engine.AddSql(key, sqlStr)
-				parmaMap := parmasMap[k]
-				switch sqlCmd {
-				case "select", "desc":
-					model_1_results = sqlsExecutor.session.SqlMapClient(key, &parmaMap).Query()
-				case "insert", "delete", "update", "create":
-					model_2_results, err = sqlsExecutor.session.SqlMapClient(key, &parmaMap).Execute()
-					sqlModel = 2
+
+				if sqlModel == 1 {
+					if model_1_results.Error != nil {
+						if sqlsExecutor.session.IsSqlFuc == true {
+							err1 := sqlsExecutor.session.Rollback()
+							if err1 != nil {
+								return nil, nil, err1
+							}
+						}
+						return nil, nil, model_1_results.Error
+					}
+
+					resultsMap[k] = make([]map[string]interface{}, len(model_1_results.Results))
+					resultsMap[k] = model_1_results.Results
+
+				} else if sqlModel == 2 {
+					if err != nil {
+						if sqlsExecutor.session.IsSqlFuc == true {
+							err1 := sqlsExecutor.session.Rollback()
+							if err1 != nil {
+								return nil, nil, err1
+							}
+						}
+						return nil, nil, err
+					}
+
+					resultMap := make([]map[string]interface{}, 1)
+					resultMap[0] = make(map[string]interface{})
+
+					//todo all database support LastInsertId
+					LastInsertId, _ := model_2_results.LastInsertId()
+
+					resultMap[0]["LastInsertId"] = LastInsertId
+					RowsAffected, err := model_2_results.RowsAffected()
+					if err != nil {
+						if sqlsExecutor.session.IsSqlFuc == true {
+							err1 := sqlsExecutor.session.Rollback()
+							if err1 != nil {
+								return nil, nil, err1
+							}
+						}
+						return nil, nil, err
+					}
+					resultMap[0]["RowsAffected"] = RowsAffected
+					resultsMap[k] = make([]map[string]interface{}, 1)
+					resultsMap[k] = resultMap
+
+				} else {
+					resultsMap[k] = nil
 				}
-				sqlsExecutor.session.Engine.RemoveSql(key)
+
 			}
+		} else {
+			switch sqlsExecutor.parmas.(type) {
+			case map[string]map[string]interface{}:
+				parmasMap = sqlsExecutor.parmas.(map[string]map[string]interface{})
 
-			if sqlModel == 1 {
-				if model_1_results.Error != nil {
-					if sqlsExecutor.session.IsSqlFuc == true {
-						err := sqlsExecutor.session.Rollback()
-						if err != nil {
-							return nil, nil, err
-						}
+			default:
+				if sqlsExecutor.session.IsSqlFuc == true {
+					err1 := sqlsExecutor.session.Rollback()
+					if err1 != nil {
+						return nil, nil, err1
+					}
+				}
+				return nil, nil, ErrParamsType
+			}
+
+			for k, _ := range sqlsMap {
+				sqlStr := strings.TrimSpace(sqlsMap[k])
+				sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
+				if parmasMap[k] == nil {
+					switch sqlCmd {
+					case "select", "desc":
+						sqlModel = 1
+						model_1_results = sqlsExecutor.session.Sql(sqlStr).Query()
+
+					case "insert", "delete", "update", "create", "drop":
+						sqlModel = 2
+						model_2_results, err = sqlsExecutor.session.Sql(sqlStr).Execute()
+
+					default:
+						sqlModel = 3
+					}
+				} else {
+					key := NewV4().String() + time.Now().String()
+					sqlsExecutor.session.Engine.AddSql(key, sqlStr)
+					parmaMap := parmasMap[k]
+					switch sqlCmd {
+					case "select", "desc":
+						sqlModel = 1
+						model_1_results = sqlsExecutor.session.SqlMapClient(key, &parmaMap).Query()
+
+					case "insert", "delete", "update", "create", "drop":
+						sqlModel = 2
+						model_2_results, err = sqlsExecutor.session.SqlMapClient(key, &parmaMap).Execute()
+
+					default:
+						sqlModel = 3
 					}
-					return nil, nil, model_1_results.Error
+					sqlsExecutor.session.Engine.RemoveSql(key)
 				}
 
-				resultsMap[k] = make([]map[string]interface{}, len(model_1_results.Results))
-				resultsMap[k] = model_1_results.Results
+				if sqlModel == 1 {
+					if model_1_results.Error != nil {
+						if sqlsExecutor.session.IsSqlFuc == true {
+							err1 := sqlsExecutor.session.Rollback()
+							if err1 != nil {
+								return nil, nil, err1
+							}
+						}
+						return nil, nil, model_1_results.Error
+					}
 
-			} else {
-				if err != nil {
-					if sqlsExecutor.session.IsSqlFuc == true {
-						err := sqlsExecutor.session.Rollback()
-						if err != nil {
-							return nil, nil, err
+					resultsMap[k] = make([]map[string]interface{}, len(model_1_results.Results))
+					resultsMap[k] = model_1_results.Results
+
+				} else if sqlModel == 2 {
+					if err != nil {
+						if sqlsExecutor.session.IsSqlFuc == true {
+							err1 := sqlsExecutor.session.Rollback()
+							if err1 != nil {
+								return nil, nil, err1
+							}
 						}
+						return nil, nil, err
 					}
-					return nil, nil, err
-				}
 
-				resultMap := make([]map[string]interface{}, 1)
-				resultMap[0] = make(map[string]interface{})
+					resultMap := make([]map[string]interface{}, 1)
+					resultMap[0] = make(map[string]interface{})
 
-				//todo all database support LastInsertId
-				LastInsertId, _ := model_2_results.LastInsertId()
+					//todo all database support LastInsertId
+					LastInsertId, _ := model_2_results.LastInsertId()
 
-				resultMap[0]["LastInsertId"] = LastInsertId
-				RowsAffected, err := model_2_results.RowsAffected()
-				if err != nil {
-					if sqlsExecutor.session.IsSqlFuc == true {
-						err := sqlsExecutor.session.Rollback()
-						if err != nil {
-							return nil, nil, err
+					resultMap[0]["LastInsertId"] = LastInsertId
+					RowsAffected, err := model_2_results.RowsAffected()
+					if err != nil {
+						if sqlsExecutor.session.IsSqlFuc == true {
+							err1 := sqlsExecutor.session.Rollback()
+							if err1 != nil {
+								return nil, nil, err1
+							}
 						}
+						return nil, nil, err
 					}
-					return nil, nil, err
-				}
-				resultMap[0]["RowsAffected"] = RowsAffected
-				resultsMap[k] = make([]map[string]interface{}, 1)
-				resultsMap[k] = resultMap
+					resultMap[0]["RowsAffected"] = RowsAffected
+					resultsMap[k] = make([]map[string]interface{}, 1)
+					resultsMap[k] = resultMap
 
+				} else {
+					resultsMap[k] = nil
+				}
 			}
+
 		}
+
 		if sqlsExecutor.session.IsSqlFuc == true {
-			err := sqlsExecutor.session.Commit()
-			if err != nil {
-				return nil, nil, err
+			err1 := sqlsExecutor.session.Commit()
+			if err1 != nil {
+				return nil, nil, err1
 			}
 		}
 		return nil, resultsMap, nil