123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526 |
- package xorm
- import (
- "database/sql"
- "strings"
- "time"
- )
- type SqlsExecutor struct {
- session *Session
- sqls interface{}
- parmas interface{}
- err error
- }
- func (sqlsExecutor *SqlsExecutor) Execute() ([][]map[string]interface{}, map[string][]map[string]interface{}, error) {
- defer sqlsExecutor.session.resetStatement()
- defer sqlsExecutor.session.Close()
- if sqlsExecutor.err != nil {
- return nil, nil, sqlsExecutor.err
- }
- var model_1_results *ResultMap
- var model_2_results sql.Result
- var err error
- sqlModel := 1
- if sqlsExecutor.session.isSqlFunc == true {
- err := sqlsExecutor.session.Begin()
- if err != nil {
- return nil, nil, err
- }
- }
- switch sqlsExecutor.sqls.(type) {
- case string:
- sqlStr := strings.TrimSpace(sqlsExecutor.sqls.(string))
- sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
- if sqlsExecutor.parmas == nil {
- switch sqlCmd {
- case "select":
- 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 {
- switch sqlsExecutor.parmas.(type) {
- case []map[string]interface{}:
- parmaMap, _ := sqlsExecutor.parmas.([]map[string]interface{})
- key := NewV4().String() + time.Now().String()
- sqlsExecutor.session.engine.AddSql(key, sqlStr)
- switch sqlCmd {
- case "select":
- model_1_results = sqlsExecutor.session.SqlMapClient(key, &parmaMap[0]).Query()
- 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, _ := sqlsExecutor.parmas.(map[string]interface{})
- key := NewV4().String() + time.Now().String()
- sqlsExecutor.session.engine.AddSql(key, sqlStr)
- switch sqlCmd {
- case "select":
- model_1_results = sqlsExecutor.session.SqlMapClient(key, &parmaMap).Query()
- 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.isSqlFunc == true {
- err1 := sqlsExecutor.session.Rollback()
- if err1 != nil {
- return nil, nil, err1
- }
- }
- return nil, nil, ErrParamsType
- }
- }
- sqlsExecutor.session.isSqlFunc = true
- resultSlice := make([][]map[string]interface{}, 1)
- if sqlModel == 1 {
- if model_1_results.Error != nil {
- if sqlsExecutor.session.isSqlFunc == 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.Result))
- resultSlice[0] = model_1_results.Result
- if sqlsExecutor.session.isSqlFunc == true {
- err1 := sqlsExecutor.session.Commit()
- if err1 != nil {
- return nil, nil, err1
- }
- }
- return resultSlice, nil, nil
- } else if sqlModel == 2 {
- if err != nil {
- if sqlsExecutor.session.isSqlFunc == 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 {
- return nil, nil, err
- }
- resultMap[0]["RowsAffected"] = RowsAffected
- resultSlice[0] = resultMap
- if sqlsExecutor.session.isSqlFunc == true {
- err1 := sqlsExecutor.session.Commit()
- if err1 != nil {
- return nil, nil, err1
- }
- }
- return resultSlice, nil, nil
- } else {
- resultSlice[0] = nil
- }
- case []string:
- sqlsSlice := sqlsExecutor.sqls.([]string)
- n := len(sqlsSlice)
- resultSlice := make([][]map[string]interface{}, n)
- parmaSlice := make([]map[string]interface{}, n)
- if sqlsExecutor.parmas == nil {
- for i, _ := range sqlsSlice {
- sqlsExecutor.session.isSqlFunc = true
- sqlStr := strings.TrimSpace(sqlsSlice[i])
- sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
- switch sqlCmd {
- case "select":
- 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
- }
- sqlsExecutor.session.isSqlFunc = true
- if sqlModel == 1 {
- if model_1_results.Error != nil {
- if sqlsExecutor.session.isSqlFunc == true {
- err1 := sqlsExecutor.session.Rollback()
- if err1 != nil {
- return nil, nil, err1
- }
- }
- return nil, nil, model_1_results.Error
- }
- resultSlice[i] = model_1_results.Result
- } else if sqlModel == 2 {
- if err != nil {
- if sqlsExecutor.session.isSqlFunc == 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.isSqlFunc == 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
- }
- }
- } else {
- switch sqlsExecutor.parmas.(type) {
- case []map[string]interface{}:
- parmaSlice = sqlsExecutor.parmas.([]map[string]interface{})
- default:
- if sqlsExecutor.session.isSqlFunc == true {
- err1 := sqlsExecutor.session.Rollback()
- if err1 != nil {
- return nil, nil, err1
- }
- }
- return nil, nil, ErrParamsType
- }
- for i, _ := range sqlsSlice {
- sqlsExecutor.session.isSqlFunc = true
- sqlStr := strings.TrimSpace(sqlsSlice[i])
- sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
- if parmaSlice[i] == nil {
- switch sqlCmd {
- case "select":
- 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":
- 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)
- }
- sqlsExecutor.session.isSqlFunc = true
- if sqlModel == 1 {
- if model_1_results.Error != nil {
- if sqlsExecutor.session.isSqlFunc == true {
- err1 := sqlsExecutor.session.Rollback()
- if err1 != nil {
- return nil, nil, err1
- }
- }
- return nil, nil, model_1_results.Error
- }
- resultSlice[i] = model_1_results.Result
- } else if sqlModel == 2 {
- if err != nil {
- if sqlsExecutor.session.isSqlFunc == 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.isSqlFunc == 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.isSqlFunc == true {
- err1 := sqlsExecutor.session.Commit()
- if err1 != nil {
- return nil, nil, err1
- }
- }
- return resultSlice, nil, nil
- case map[string]string:
- 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)
- if sqlsExecutor.parmas == nil {
- for k, _ := range sqlsMap {
- sqlsExecutor.session.isSqlFunc = true
- sqlStr := strings.TrimSpace(sqlsMap[k])
- sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
- switch sqlCmd {
- case "select":
- 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
- }
- sqlsExecutor.session.isSqlFunc = true
- if sqlModel == 1 {
- if model_1_results.Error != nil {
- if sqlsExecutor.session.isSqlFunc == true {
- err1 := sqlsExecutor.session.Rollback()
- if err1 != nil {
- return nil, nil, err1
- }
- }
- return nil, nil, model_1_results.Error
- }
- resultsMap[k] = model_1_results.Result
- } else if sqlModel == 2 {
- if err != nil {
- if sqlsExecutor.session.isSqlFunc == 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.isSqlFunc == 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
- }
- }
- } else {
- switch sqlsExecutor.parmas.(type) {
- case map[string]map[string]interface{}:
- parmasMap = sqlsExecutor.parmas.(map[string]map[string]interface{})
- default:
- if sqlsExecutor.session.isSqlFunc == true {
- err1 := sqlsExecutor.session.Rollback()
- if err1 != nil {
- return nil, nil, err1
- }
- }
- return nil, nil, ErrParamsType
- }
- for k, _ := range sqlsMap {
- sqlsExecutor.session.isSqlFunc = true
- sqlStr := strings.TrimSpace(sqlsMap[k])
- sqlCmd := strings.ToLower(strings.Split(sqlStr, " ")[0])
- if parmasMap[k] == nil {
- switch sqlCmd {
- case "select":
- 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":
- 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
- }
- sqlsExecutor.session.engine.RemoveSql(key)
- }
- sqlsExecutor.session.isSqlFunc = true
- if sqlModel == 1 {
- if model_1_results.Error != nil {
- if sqlsExecutor.session.isSqlFunc == true {
- err1 := sqlsExecutor.session.Rollback()
- if err1 != nil {
- return nil, nil, err1
- }
- }
- return nil, nil, model_1_results.Error
- }
- resultsMap[k] = model_1_results.Result
- } else if sqlModel == 2 {
- if err != nil {
- if sqlsExecutor.session.isSqlFunc == 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.isSqlFunc == 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
- }
- }
- }
- if sqlsExecutor.session.isSqlFunc == true {
- err1 := sqlsExecutor.session.Commit()
- if err1 != nil {
- return nil, nil, err1
- }
- }
- return nil, resultsMap, nil
- }
- return nil, nil, nil
- }
|