Expose ScanString / ScanInterface and etc #2039
76
scan.go
76
scan.go
@ -129,25 +129,6 @@ func genScanResultsByBean(bean interface{}) (interface{}, bool, error) {
|
||||
}
|
||||
}
|
||||
|
||||
func row2mapBytes(rows *core.Rows, types []*sql.ColumnType, fields []string) (map[string][]byte, error) {
|
||||
var scanResults = make([]interface{}, len(fields))
|
||||
for i := 0; i < len(fields); i++ {
|
||||
var s sql.NullString
|
||||
scanResults[i] = &s
|
||||
}
|
||||
|
||||
if err := rows.Scan(scanResults...); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
result := make(map[string][]byte, len(fields))
|
||||
for ii, key := range fields {
|
||||
s := scanResults[ii].(*sql.NullString)
|
||||
result[key] = []byte(s.String)
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (engine *Engine) scanStringInterface(rows *core.Rows, fields []string, types []*sql.ColumnType) ([]interface{}, error) {
|
||||
var scanResults = make([]interface{}, len(types))
|
||||
for i := 0; i < len(types); i++ {
|
||||
@ -227,29 +208,6 @@ func (engine *Engine) scanInterfaces(rows *core.Rows, fields []string, types []*
|
||||
return scanResultContainers, nil
|
||||
}
|
||||
|
||||
func rows2maps(rows *core.Rows) (resultsSlice []map[string][]byte, err error) {
|
||||
fields, err := rows.Columns()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
types, err := rows.ColumnTypes()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for rows.Next() {
|
||||
result, err := row2mapBytes(rows, types, fields)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
resultsSlice = append(resultsSlice, result)
|
||||
}
|
||||
if rows.Err() != nil {
|
||||
return nil, rows.Err()
|
||||
}
|
||||
|
||||
return resultsSlice, nil
|
||||
}
|
||||
|
||||
////////////////////
|
||||
// row -> map[string]interface{}
|
||||
|
||||
@ -387,6 +345,40 @@ func (engine *Engine) ScanStringMaps(rows *core.Rows) (resultsSlice []map[string
|
||||
return resultsSlice, nil
|
||||
}
|
||||
|
||||
////////////////////
|
||||
// row -> map[string][]byte
|
||||
|
||||
func convertMapStr2Bytes(m map[string]string) map[string][]byte {
|
||||
var r = make(map[string][]byte, len(m))
|
||||
for k, v := range m {
|
||||
r[k] = []byte(v)
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func (engine *Engine) scanByteMaps(rows *core.Rows) (resultsSlice []map[string][]byte, err error) {
|
||||
fields, err := rows.Columns()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
types, err := rows.ColumnTypes()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for rows.Next() {
|
||||
result, err := engine.row2mapStr(rows, types, fields)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
resultsSlice = append(resultsSlice, convertMapStr2Bytes(result))
|
||||
}
|
||||
if rows.Err() != nil {
|
||||
return nil, rows.Err()
|
||||
}
|
||||
|
||||
return resultsSlice, nil
|
||||
}
|
||||
|
||||
////////////////////
|
||||
// row -> []string
|
||||
|
||||
|
@ -40,7 +40,13 @@ func (session *Session) cacheDelete(table *schemas.Table, tableName, sqlStr stri
|
||||
pkColumns := table.PKColumns()
|
||||
ids, err := caches.GetCacheSql(cacher, tableName, newsql, args)
|
||||
if err != nil {
|
||||
resultsSlice, err := session.queryBytes(newsql, args...)
|
||||
rows, err := session.queryRows(newsql, args...)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
resultsSlice, err := session.engine.ScanStringMaps(rows)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -53,9 +59,9 @@ func (session *Session) cacheDelete(table *schemas.Table, tableName, sqlStr stri
|
||||
if v, ok := data[col.Name]; !ok {
|
||||
return errors.New("no id")
|
||||
} else if col.SQLType.IsText() {
|
||||
pk = append(pk, string(v))
|
||||
pk = append(pk, v)
|
||||
} else if col.SQLType.IsNumeric() {
|
||||
id, err = strconv.ParseInt(string(v), 10, 64)
|
||||
id, err = strconv.ParseInt(v, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -4,16 +4,6 @@
|
||||
|
||||
package xorm
|
||||
|
||||
func (session *Session) queryBytes(sqlStr string, args ...interface{}) ([]map[string][]byte, error) {
|
||||
rows, err := session.queryRows(sqlStr, args...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
return rows2maps(rows)
|
||||
}
|
||||
|
||||
// Query runs a raw sql and return records as []map[string][]byte
|
||||
func (session *Session) Query(sqlOrArgs ...interface{}) ([]map[string][]byte, error) {
|
||||
if session.isAutoClose {
|
||||
@ -25,7 +15,13 @@ func (session *Session) Query(sqlOrArgs ...interface{}) ([]map[string][]byte, er
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return session.queryBytes(sqlStr, args...)
|
||||
rows, err := session.queryRows(sqlStr, args...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
return session.engine.scanByteMaps(rows)
|
||||
}
|
||||
|
||||
// QueryString runs a raw sql and return records as []map[string]string
|
||||
|
Loading…
Reference in New Issue
Block a user