Skip to content

Commit

Permalink
回滚
Browse files Browse the repository at this point in the history
  • Loading branch information
zhuxiujia committed May 18, 2019
1 parent 1092de2 commit 9cd9e1c
Show file tree
Hide file tree
Showing 16 changed files with 501 additions and 299 deletions.
45 changes: 31 additions & 14 deletions GoMybatis.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package GoMybatis

import (
"bytes"
"encoding/json"
"github.com/zhuxiujia/GoMybatis/ast"
"github.com/zhuxiujia/GoMybatis/lib/github.com/beevik/etree"
"github.com/zhuxiujia/GoMybatis/utils"
Expand Down Expand Up @@ -365,7 +364,7 @@ func exeMethodByXml(elementType ElementType, beanName string, sessionEngine Sess
defer func() {
if sessionEngine.LogEnable() {
var RowsAffected = "0"
if err == nil && res != "" {
if err == nil && res != nil {
RowsAffected = strconv.Itoa(len(res))
}
sessionEngine.LogSystem().SendLog("[GoMybatis] [", session.Id(), "] ReturnRows <== "+RowsAffected)
Expand Down Expand Up @@ -419,7 +418,7 @@ func closeSession(factory *SessionFactory, session Session) {

func buildSql(proxyArg ProxyArg, nodes []ast.Node, sqlBuilder SqlBuilder) (Session, string, error) {
var session Session
var argMap = make(map[string]interface{})
var paramMap = make(map[string]interface{})
var tagArgsLen = proxyArg.TagArgsLen
var argsLen = proxyArg.ArgsLen //参数长度,除session参数外。
var customLen = 0
Expand Down Expand Up @@ -449,17 +448,12 @@ func buildSql(proxyArg ProxyArg, nodes []ast.Node, sqlBuilder SqlBuilder) (Sessi
//插入2份参数,兼容大小写不敏感的参数
var lowerKey = utils.LowerFieldFirstName(proxyArg.TagArgs[argIndex].Name)
var upperKey = utils.UpperFieldFirstName(proxyArg.TagArgs[argIndex].Name)
argMap[lowerKey] = argInterface
argMap[upperKey] = argInterface
paramMap[lowerKey] = argInterface
paramMap[upperKey] = argInterface
} else {
argMap[DefaultOneArg] = argInterface
paramMap[DefaultOneArg] = argInterface
}
}

var paramMap = map[string]interface{}{}
var b,_=json.Marshal(argMap)
json.Unmarshal(b,&paramMap)

if customLen == 1 && customIndex != -1 {
//只有一个结构体参数,需要展开它的成员变量 加入到map
var tag *TagArg
Expand Down Expand Up @@ -488,10 +482,33 @@ func scanStructArgFields(v reflect.Value, tag *TagArg) map[string]interface{} {
if t.Kind() != reflect.Struct {
panic(`[GoMybatis] the scanParamterBean() arg is not a struct type!,type =` + t.String())
}
var b, _ = json.Marshal(v.Interface())
json.Unmarshal(b, &parameters)
var structArg = make(map[string]interface{})
for i := 0; i < t.NumField(); i++ {
var typeValue = t.Field(i)
var field = v.Field(i)

var obj interface{}
if field.Kind() == reflect.Ptr {
if field.CanAddr(){
obj = field.Addr().Interface()
}
} else {
if field.CanInterface() {
obj = field.Interface()
}
}
var jsonKey = typeValue.Tag.Get(`json`)
if jsonKey != "" {
parameters[jsonKey] = obj
structArg[jsonKey] = obj

} else {
parameters[typeValue.Name] = obj
structArg[typeValue.Name] = obj
}
}
if tag != nil {
parameters[tag.Name] = parameters
parameters[tag.Name] = structArg
}
return parameters
}
Expand Down
22 changes: 10 additions & 12 deletions GoMybatisEngine_test.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package GoMybatis

import (
"encoding/json"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/zhuxiujia/GoMybatis/example"
Expand Down Expand Up @@ -151,18 +150,17 @@ type TestSession struct {
func (it *TestSession) Id() string {
return "sadf"
}
func (it *TestSession) Query(sqlorArgs string) (string, error) {
resultsSlice := make([]map[string]interface{}, 0)

result := make(map[string]interface{})
result["name"] = "活动1"
result["id"] = "125"
result["pc_link"] ="http://www.baidu.com"
result["h5_link"] = "http://www.baidu.com"
result["remark"] = "活动1"
func (it *TestSession) Query(sqlorArgs string) ([]map[string][]byte, error) {
resultsSlice := make([]map[string][]byte, 0)

result := make(map[string][]byte)
result["name"] = []byte("活动1")
result["id"] = []byte("125")
result["pc_link"] = []byte("http://www.baidu.com")
result["h5_link"] = []byte("http://www.baidu.com")
result["remark"] = []byte("活动1")
resultsSlice = append(resultsSlice, result)
var b,_=json.Marshal(resultsSlice)
return string(b), nil
return resultsSlice, nil
}
func (it *TestSession) Exec(sqlorArgs string) (*Result, error) {
return nil, nil
Expand Down
120 changes: 65 additions & 55 deletions GoMybatisRowsDecoder.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,67 +4,27 @@ import (
"database/sql"
"fmt"
"reflect"
"strings"
"strconv"
"time"
)

func rows2maps(rows *sql.Rows) ( string, error) {
columns, err := rows.Columns()
func rows2maps(rows *sql.Rows) (resultsSlice []map[string][]byte, err error) {
fields, err := rows.Columns()
if err != nil {
panic(err.Error())
}
values := make([]sql.RawBytes, len(columns))
scanArgs := make([]interface{}, len(values))
for i := range values {
scanArgs[i] = &values[i]
return nil, err
}
list := "["
for rows.Next() {
err = rows.Scan(scanArgs...)
result, err := row2map(rows, fields)
if err != nil {
fmt.Println("log:", err)
panic(err.Error())
}

row := "{"
var value string
for i, col := range values {
if col == nil {
value = "NULL"
} else {
value = string(col)
}

columName := strings.ToLower(columns[i])

cell := fmt.Sprintf(`"%v":"%v"`, columName, value)
row = row + cell + ","
return nil, err
}
row = row[0 : len(row)-1]
row += "}"
list = list + row + ","

resultsSlice = append(resultsSlice, result)
}
list = list[0 : len(list)-1]
list += "]"
fmt.Println(list)
return list,nil
return resultsSlice, nil
}
// fields, err := rows.Columns()
// if err != nil {
// return nil, err
// }
// for rows.Next() {
// result, err := row2map(rows, fields)
// if err != nil {
// return nil, err
// }
// resultsSlice = append(resultsSlice, result)
// }
// return resultsSlice, nil
//}

func row2map(rows *sql.Rows, fields []string) (resultsMap map[string]interface{}, err error) {
result := make(map[string]interface{})
func row2map(rows *sql.Rows, fields []string) (resultsMap map[string][]byte, err error) {
result := make(map[string][]byte)
scanResultContainers := make([]interface{}, len(fields))
for i := 0; i < len(fields); i++ {
var scanResultContainer interface{}
Expand All @@ -73,13 +33,15 @@ func row2map(rows *sql.Rows, fields []string) (resultsMap map[string]interface{}
if err := rows.Scan(scanResultContainers...); err != nil {
return nil, err
}

for ii, key := range fields {
rawValue := reflect.Indirect(reflect.ValueOf(scanResultContainers[ii]))
//if row is null then ignore
if rawValue.Interface() == nil {
result[key] = []byte{}
continue
}

if data, err := value2Bytes(&rawValue); err == nil {
result[key] = data
} else {
Expand All @@ -88,9 +50,57 @@ func row2map(rows *sql.Rows, fields []string) (resultsMap map[string]interface{}
}
return result, nil
}
func value2Bytes(rawValue *reflect.Value) (interface{}, error) {
if rawValue.IsValid() && rawValue.CanInterface() {
return rawValue.Interface(), nil
func value2Bytes(rawValue *reflect.Value) ([]byte, error) {
str, err := value2String(rawValue)
if err != nil {
return nil, err
}
return []byte(str), nil
}

func value2String(rawValue *reflect.Value) (str string, err error) {
aa := reflect.TypeOf((*rawValue).Interface())
vv := reflect.ValueOf((*rawValue).Interface())
switch aa.Kind() {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
str = strconv.FormatInt(vv.Int(), 10)
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
str = strconv.FormatUint(vv.Uint(), 10)
case reflect.Float32, reflect.Float64:
str = strconv.FormatFloat(vv.Float(), 'f', -1, 64)
case reflect.String:
str = vv.String()
case reflect.Array, reflect.Slice:
switch aa.Elem().Kind() {
case reflect.Uint8:
data := rawValue.Interface().([]byte)
str = string(data)
if str == "\x00" {
str = "0"
}
default:
err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
}
// time type
case reflect.Struct:
if aa.ConvertibleTo(TimeType) {
str = vv.Convert(TimeType).Interface().(time.Time).Format(time.RFC3339Nano)
} else {
err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
}
case reflect.Bool:
str = strconv.FormatBool(vv.Bool())
case reflect.Complex128, reflect.Complex64:
str = fmt.Sprintf("%v", vv.Complex())
/* TODO: unsupported types below
case reflect.Map:
case reflect.Ptr:
case reflect.Uintptr:
case reflect.UnsafePointer:
case reflect.Chan, reflect.Func, reflect.Interface:
*/
default:
err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
}
return nil, nil
return
}
Loading

0 comments on commit 9cd9e1c

Please sign in to comment.