xormplus 9 年之前
父节点
当前提交
ef5f3b3442
共有 1 个文件被更改,包括 221 次插入0 次删除
  1. 221 0
      sql_executor.go

+ 221 - 0
sql_executor.go

@@ -0,0 +1,221 @@
+package xorm
+
+import (
+	"strings"
+	"time"
+)
+
+type SqlExecutor 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
+	}
+
+	switch sqlExecutor.sqls.(type) {
+	case string:
+		sqlstr := strings.TrimLeft(sqlExecutor.sqls.(string), " \n")
+		sqlCmd := strings.ToLower(strings.Split(sqlstr, " ")[0])
+
+		if sqlExecutor.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
+				}
+
+				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
+			}
+		} else {
+			switch sqlExecutor.parmas.(type) {
+			case []map[string]interface{}:
+				parmaMap, ok := sqlExecutor.parmas.([]map[string]interface{})
+				if !ok {
+					return nil, nil, ErrParamsType
+				}
+				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
+					}
+
+					resultSlice := make([][]map[string]interface{}, 1)
+					resultMap := make([]map[string]interface{}, 1)
+					resultMap[0] = make(map[string]interface{})
+					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 map[string]interface{}:
+				parmaMap, ok := sqlExecutor.parmas.(map[string]interface{})
+				if !ok {
+					return nil, nil, ErrParamsType
+				}
+				switch sqlCmd {
+				case "select", "desc":
+					key := NewV4().String() + time.Now().String()
+					sqlExecutor.session.Engine.AddSql(key, sqlstr)
+
+					rsults := sqlExecutor.session.SqlMapClient(key, &parmaMap).Query()
+					sqlExecutor.session.Engine.RemoveSql(key)
+
+					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).Execute()
+					if err != nil {
+						return nil, nil, err
+					}
+
+					resultSlice := make([][]map[string]interface{}, 1)
+					resultMap := make([]map[string]interface{}, 1)
+					resultMap[0] = make(map[string]interface{})
+					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
+				}
+			default:
+				return nil, nil, ErrParamsType
+			}
+		}
+	case []string:
+		if sqlExecutor.session.IsSqlFuc == true {
+			err := sqlExecutor.session.Begin()
+			if err != nil {
+				return nil, nil, err
+			}
+		}
+
+	case map[string]string:
+		if sqlExecutor.session.IsSqlFuc == true {
+			err := sqlExecutor.session.Begin()
+			if err != nil {
+				return nil, nil, err
+			}
+		}
+
+	}
+
+	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
+//}