|
|
@@ -1,221 +1,320 @@
|
|
|
package xorm
|
|
|
|
|
|
import (
|
|
|
+ "database/sql"
|
|
|
"strings"
|
|
|
"time"
|
|
|
)
|
|
|
|
|
|
-type SqlExecutor struct {
|
|
|
+type SqlsExecutor struct {
|
|
|
session *Session
|
|
|
sqls interface{}
|
|
|
parmas interface{}
|
|
|
err error
|
|
|
}
|
|
|
|
|
|
-func (sqlExecutor *SqlExecutor) Execute() ([][]map[string]interface{}, map[string][]map[string]interface{}, error) {
|
|
|
- if sqlExecutor.err != nil {
|
|
|
- return nil, nil, sqlExecutor.err
|
|
|
+func (sqlsExecutor *SqlsExecutor) Execute() ([][]map[string]interface{}, map[string][]map[string]interface{}, error) {
|
|
|
+ if sqlsExecutor.err != nil {
|
|
|
+ return nil, nil, sqlsExecutor.err
|
|
|
}
|
|
|
+ var model_1_results ResultMap
|
|
|
+ var model_2_results sql.Result
|
|
|
+ var err error
|
|
|
|
|
|
- switch sqlExecutor.sqls.(type) {
|
|
|
+ sqlModel := 1
|
|
|
+
|
|
|
+ switch sqlsExecutor.sqls.(type) {
|
|
|
case string:
|
|
|
- sqlstr := strings.TrimLeft(sqlExecutor.sqls.(string), " \n")
|
|
|
- sqlCmd := strings.ToLower(strings.Split(sqlstr, " ")[0])
|
|
|
+ sqlStr := strings.TrimSpace(sqlsExecutor.sqls.(string))
|
|
|
+ sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
|
|
|
|
|
|
- if sqlExecutor.parmas == nil {
|
|
|
+ if sqlsExecutor.parmas == nil {
|
|
|
switch sqlCmd {
|
|
|
case "select", "desc":
|
|
|
- rsults := sqlExecutor.session.Sql(sqlstr).Query()
|
|
|
- if rsults.Error != nil {
|
|
|
- return nil, nil, rsults.Error
|
|
|
- }
|
|
|
- resultSlice := make([][]map[string]interface{}, 1)
|
|
|
- resultSlice[0] = rsults.Results
|
|
|
- return resultSlice, nil, nil
|
|
|
- case "insert", "delete", "update":
|
|
|
- rsults, err := sqlExecutor.session.Sql(sqlstr).Execute()
|
|
|
- if err != nil {
|
|
|
- return nil, nil, err
|
|
|
- }
|
|
|
+ model_1_results = sqlsExecutor.session.Sql(sqlStr).Query()
|
|
|
|
|
|
- resultSlice := make([][]map[string]interface{}, 1)
|
|
|
- resultMap := make([]map[string]interface{}, 1)
|
|
|
- resultMap[0] = make(map[string]interface{})
|
|
|
-
|
|
|
- //todo all database support LastInsertId
|
|
|
- LastInsertId, _ := rsults.LastInsertId()
|
|
|
-
|
|
|
- resultMap[0]["LastInsertId"] = LastInsertId
|
|
|
- RowsAffected, err := rsults.RowsAffected()
|
|
|
- if err != nil {
|
|
|
- return nil, nil, err
|
|
|
- }
|
|
|
- resultMap[0]["RowsAffected"] = RowsAffected
|
|
|
- resultSlice[0] = resultMap
|
|
|
- return resultSlice, nil, nil
|
|
|
+ case "insert", "delete", "update", "create":
|
|
|
+ model_2_results, err = sqlsExecutor.session.Sql(sqlStr).Execute()
|
|
|
+ sqlModel = 2
|
|
|
}
|
|
|
} else {
|
|
|
- switch sqlExecutor.parmas.(type) {
|
|
|
+ switch sqlsExecutor.parmas.(type) {
|
|
|
case []map[string]interface{}:
|
|
|
- parmaMap, ok := sqlExecutor.parmas.([]map[string]interface{})
|
|
|
+ parmaMap, ok := sqlsExecutor.parmas.([]map[string]interface{})
|
|
|
if !ok {
|
|
|
return nil, nil, ErrParamsType
|
|
|
}
|
|
|
+ key := NewV4().String() + time.Now().String()
|
|
|
+ sqlsExecutor.session.Engine.AddSql(key, sqlStr)
|
|
|
switch sqlCmd {
|
|
|
case "select", "desc":
|
|
|
- rsults := sqlExecutor.session.Sql(sqlstr, &parmaMap[0]).Query()
|
|
|
- if rsults.Error != nil {
|
|
|
- return nil, nil, rsults.Error
|
|
|
- }
|
|
|
- resultSlice := make([][]map[string]interface{}, 1)
|
|
|
- resultSlice[0] = rsults.Results
|
|
|
- return resultSlice, nil, nil
|
|
|
-
|
|
|
- case "insert", "delete", "update":
|
|
|
- rsults, err := sqlExecutor.session.Sql(sqlstr, &parmaMap[0]).Execute()
|
|
|
- if err != nil {
|
|
|
- return nil, nil, err
|
|
|
- }
|
|
|
+ model_1_results = sqlsExecutor.session.SqlMapClient(key, &parmaMap[0]).Query()
|
|
|
|
|
|
- resultSlice := make([][]map[string]interface{}, 1)
|
|
|
- resultMap := make([]map[string]interface{}, 1)
|
|
|
- resultMap[0] = make(map[string]interface{})
|
|
|
- LastInsertId, _ := rsults.LastInsertId()
|
|
|
+ case "insert", "delete", "update", "create":
|
|
|
+ model_2_results, err = sqlsExecutor.session.SqlMapClient(key, &parmaMap[0]).Execute()
|
|
|
+ sqlModel = 2
|
|
|
|
|
|
- resultMap[0]["LastInsertId"] = LastInsertId
|
|
|
- RowsAffected, err := rsults.RowsAffected()
|
|
|
- if err != nil {
|
|
|
- return nil, nil, err
|
|
|
- }
|
|
|
- resultMap[0]["RowsAffected"] = RowsAffected
|
|
|
- resultSlice[0] = resultMap
|
|
|
- return resultSlice, nil, nil
|
|
|
}
|
|
|
+ sqlsExecutor.session.Engine.RemoveSql(key)
|
|
|
case map[string]interface{}:
|
|
|
- parmaMap, ok := sqlExecutor.parmas.(map[string]interface{})
|
|
|
+ parmaMap, ok := sqlsExecutor.parmas.(map[string]interface{})
|
|
|
if !ok {
|
|
|
return nil, nil, ErrParamsType
|
|
|
}
|
|
|
+ key := NewV4().String() + time.Now().String()
|
|
|
+ sqlsExecutor.session.Engine.AddSql(key, sqlStr)
|
|
|
switch sqlCmd {
|
|
|
case "select", "desc":
|
|
|
- key := NewV4().String() + time.Now().String()
|
|
|
- sqlExecutor.session.Engine.AddSql(key, sqlstr)
|
|
|
+ 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
|
|
|
+ }
|
|
|
+ sqlsExecutor.session.Engine.RemoveSql(key)
|
|
|
+ default:
|
|
|
+ return nil, nil, ErrParamsType
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- rsults := sqlExecutor.session.SqlMapClient(key, &parmaMap).Query()
|
|
|
- sqlExecutor.session.Engine.RemoveSql(key)
|
|
|
+ resultSlice := make([][]map[string]interface{}, 1)
|
|
|
|
|
|
- if rsults.Error != nil {
|
|
|
- return nil, nil, rsults.Error
|
|
|
- }
|
|
|
+ if sqlModel == 1 {
|
|
|
+ if model_1_results.Error != nil {
|
|
|
+ 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 {
|
|
|
+ if err != nil {
|
|
|
+ return nil, nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ resultMap := make([]map[string]interface{}, 1)
|
|
|
+ resultMap[0] = make(map[string]interface{})
|
|
|
|
|
|
- resultSlice := make([][]map[string]interface{}, 1)
|
|
|
- resultSlice[0] = rsults.Results
|
|
|
- return resultSlice, nil, nil
|
|
|
- case "insert", "delete", "update":
|
|
|
- rsults, err := sqlExecutor.session.Sql(sqlstr, &parmaMap).Execute()
|
|
|
- if err != nil {
|
|
|
- return nil, nil, err
|
|
|
+ //todo all database support LastInsertId
|
|
|
+ LastInsertId, _ := model_2_results.LastInsertId()
|
|
|
+
|
|
|
+ resultMap[0]["LastInsertId"] = LastInsertId
|
|
|
+ RowsAffected, err := model_2_results.RowsAffected()
|
|
|
+ if err != nil {
|
|
|
+ return nil, nil, err
|
|
|
+ }
|
|
|
+ resultMap[0]["RowsAffected"] = RowsAffected
|
|
|
+ resultSlice[0] = resultMap
|
|
|
+ return resultSlice, nil, 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 {
|
|
|
+ switch sqlCmd {
|
|
|
+ case "select", "desc":
|
|
|
+ model_1_results = sqlsExecutor.session.Sql(sqlStr).Query()
|
|
|
+
|
|
|
+ case "insert", "delete", "update", "create":
|
|
|
+ model_2_results, err = sqlsExecutor.session.Sql(sqlStr).Execute()
|
|
|
+ sqlModel = 2
|
|
|
+ }
|
|
|
+ } 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
|
|
|
+ }
|
|
|
}
|
|
|
+ return nil, nil, model_1_results.Error
|
|
|
+ }
|
|
|
|
|
|
- resultSlice := make([][]map[string]interface{}, 1)
|
|
|
- resultMap := make([]map[string]interface{}, 1)
|
|
|
- resultMap[0] = make(map[string]interface{})
|
|
|
- LastInsertId, _ := rsults.LastInsertId()
|
|
|
+ resultSlice[i] = make([]map[string]interface{}, len(model_1_results.Results))
|
|
|
+ resultSlice[i] = model_1_results.Results
|
|
|
|
|
|
- resultMap[0]["LastInsertId"] = LastInsertId
|
|
|
- RowsAffected, err := rsults.RowsAffected()
|
|
|
- if err != nil {
|
|
|
- return nil, nil, err
|
|
|
+ } else {
|
|
|
+ if err != nil {
|
|
|
+ if sqlsExecutor.session.IsSqlFuc == true {
|
|
|
+ err := sqlsExecutor.session.Rollback()
|
|
|
+ if err != nil {
|
|
|
+ return nil, nil, err
|
|
|
+ }
|
|
|
}
|
|
|
- resultMap[0]["RowsAffected"] = RowsAffected
|
|
|
- resultSlice[0] = resultMap
|
|
|
- return resultSlice, nil, nil
|
|
|
+ return nil, nil, err
|
|
|
}
|
|
|
- default:
|
|
|
- return nil, nil, ErrParamsType
|
|
|
+
|
|
|
+ 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 {
|
|
|
+ return nil, nil, err
|
|
|
+ }
|
|
|
+ resultMap[0]["RowsAffected"] = RowsAffected
|
|
|
+ resultSlice[i] = make([]map[string]interface{}, 1)
|
|
|
+ resultSlice[i] = resultMap
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
- case []string:
|
|
|
- if sqlExecutor.session.IsSqlFuc == true {
|
|
|
- err := sqlExecutor.session.Begin()
|
|
|
+
|
|
|
+ if sqlsExecutor.session.IsSqlFuc == true {
|
|
|
+ err := sqlsExecutor.session.Commit()
|
|
|
if err != nil {
|
|
|
return nil, nil, err
|
|
|
}
|
|
|
}
|
|
|
+ return resultSlice, nil, nil
|
|
|
|
|
|
case map[string]string:
|
|
|
- if sqlExecutor.session.IsSqlFuc == true {
|
|
|
- err := sqlExecutor.session.Begin()
|
|
|
+ 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 {
|
|
|
+ switch sqlCmd {
|
|
|
+ case "select", "desc":
|
|
|
+ model_1_results = sqlsExecutor.session.Sql(sqlStr).Query()
|
|
|
+
|
|
|
+ case "insert", "delete", "update", "create":
|
|
|
+ model_2_results, err = sqlsExecutor.session.Sql(sqlStr).Execute()
|
|
|
+ sqlModel = 2
|
|
|
+ }
|
|
|
+ } 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
|
|
|
+ }
|
|
|
+ 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
|
|
|
+ }
|
|
|
+ }
|
|
|
+ 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 err != nil {
|
|
|
+ if sqlsExecutor.session.IsSqlFuc == true {
|
|
|
+ err := sqlsExecutor.session.Rollback()
|
|
|
+ if err != nil {
|
|
|
+ return nil, nil, err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ 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 {
|
|
|
+ err := sqlsExecutor.session.Rollback()
|
|
|
+ if err != nil {
|
|
|
+ return nil, nil, err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return nil, nil, err
|
|
|
+ }
|
|
|
+ resultMap[0]["RowsAffected"] = RowsAffected
|
|
|
+ resultsMap[k] = make([]map[string]interface{}, 1)
|
|
|
+ resultsMap[k] = resultMap
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if sqlsExecutor.session.IsSqlFuc == true {
|
|
|
+ err := sqlsExecutor.session.Commit()
|
|
|
+ if err != nil {
|
|
|
+ return nil, nil, err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return nil, resultsMap, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
return nil, nil, nil
|
|
|
}
|
|
|
-
|
|
|
-//func (sqlExecutor *SqlExecutor) Execute() (interface{}, error) {
|
|
|
-
|
|
|
-// switch sqlExecutor.sqls.(type) {
|
|
|
-// case string:
|
|
|
-// sqlstr := strings.TrimLeft(sqlExecutor.sqls.(string), " \n")
|
|
|
-// sqlCmd := strings.ToLower(strings.Split(sqlstr, " ")[0])
|
|
|
-// switch sqlExecutor.parmasCount {
|
|
|
-// case 0:
|
|
|
-// switch sqlCmd {
|
|
|
-// case "select", "desc":
|
|
|
-// rsults := sqlExecutor.session.Sql(sqlstr).Query()
|
|
|
-// if rsults.Error != nil {
|
|
|
-// return nil, rsults.Error
|
|
|
-// }
|
|
|
-// return rsults.Results, nil
|
|
|
-// case "insert", "delete", "update":
|
|
|
-// return sqlExecutor.session.Sql(sqlstr).Execute()
|
|
|
-// }
|
|
|
-// case 1:
|
|
|
-// switch sqlExecutor.parmas.(type) {
|
|
|
-// case map[string]interface{}:
|
|
|
-// switch sqlCmd {
|
|
|
-// case "select", "desc":
|
|
|
-
|
|
|
-// case "insert", "delete", "update":
|
|
|
-
|
|
|
-// }
|
|
|
-// default:
|
|
|
-// switch sqlCmd {
|
|
|
-// case "select", "desc":
|
|
|
-
|
|
|
-// case "insert", "delete", "update":
|
|
|
-
|
|
|
-// }
|
|
|
-// }
|
|
|
-// default:
|
|
|
-// switch sqlCmd {
|
|
|
-// case "select", "desc":
|
|
|
-
|
|
|
-// case "insert", "delete", "update":
|
|
|
-
|
|
|
-// }
|
|
|
-// }
|
|
|
-// case []string:
|
|
|
-// if sqlExecutor.session.IsSqlFuc == true {
|
|
|
-// err := sqlExecutor.session.Begin()
|
|
|
-// if err != nil {
|
|
|
-// return nil, err
|
|
|
-// }
|
|
|
-// }
|
|
|
-
|
|
|
-// case map[string]string:
|
|
|
-// if sqlExecutor.session.IsSqlFuc == true {
|
|
|
-// err := sqlExecutor.session.Begin()
|
|
|
-// if err != nil {
|
|
|
-// return nil, err
|
|
|
-// }
|
|
|
-// }
|
|
|
-
|
|
|
-// }
|
|
|
-
|
|
|
-// return 1, nil
|
|
|
-//}
|