MapToSlice: return error instead of panic

This commit is contained in:
Lunny Xiao 2016-06-29 17:56:53 +08:00
parent edde1c5ab8
commit 1768a08d82
1 changed files with 11 additions and 3 deletions

14
db.go
View File

@ -4,6 +4,7 @@ import (
"database/sql" "database/sql"
"database/sql/driver" "database/sql/driver"
"errors" "errors"
"fmt"
"reflect" "reflect"
"regexp" "regexp"
"sync" "sync"
@ -15,12 +16,19 @@ func MapToSlice(query string, mp interface{}) (string, []interface{}, error) {
return "", []interface{}{}, ErrNoMapPointer return "", []interface{}{}, ErrNoMapPointer
} }
args := make([]interface{}, 0) args := make([]interface{}, 0, len(vv.Elem().MapKeys()))
var err error
query = re.ReplaceAllStringFunc(query, func(src string) string { query = re.ReplaceAllStringFunc(query, func(src string) string {
args = append(args, vv.Elem().MapIndex(reflect.ValueOf(src[1:])).Interface()) v := vv.Elem().MapIndex(reflect.ValueOf(src[1:]))
if !v.IsValid() {
err = fmt.Errorf("map key %s is missing", src[1:])
} else {
args = append(args, v.Interface())
}
return "?" return "?"
}) })
return query, args, nil
return query, args, err
} }
func StructToSlice(query string, st interface{}) (string, []interface{}, error) { func StructToSlice(query string, st interface{}) (string, []interface{}, error) {