Skip to content

Commit 44deace

Browse files
committed
add QueryResult function
1 parent 0f556a8 commit 44deace

11 files changed

+161
-41
lines changed

engine.go

+7
Original file line numberDiff line numberDiff line change
@@ -1362,6 +1362,13 @@ func (engine *Engine) QueryValue(sqlorArgs ...interface{}) (resultsSlice []map[s
13621362
return session.QueryValue(sqlorArgs...)
13631363
}
13641364

1365+
// Query a raw sql and return records as Result
1366+
func (engine *Engine) QueryResult(sqlorArgs ...interface{}) (result *ResultValue) {
1367+
session := engine.NewSession()
1368+
defer session.Close()
1369+
return session.QueryResult(sqlorArgs...)
1370+
}
1371+
13651372
// QueryString runs a raw sql and return records as []map[string]string
13661373
func (engine *Engine) QueryString(sqlorArgs ...interface{}) ([]map[string]string, error) {
13671374
session := engine.NewSession()

interface.go

+2
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ type Interface interface {
5252
QueryBytes(sqlOrAgrs ...interface{}) (resultsSlice []map[string][]byte, err error)
5353
QueryInterface(sqlorArgs ...interface{}) ([]map[string]interface{}, error)
5454
QueryString(sqlorArgs ...interface{}) ([]map[string]string, error)
55+
QueryValue(sqlorArgs ...interface{}) ([]map[string]Value, error)
56+
QueryResult(sqlorArgs ...interface{}) (result *ResultValue)
5557
Rows(bean interface{}) (*Rows, error)
5658
SetExpr(string, string) *Session
5759
SQL(interface{}, ...interface{}) *Session

session_plus.go

+65-21
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,50 @@ import (
1717
"github.com/xormplus/core"
1818
)
1919

20+
type Record map[string]Value
21+
type Result []Record
22+
23+
type ResultValue struct {
24+
Result Result
25+
Error error
26+
}
27+
28+
func (resultValue *ResultValue) List() (Result, error) {
29+
return resultValue.Result, resultValue.Error
30+
}
31+
32+
func (resultValue *ResultValue) Count() (int, error) {
33+
if resultValue.Error != nil {
34+
return 0, resultValue.Error
35+
}
36+
if resultValue.Result == nil {
37+
return 0, nil
38+
}
39+
return len(resultValue.Result), nil
40+
}
41+
42+
func (resultValue *ResultValue) ListPage(firstResult int, maxResults int) (Result, error) {
43+
if resultValue.Error != nil {
44+
return nil, resultValue.Error
45+
}
46+
if resultValue.Result == nil {
47+
return nil, nil
48+
}
49+
if firstResult > maxResults {
50+
return nil, ErrParamsFormat
51+
}
52+
if firstResult < 0 {
53+
return nil, ErrParamsFormat
54+
}
55+
if maxResults < 0 {
56+
return nil, ErrParamsFormat
57+
}
58+
if maxResults > len(resultValue.Result) {
59+
return nil, ErrParamsFormat
60+
}
61+
return resultValue.Result[(firstResult - 1):maxResults], resultValue.Error
62+
}
63+
2064
type ResultBean struct {
2165
Has bool
2266
Result interface{}
@@ -102,29 +146,29 @@ func (resultBean *ResultBean) XmlIndent(prefix string, indent string, recordTag
102146
}
103147

104148
type ResultMap struct {
105-
Results []map[string]interface{}
106-
Error error
149+
Result []map[string]interface{}
150+
Error error
107151
}
108152

109153
func (resultMap *ResultMap) List() ([]map[string]interface{}, error) {
110-
return resultMap.Results, resultMap.Error
154+
return resultMap.Result, resultMap.Error
111155
}
112156

113157
func (resultMap *ResultMap) Count() (int, error) {
114158
if resultMap.Error != nil {
115159
return 0, resultMap.Error
116160
}
117-
if resultMap.Results == nil {
161+
if resultMap.Result == nil {
118162
return 0, nil
119163
}
120-
return len(resultMap.Results), nil
164+
return len(resultMap.Result), nil
121165
}
122166

123167
func (resultMap *ResultMap) ListPage(firstResult int, maxResults int) ([]map[string]interface{}, error) {
124168
if resultMap.Error != nil {
125169
return nil, resultMap.Error
126170
}
127-
if resultMap.Results == nil {
171+
if resultMap.Result == nil {
128172
return nil, nil
129173
}
130174
if firstResult > maxResults {
@@ -136,25 +180,25 @@ func (resultMap *ResultMap) ListPage(firstResult int, maxResults int) ([]map[str
136180
if maxResults < 0 {
137181
return nil, ErrParamsFormat
138182
}
139-
if maxResults > len(resultMap.Results) {
183+
if maxResults > len(resultMap.Result) {
140184
return nil, ErrParamsFormat
141185
}
142-
return resultMap.Results[(firstResult - 1):maxResults], resultMap.Error
186+
return resultMap.Result[(firstResult - 1):maxResults], resultMap.Error
143187
}
144188

145189
func (resultMap *ResultMap) Json() (string, error) {
146190

147191
if resultMap.Error != nil {
148192
return "", resultMap.Error
149193
}
150-
return JSONString(resultMap.Results, true)
194+
return JSONString(resultMap.Result, true)
151195
}
152196

153197
func (resultMap *ResultMap) Xml() (string, error) {
154198
if resultMap.Error != nil {
155199
return "", resultMap.Error
156200
}
157-
results, err := anyxml.Xml(resultMap.Results)
201+
results, err := anyxml.Xml(resultMap.Result)
158202
if err != nil {
159203
return "", err
160204
}
@@ -166,7 +210,7 @@ func (resultMap *ResultMap) XmlIndent(prefix string, indent string, recordTag st
166210
return "", resultMap.Error
167211
}
168212

169-
results, err := anyxml.XmlIndent(resultMap.Results, prefix, indent, recordTag)
213+
results, err := anyxml.XmlIndent(resultMap.Result, prefix, indent, recordTag)
170214
if err != nil {
171215
return "", err
172216
}
@@ -178,7 +222,7 @@ func (resultMap *ResultMap) SaveAsCSV(filename string, headers []string, perm os
178222
return resultMap.Error
179223
}
180224

181-
dataset, err := NewDatasetWithData(headers, resultMap.Results, true)
225+
dataset, err := NewDatasetWithData(headers, resultMap.Result, true)
182226
if err != nil {
183227
return err
184228
}
@@ -196,7 +240,7 @@ func (resultMap *ResultMap) SaveAsTSV(filename string, headers []string, perm os
196240
return resultMap.Error
197241
}
198242

199-
dataset, err := NewDatasetWithData(headers, resultMap.Results, true)
243+
dataset, err := NewDatasetWithData(headers, resultMap.Result, true)
200244
if err != nil {
201245
return err
202246
}
@@ -214,7 +258,7 @@ func (resultMap *ResultMap) SaveAsHTML(filename string, headers []string, perm o
214258
return resultMap.Error
215259
}
216260

217-
dataset, err := NewDatasetWithData(headers, resultMap.Results, true)
261+
dataset, err := NewDatasetWithData(headers, resultMap.Result, true)
218262
if err != nil {
219263
return err
220264
}
@@ -229,7 +273,7 @@ func (resultMap *ResultMap) SaveAsXML(filename string, headers []string, perm os
229273
return resultMap.Error
230274
}
231275

232-
dataset, err := NewDatasetWithData(headers, resultMap.Results, false)
276+
dataset, err := NewDatasetWithData(headers, resultMap.Result, false)
233277
if err != nil {
234278
return err
235279
}
@@ -247,7 +291,7 @@ func (resultMap *ResultMap) SaveAsXMLWithTagNamePrefixIndent(tagName string, pri
247291
return resultMap.Error
248292
}
249293

250-
dataset, err := NewDatasetWithData(headers, resultMap.Results, false)
294+
dataset, err := NewDatasetWithData(headers, resultMap.Result, false)
251295
if err != nil {
252296
return err
253297
}
@@ -265,7 +309,7 @@ func (resultMap *ResultMap) SaveAsYAML(filename string, headers []string, perm o
265309
return resultMap.Error
266310
}
267311

268-
dataset, err := NewDatasetWithData(headers, resultMap.Results, false)
312+
dataset, err := NewDatasetWithData(headers, resultMap.Result, false)
269313
if err != nil {
270314
return err
271315
}
@@ -283,7 +327,7 @@ func (resultMap *ResultMap) SaveAsJSON(filename string, headers []string, perm o
283327
return resultMap.Error
284328
}
285329

286-
dataset, err := NewDatasetWithData(headers, resultMap.Results, false)
330+
dataset, err := NewDatasetWithData(headers, resultMap.Result, false)
287331
if err != nil {
288332
return err
289333
}
@@ -301,7 +345,7 @@ func (resultMap *ResultMap) SaveAsXLSX(filename string, headers []string, perm o
301345
return resultMap.Error
302346
}
303347

304-
dataset, err := NewDatasetWithData(headers, resultMap.Results, true)
348+
dataset, err := NewDatasetWithData(headers, resultMap.Result, true)
305349
if err != nil {
306350
return err
307351
}
@@ -504,7 +548,7 @@ func (session *Session) Query() *ResultMap {
504548
}
505549
}
506550
}
507-
r := &ResultMap{Results: result, Error: err}
551+
r := &ResultMap{Result: result, Error: err}
508552
return r
509553
}
510554

@@ -548,7 +592,7 @@ func (session *Session) QueryWithDateFormat(dateFormat string) *ResultMap {
548592
}
549593
}
550594
}
551-
r := &ResultMap{Results: result, Error: err}
595+
r := &ResultMap{Result: result, Error: err}
552596
return r
553597
}
554598

session_query.go

+15
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,21 @@ func (session *Session) QueryValue(sqlorArgs ...interface{}) ([]map[string]Value
121121

122122
}
123123

124+
// Query runs a raw sql and return records as ResultValue
125+
func (session *Session) QueryResult(sqlorArgs ...interface{}) *ResultValue {
126+
if session.isAutoClose {
127+
defer session.Close()
128+
}
129+
130+
sqlStr, args, err := session.genQuerySQL(sqlorArgs...)
131+
if err != nil {
132+
return &ResultValue{Error: err}
133+
}
134+
135+
result, err := session.queryResult(sqlStr, args...)
136+
return &ResultValue{Result: result, Error: err}
137+
}
138+
124139
// Query runs a raw sql and return records as []map[string][]byte
125140
func (session *Session) QueryBytes(sqlorArgs ...interface{}) ([]map[string][]byte, error) {
126141
if session.isAutoClose {

session_raw.go

+53
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,33 @@ func row2mapValue(rows *core.Rows, fields []string) (resultsMap map[string]Value
158158
return result, nil
159159
}
160160

161+
func row2Record(rows *core.Rows, fields []string) (record Record, err error) {
162+
record = make(Record)
163+
scanResultContainers := make([]interface{}, len(fields))
164+
for i := 0; i < len(fields); i++ {
165+
var scanResultContainer interface{}
166+
scanResultContainers[i] = &scanResultContainer
167+
}
168+
if err := rows.Scan(scanResultContainers...); err != nil {
169+
return nil, err
170+
}
171+
172+
for ii, key := range fields {
173+
rawValue := reflect.Indirect(reflect.ValueOf(scanResultContainers[ii]))
174+
if rawValue.Interface() == nil {
175+
record[key] = nil
176+
continue
177+
}
178+
179+
if data, err := value2Value(&rawValue); err == nil {
180+
record[key] = data
181+
} else {
182+
return nil, err // !nashtsai! REVIEW, should return err or just error log?
183+
}
184+
}
185+
return record, nil
186+
}
187+
161188
func rows2maps(rows *core.Rows) (resultsSlice []map[string][]byte, err error) {
162189
fields, err := rows.Columns()
163190
if err != nil {
@@ -190,6 +217,22 @@ func rows2mapsValue(rows *core.Rows) (resultsSlice []map[string]Value, err error
190217
return resultsSlice, nil
191218
}
192219

220+
func rows2Result(rows *core.Rows) (result Result, err error) {
221+
fields, err := rows.Columns()
222+
if err != nil {
223+
return nil, err
224+
}
225+
for rows.Next() {
226+
r, err := row2mapValue(rows, fields)
227+
if err != nil {
228+
return nil, err
229+
}
230+
result = append(result, r)
231+
}
232+
233+
return result, nil
234+
}
235+
193236
func (session *Session) queryBytes(sqlStr string, args ...interface{}) ([]map[string][]byte, error) {
194237
rows, err := session.queryRows(sqlStr, args...)
195238
if err != nil {
@@ -210,6 +253,16 @@ func (session *Session) queryValue(sqlStr string, args ...interface{}) ([]map[st
210253
return rows2mapsValue(rows)
211254
}
212255

256+
func (session *Session) queryResult(sqlStr string, args ...interface{}) (Result, error) {
257+
rows, err := session.queryRows(sqlStr, args...)
258+
if err != nil {
259+
return nil, err
260+
}
261+
defer rows.Close()
262+
263+
return rows2Result(rows)
264+
}
265+
213266
func (session *Session) exec(sqlStr string, args ...interface{}) (sql.Result, error) {
214267
defer session.resetStatement()
215268

sql_executor.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,8 @@ func (sqlsExecutor *SqlsExecutor) Execute() ([][]map[string]interface{}, map[str
108108
return nil, nil, model_1_results.Error
109109
}
110110

111-
resultSlice[0] = make([]map[string]interface{}, len(model_1_results.Results))
112-
resultSlice[0] = model_1_results.Results
111+
resultSlice[0] = make([]map[string]interface{}, len(model_1_results.Result))
112+
resultSlice[0] = model_1_results.Result
113113
if sqlsExecutor.session.isSqlFunc == true {
114114
err1 := sqlsExecutor.session.Commit()
115115
if err1 != nil {
@@ -185,7 +185,7 @@ func (sqlsExecutor *SqlsExecutor) Execute() ([][]map[string]interface{}, map[str
185185
return nil, nil, model_1_results.Error
186186
}
187187

188-
resultSlice[i] = model_1_results.Results
188+
resultSlice[i] = model_1_results.Result
189189

190190
} else if sqlModel == 2 {
191191
if err != nil {
@@ -282,7 +282,7 @@ func (sqlsExecutor *SqlsExecutor) Execute() ([][]map[string]interface{}, map[str
282282
return nil, nil, model_1_results.Error
283283
}
284284

285-
resultSlice[i] = model_1_results.Results
285+
resultSlice[i] = model_1_results.Result
286286

287287
} else if sqlModel == 2 {
288288
if err != nil {
@@ -368,7 +368,7 @@ func (sqlsExecutor *SqlsExecutor) Execute() ([][]map[string]interface{}, map[str
368368
return nil, nil, model_1_results.Error
369369
}
370370

371-
resultsMap[k] = model_1_results.Results
371+
resultsMap[k] = model_1_results.Result
372372

373373
} else if sqlModel == 2 {
374374
if err != nil {
@@ -471,7 +471,7 @@ func (sqlsExecutor *SqlsExecutor) Execute() ([][]map[string]interface{}, map[str
471471
return nil, nil, model_1_results.Error
472472
}
473473

474-
resultsMap[k] = model_1_results.Results
474+
resultsMap[k] = model_1_results.Result
475475

476476
} else if sqlModel == 2 {
477477
if err != nil {

sqlmap.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ func (sqlMap *SqlMap) paresSql(filepath string) error {
7272
sqlMap.checkNilAndInit()
7373

7474
if strings.HasSuffix(filepath, sqlMap.Extension["xml"]) {
75-
var result Result
75+
var result XmlSql
7676
err = xml.Unmarshal(content, &result)
7777
if err != nil {
7878
return err

sqlmap_xml.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ type XmlSqlMap struct {
55
extension string
66
}
77

8-
type Result struct {
8+
type XmlSql struct {
99
Sql []Sql `xml:"sql"`
1010
}
1111

0 commit comments

Comments
 (0)