2017-09-13 07:18:22 +02:00
|
|
|
// Copyright 2017 The Xorm Authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package xorm
|
|
|
|
|
|
|
|
import (
|
2020-03-22 16:12:55 +01:00
|
|
|
"xorm.io/xorm/core"
|
2017-09-13 07:18:22 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
// Query runs a raw sql and return records as []map[string][]byte
|
2019-06-23 17:22:43 +02:00
|
|
|
func (session *Session) Query(sqlOrArgs ...interface{}) ([]map[string][]byte, error) {
|
2017-09-13 07:18:22 +02:00
|
|
|
if session.isAutoClose {
|
|
|
|
defer session.Close()
|
|
|
|
}
|
|
|
|
|
2020-03-22 16:12:55 +01:00
|
|
|
sqlStr, args, err := session.statement.GenQuerySQL(sqlOrArgs...)
|
2018-01-27 16:20:59 +01:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2017-09-13 07:18:22 +02:00
|
|
|
return session.queryBytes(sqlStr, args...)
|
|
|
|
}
|
|
|
|
|
2021-07-04 15:10:46 +02:00
|
|
|
func (session *Session) rows2Strings(rows *core.Rows) (resultsSlice []map[string]string, err error) {
|
|
|
|
fields, err := rows.Columns()
|
|
|
|
if err != nil {
|
2018-12-12 02:01:41 +01:00
|
|
|
return nil, err
|
|
|
|
}
|
2021-07-04 15:10:46 +02:00
|
|
|
types, err := rows.ColumnTypes()
|
2017-09-13 07:18:22 +02:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2021-07-04 15:10:46 +02:00
|
|
|
|
2017-09-13 07:18:22 +02:00
|
|
|
for rows.Next() {
|
2021-07-04 15:10:46 +02:00
|
|
|
result, err := session.engine.row2mapStr(rows, types, fields)
|
2017-09-13 07:18:22 +02:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
resultsSlice = append(resultsSlice, result)
|
|
|
|
}
|
2021-08-13 01:11:42 +02:00
|
|
|
if rows.Err() != nil {
|
|
|
|
return nil, rows.Err()
|
|
|
|
}
|
2017-09-13 07:18:22 +02:00
|
|
|
|
|
|
|
return resultsSlice, nil
|
|
|
|
}
|
|
|
|
|
2021-07-04 15:10:46 +02:00
|
|
|
func (session *Session) rows2SliceString(rows *core.Rows) (resultsSlice [][]string, err error) {
|
2018-12-12 02:01:41 +01:00
|
|
|
fields, err := rows.Columns()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2021-07-04 15:10:46 +02:00
|
|
|
types, err := rows.ColumnTypes()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2018-12-12 02:01:41 +01:00
|
|
|
for rows.Next() {
|
2021-07-04 15:10:46 +02:00
|
|
|
record, err := session.engine.row2sliceStr(rows, types, fields)
|
2018-12-12 02:01:41 +01:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
resultsSlice = append(resultsSlice, record)
|
|
|
|
}
|
2021-08-13 01:11:42 +02:00
|
|
|
if rows.Err() != nil {
|
|
|
|
return nil, rows.Err()
|
|
|
|
}
|
2018-12-12 02:01:41 +01:00
|
|
|
|
|
|
|
return resultsSlice, nil
|
|
|
|
}
|
|
|
|
|
2017-09-13 07:18:22 +02:00
|
|
|
// QueryString runs a raw sql and return records as []map[string]string
|
2019-06-23 17:22:43 +02:00
|
|
|
func (session *Session) QueryString(sqlOrArgs ...interface{}) ([]map[string]string, error) {
|
2017-09-13 07:18:22 +02:00
|
|
|
if session.isAutoClose {
|
|
|
|
defer session.Close()
|
|
|
|
}
|
|
|
|
|
2020-03-22 16:12:55 +01:00
|
|
|
sqlStr, args, err := session.statement.GenQuerySQL(sqlOrArgs...)
|
2018-01-27 16:20:59 +01:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2017-09-13 07:18:22 +02:00
|
|
|
rows, err := session.queryRows(sqlStr, args...)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
defer rows.Close()
|
|
|
|
|
2021-07-04 15:10:46 +02:00
|
|
|
return session.rows2Strings(rows)
|
2017-09-13 07:18:22 +02:00
|
|
|
}
|
|
|
|
|
2018-12-12 02:01:41 +01:00
|
|
|
// QuerySliceString runs a raw sql and return records as [][]string
|
2019-06-23 17:22:43 +02:00
|
|
|
func (session *Session) QuerySliceString(sqlOrArgs ...interface{}) ([][]string, error) {
|
2018-12-12 02:01:41 +01:00
|
|
|
if session.isAutoClose {
|
|
|
|
defer session.Close()
|
|
|
|
}
|
|
|
|
|
2020-03-22 16:12:55 +01:00
|
|
|
sqlStr, args, err := session.statement.GenQuerySQL(sqlOrArgs...)
|
2018-12-12 02:01:41 +01:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
rows, err := session.queryRows(sqlStr, args...)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
defer rows.Close()
|
|
|
|
|
2021-07-04 15:10:46 +02:00
|
|
|
return session.rows2SliceString(rows)
|
2018-12-12 02:01:41 +01:00
|
|
|
}
|
|
|
|
|
2021-08-13 01:11:42 +02:00
|
|
|
func (session *Session) rows2Interfaces(rows *core.Rows) (resultsSlice []map[string]interface{}, err error) {
|
|
|
|
fields, err := rows.Columns()
|
|
|
|
if err != nil {
|
2017-09-13 07:18:22 +02:00
|
|
|
return nil, err
|
|
|
|
}
|
2021-08-13 01:11:42 +02:00
|
|
|
types, err := rows.ColumnTypes()
|
2017-09-13 07:18:22 +02:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
for rows.Next() {
|
2021-08-13 01:11:42 +02:00
|
|
|
result, err := session.engine.row2mapInterface(rows, types, fields)
|
2017-09-13 07:18:22 +02:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
resultsSlice = append(resultsSlice, result)
|
|
|
|
}
|
2021-08-13 01:11:42 +02:00
|
|
|
if rows.Err() != nil {
|
|
|
|
return nil, rows.Err()
|
|
|
|
}
|
2017-09-13 07:18:22 +02:00
|
|
|
|
|
|
|
return resultsSlice, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// QueryInterface runs a raw sql and return records as []map[string]interface{}
|
2019-06-23 17:22:43 +02:00
|
|
|
func (session *Session) QueryInterface(sqlOrArgs ...interface{}) ([]map[string]interface{}, error) {
|
2017-09-13 07:18:22 +02:00
|
|
|
if session.isAutoClose {
|
|
|
|
defer session.Close()
|
|
|
|
}
|
|
|
|
|
2020-03-22 16:12:55 +01:00
|
|
|
sqlStr, args, err := session.statement.GenQuerySQL(sqlOrArgs...)
|
2018-01-27 16:20:59 +01:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2017-09-13 07:18:22 +02:00
|
|
|
rows, err := session.queryRows(sqlStr, args...)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
defer rows.Close()
|
|
|
|
|
2021-08-13 01:11:42 +02:00
|
|
|
return session.rows2Interfaces(rows)
|
2017-09-13 07:18:22 +02:00
|
|
|
}
|