sessionplus.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727
  1. // Copyright 2015 The Xorm Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package xorm
  5. import (
  6. "encoding/json"
  7. "errors"
  8. // "fmt"
  9. "reflect"
  10. "regexp"
  11. "strings"
  12. "time"
  13. "github.com/xormplus/core"
  14. "github.com/Chronokeeper/anyxml"
  15. )
  16. type ResultBean struct {
  17. Has bool
  18. Result interface{}
  19. Error error
  20. }
  21. func (resultBean ResultBean) Json() (bool,string, error) {
  22. if resultBean.Error != nil {
  23. return resultBean.Has,"", resultBean.Error
  24. }
  25. if !resultBean.Has{
  26. return resultBean.Has,"", nil
  27. }
  28. result,err:= JSONString(resultBean.Result, true)
  29. return resultBean.Has,result,err
  30. }
  31. func (session *Session) GetFirst(bean interface{}) ResultBean {
  32. has, err := session.Get(bean)
  33. r := ResultBean{Has: has,Result:bean, Error: err}
  34. return r
  35. }
  36. func (resultBean ResultBean) Xml() (bool,string, error) {
  37. if resultBean.Error != nil {
  38. return false,"", resultBean.Error
  39. }
  40. if !resultBean.Has{
  41. return resultBean.Has,"", nil
  42. }
  43. has,result,err:=resultBean.Json()
  44. if err != nil {
  45. return false,"", err
  46. }
  47. if !has{
  48. return has,"", nil
  49. }
  50. var anydata = []byte(result)
  51. var i interface{}
  52. err = json.Unmarshal(anydata, &i)
  53. if err != nil {
  54. return false,"", err
  55. }
  56. resultByte, err := anyxml.Xml(i)
  57. if err != nil {
  58. return false,"", err
  59. }
  60. return resultBean.Has,string(resultByte),err
  61. }
  62. func (resultBean ResultBean) XmlIndent(prefix string, indent string, recordTag string) (bool,string, error) {
  63. if resultBean.Error != nil {
  64. return false,"", resultBean.Error
  65. }
  66. if !resultBean.Has{
  67. return resultBean.Has,"", nil
  68. }
  69. has,result,err:=resultBean.Json()
  70. if err != nil {
  71. return false,"", err
  72. }
  73. if !has{
  74. return has,"", nil
  75. }
  76. var anydata = []byte(result)
  77. var i interface{}
  78. err = json.Unmarshal(anydata, &i)
  79. if err != nil {
  80. return false,"", err
  81. }
  82. resultByte, err := anyxml.XmlIndent(i,prefix,indent,recordTag)
  83. if err != nil {
  84. return false,"", err
  85. }
  86. return resultBean.Has,string(resultByte),err
  87. }
  88. type ResultMap struct {
  89. Result []map[string]interface{}
  90. Error error
  91. }
  92. func (resultMap ResultMap) Json() (string, error) {
  93. if resultMap.Error != nil {
  94. return "", resultMap.Error
  95. }
  96. return JSONString(resultMap.Result, true)
  97. }
  98. func (resultMap ResultMap) Xml() (string, error) {
  99. if resultMap.Error != nil {
  100. return "", resultMap.Error
  101. }
  102. results, err := anyxml.Xml(resultMap.Result)
  103. if err != nil {
  104. return "", err
  105. }
  106. return string(results), nil
  107. }
  108. func (resultMap ResultMap) XmlIndent(prefix string, indent string, recordTag string) (string, error) {
  109. if resultMap.Error != nil {
  110. return "", resultMap.Error
  111. }
  112. results, err := anyxml.XmlIndent(resultMap.Result, prefix, indent, recordTag)
  113. if err != nil {
  114. return "", err
  115. }
  116. return string(results), nil
  117. }
  118. type ResultStructs struct {
  119. Result interface{}
  120. Error error
  121. }
  122. func (resultStructs ResultStructs) Json() (string, error) {
  123. if resultStructs.Error != nil {
  124. return "", resultStructs.Error
  125. }
  126. return JSONString(resultStructs.Result, true)
  127. }
  128. func (resultStructs ResultStructs) Xml() (string, error) {
  129. if resultStructs.Error != nil {
  130. return "", resultStructs.Error
  131. }
  132. result,err:=resultStructs.Json()
  133. if err != nil {
  134. return "", err
  135. }
  136. var anydata = []byte(result)
  137. var i interface{}
  138. err = json.Unmarshal(anydata, &i)
  139. if err != nil {
  140. return "", err
  141. }
  142. resultByte, err := anyxml.Xml(i)
  143. if err != nil {
  144. return "", err
  145. }
  146. return string(resultByte), nil
  147. }
  148. func (resultStructs ResultStructs) XmlIndent(prefix string, indent string, recordTag string) (string, error) {
  149. if resultStructs.Error != nil {
  150. return "", resultStructs.Error
  151. }
  152. result,err:=resultStructs.Json()
  153. if err != nil {
  154. return "", err
  155. }
  156. var anydata = []byte(result)
  157. var i interface{}
  158. err = json.Unmarshal(anydata, &i)
  159. if err != nil {
  160. return "", err
  161. }
  162. resultByte, err := anyxml.XmlIndent(i, prefix, indent, recordTag)
  163. if err != nil {
  164. return "", err
  165. }
  166. return string(resultByte), nil
  167. }
  168. func (session *Session) Find(rowsSlicePtr interface{}, condiBean ...interface{}) ResultStructs{
  169. err := session.find(rowsSlicePtr, condiBean...)
  170. r := ResultStructs{Result: rowsSlicePtr, Error: err}
  171. return r
  172. }
  173. // Exec a raw sql and return records as []map[string]interface{}
  174. func (session *Session) Query() ResultMap {
  175. sql := session.Statement.RawSQL
  176. params := session.Statement.RawParams
  177. result, err := session.queryAll(sql, params...)
  178. r := ResultMap{Result: result, Error: err}
  179. return r
  180. }
  181. // Exec a raw sql and return records as []map[string]interface{}
  182. func (session *Session) QueryWithDateFormat(dateFormat string) ResultMap {
  183. sql := session.Statement.RawSQL
  184. params := session.Statement.RawParams
  185. result, err := session.queryAllWithDateFormat(dateFormat, sql, params...)
  186. r := ResultMap{Result: result, Error: err}
  187. return r
  188. }
  189. // Exec a raw sql and return records as []map[string]interface{}
  190. func (session *Session) QueryByParamMap() ResultMap {
  191. sql := session.Statement.RawSQL
  192. params := session.Statement.RawParams
  193. result, err := session.queryAllByMap(sql, params[0])
  194. r := ResultMap{Result: result, Error: err}
  195. return r
  196. }
  197. func (session *Session) QueryByParamMapWithDateFormat(dateFormat string) ResultMap {
  198. sql := session.Statement.RawSQL
  199. params := session.Statement.RawParams
  200. results, err := session.queryAllByMapWithDateFormat(dateFormat, sql, params[0])
  201. r := ResultMap{Result: results, Error: err}
  202. return r
  203. }
  204. // =============================
  205. // for Object
  206. // =============================
  207. func (session *Session) queryAll(sqlStr string, paramStr ...interface{}) (resultsSlice []map[string]interface{}, err error) {
  208. session.queryPreprocess(&sqlStr, paramStr...)
  209. if session.IsAutoCommit {
  210. return query3(session.DB(), sqlStr, paramStr...)
  211. }
  212. return txQuery3(session.Tx, sqlStr, paramStr...)
  213. }
  214. func (session *Session) queryAllByMap(sqlStr string, paramMap interface{}) (resultsSlice []map[string]interface{}, err error) {
  215. sqlStr1, param, _ := core.MapToSlice(sqlStr, paramMap)
  216. session.queryPreprocess(&sqlStr1, param...)
  217. if session.IsAutoCommit {
  218. return query3(session.DB(), sqlStr1, param...)
  219. }
  220. return txQuery3(session.Tx, sqlStr1, param...)
  221. }
  222. func (session *Session) queryAllByMapWithDateFormat(dateFormat string, sqlStr string, paramMap interface{}) (resultsSlice []map[string]interface{}, err error) {
  223. sqlStr1, param, _ := core.MapToSlice(sqlStr, paramMap)
  224. session.queryPreprocess(&sqlStr1, param...)
  225. if session.IsAutoCommit {
  226. return query3WithDateFormat(session.DB(), dateFormat, sqlStr1, param...)
  227. }
  228. return txQuery3WithDateFormat(session.Tx, dateFormat, sqlStr1, param...)
  229. }
  230. func (session *Session) queryAllWithDateFormat(dateFormat string, sqlStr string, paramStr ...interface{}) (resultsSlice []map[string]interface{}, err error) {
  231. session.queryPreprocess(&sqlStr, paramStr...)
  232. if session.IsAutoCommit {
  233. return query3WithDateFormat(session.DB(), dateFormat, sqlStr, paramStr...)
  234. }
  235. return txQuery3WithDateFormat(session.Tx, dateFormat, sqlStr, paramStr...)
  236. }
  237. func (session *Session) queryAllToJsonString(sql string, paramStr ...interface{}) (string, error) {
  238. results, err := session.queryAll(sql, paramStr...)
  239. if err != nil {
  240. return "", err
  241. }
  242. return JSONString(results, true)
  243. }
  244. func (session *Session) queryAllToXmlString(sql string, paramStr ...interface{}) (string, error) {
  245. resultMap, err := session.queryAll(sql, paramStr...)
  246. if err != nil {
  247. return "", err
  248. }
  249. results, err := anyxml.Xml(resultMap)
  250. if err != nil {
  251. return "", err
  252. }
  253. return string(results), nil
  254. }
  255. func (session *Session) queryAllToXmlIndentString(sql string, prefix string, indent string, paramStr ...interface{}) (string, error) {
  256. resultSlice, err := session.queryAll(sql, paramStr...)
  257. if err != nil {
  258. return "", err
  259. }
  260. results, err := anyxml.XmlIndent(resultSlice, prefix, indent, "result")
  261. if err != nil {
  262. return "", err
  263. }
  264. return string(results), nil
  265. }
  266. func (session *Session) queryAllToXmlStringWithDateFormat(dateFormat string, sql string, paramStr ...interface{}) (string, error) {
  267. resultSlice, err := session.queryAll(sql, paramStr...)
  268. if err != nil {
  269. return "", err
  270. }
  271. results, err := anyxml.XmlWithDateFormat(dateFormat, resultSlice)
  272. if err != nil {
  273. return "", err
  274. }
  275. return string(results), nil
  276. }
  277. func (session *Session) queryAllToXmlIndentStringWithDateFormat(dateFormat string, sql string, prefix string, indent string, paramStr ...interface{}) (string, error) {
  278. resultSlice, err := session.queryAll(sql, paramStr...)
  279. if err != nil {
  280. return "", err
  281. }
  282. results, err := anyxml.XmlIndentWithDateFormat(dateFormat, resultSlice, prefix, indent, "results")
  283. if err != nil {
  284. return "", err
  285. }
  286. return string(results), nil
  287. }
  288. func (session *Session) queryAllByMapToJsonString(sql string, paramMap interface{}) (string, error) {
  289. results, err := session.queryAllByMap(sql, paramMap)
  290. if err != nil {
  291. return "", err
  292. }
  293. return JSONString(results, true)
  294. }
  295. func (session *Session) queryAllByMapToJsonStringWithDateFormat(dateFormat string, sql string, paramMap interface{}) (string, error) {
  296. results, err := session.queryAllByMapWithDateFormat(dateFormat, sql, paramMap)
  297. if err != nil {
  298. return "", err
  299. }
  300. return JSONString(results, true)
  301. }
  302. func (session *Session) queryAllToJsonStringWithDateFormat(dateFormat string, sql string, paramStr ...interface{}) (string, error) {
  303. results, err := session.queryAllWithDateFormat(dateFormat, sql, paramStr...)
  304. if err != nil {
  305. return "", err
  306. }
  307. return JSONString(results, true)
  308. }
  309. func (session *Session) row2BeanWithDateFormat(dateFormat string, rows *core.Rows, fields []string, fieldsCount int, bean interface{}) error {
  310. dataStruct := rValue(bean)
  311. if dataStruct.Kind() != reflect.Struct {
  312. return errors.New("Expected a pointer to a struct")
  313. }
  314. table := session.Engine.autoMapType(dataStruct)
  315. return session._row2BeanWithDateFormat(dateFormat, rows, fields, fieldsCount, bean, &dataStruct, table)
  316. }
  317. func (session *Session) _row2BeanWithDateFormat(dateFormat string, rows *core.Rows, fields []string, fieldsCount int, bean interface{}, dataStruct *reflect.Value, table *core.Table) error {
  318. scanResults := make([]interface{}, fieldsCount)
  319. for i := 0; i < len(fields); i++ {
  320. var cell interface{}
  321. scanResults[i] = &cell
  322. }
  323. if err := rows.Scan(scanResults...); err != nil {
  324. return err
  325. }
  326. if b, hasBeforeSet := bean.(BeforeSetProcessor); hasBeforeSet {
  327. for ii, key := range fields {
  328. b.BeforeSet(key, Cell(scanResults[ii].(*interface{})))
  329. }
  330. }
  331. var tempMap = make(map[string]int)
  332. for ii, key := range fields {
  333. var idx int
  334. var ok bool
  335. if idx, ok = tempMap[strings.ToLower(key)]; !ok {
  336. idx = 0
  337. } else {
  338. idx = idx + 1
  339. }
  340. tempMap[strings.ToLower(key)] = idx
  341. if fieldValue := session.getField(dataStruct, key, table, idx); fieldValue != nil {
  342. rawValue := reflect.Indirect(reflect.ValueOf(scanResults[ii]))
  343. //if row is null then ignore
  344. if rawValue.Interface() == nil {
  345. continue
  346. }
  347. if fieldValue.CanAddr() {
  348. if structConvert, ok := fieldValue.Addr().Interface().(core.Conversion); ok {
  349. if data, err := value2Bytes(&rawValue); err == nil {
  350. structConvert.FromDB(data)
  351. } else {
  352. session.Engine.LogError(err)
  353. }
  354. continue
  355. }
  356. }
  357. if _, ok := fieldValue.Interface().(core.Conversion); ok {
  358. if data, err := value2Bytes(&rawValue); err == nil {
  359. if fieldValue.Kind() == reflect.Ptr && fieldValue.IsNil() {
  360. fieldValue.Set(reflect.New(fieldValue.Type().Elem()))
  361. }
  362. fieldValue.Interface().(core.Conversion).FromDB(data)
  363. } else {
  364. session.Engine.LogError(err)
  365. }
  366. continue
  367. }
  368. rawValueType := reflect.TypeOf(rawValue.Interface())
  369. vv := reflect.ValueOf(rawValue.Interface())
  370. fieldType := fieldValue.Type()
  371. hasAssigned := false
  372. switch fieldType.Kind() {
  373. case reflect.Complex64, reflect.Complex128:
  374. if rawValueType.Kind() == reflect.String {
  375. hasAssigned = true
  376. x := reflect.New(fieldType)
  377. err := json.Unmarshal([]byte(vv.String()), x.Interface())
  378. if err != nil {
  379. session.Engine.LogError(err)
  380. return err
  381. }
  382. fieldValue.Set(x.Elem())
  383. }
  384. case reflect.Slice, reflect.Array:
  385. switch rawValueType.Kind() {
  386. case reflect.Slice, reflect.Array:
  387. switch rawValueType.Elem().Kind() {
  388. case reflect.Uint8:
  389. if fieldType.Elem().Kind() == reflect.Uint8 {
  390. hasAssigned = true
  391. fieldValue.Set(vv)
  392. }
  393. }
  394. }
  395. case reflect.String:
  396. if rawValueType.Kind() == reflect.String {
  397. hasAssigned = true
  398. fieldValue.SetString(vv.String())
  399. }
  400. case reflect.Bool:
  401. if rawValueType.Kind() == reflect.Bool {
  402. hasAssigned = true
  403. fieldValue.SetBool(vv.Bool())
  404. }
  405. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  406. switch rawValueType.Kind() {
  407. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  408. hasAssigned = true
  409. fieldValue.SetInt(vv.Int())
  410. }
  411. case reflect.Float32, reflect.Float64:
  412. switch rawValueType.Kind() {
  413. case reflect.Float32, reflect.Float64:
  414. hasAssigned = true
  415. fieldValue.SetFloat(vv.Float())
  416. }
  417. case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint:
  418. switch rawValueType.Kind() {
  419. case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint:
  420. hasAssigned = true
  421. fieldValue.SetUint(vv.Uint())
  422. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  423. hasAssigned = true
  424. fieldValue.SetUint(uint64(vv.Int()))
  425. }
  426. case reflect.Struct:
  427. if fieldType.ConvertibleTo(core.TimeType) {
  428. if rawValueType == core.TimeType {
  429. hasAssigned = true
  430. t := vv.Convert(core.TimeType).Interface().(time.Time)
  431. z, _ := t.Zone()
  432. if len(z) == 0 || t.Year() == 0 { // !nashtsai! HACK tmp work around for lib/pq doesn't properly time with location
  433. session.Engine.LogDebug("empty zone key[%v] : %v | zone: %v | location: %+v\n", key, t, z, *t.Location())
  434. t = time.Date(t.Year(), t.Month(), t.Day(), t.Hour(),
  435. t.Minute(), t.Second(), t.Nanosecond(), time.Local)
  436. }
  437. // !nashtsai! convert to engine location
  438. t = t.In(session.Engine.TZLocation)
  439. // dateFormat to string
  440. loc, _ := time.LoadLocation("Local") //重要:获取时区 rawValue.Interface().(time.Time).Format(dateFormat)
  441. t, _ = time.ParseInLocation(dateFormat, t.Format(dateFormat), loc)
  442. // fieldValue.Set(reflect.ValueOf(t).Convert(core.StringType))
  443. fieldValue.Set(reflect.ValueOf(t).Convert(fieldType))
  444. // t = fieldValue.Interface().(time.Time)
  445. // z, _ = t.Zone()
  446. // session.Engine.LogDebug("fieldValue key[%v]: %v | zone: %v | location: %+v\n", key, t, z, *t.Location())
  447. } else if rawValueType == core.IntType || rawValueType == core.Int64Type ||
  448. rawValueType == core.Int32Type {
  449. hasAssigned = true
  450. t := time.Unix(vv.Int(), 0).In(session.Engine.TZLocation)
  451. vv = reflect.ValueOf(t)
  452. fieldValue.Set(vv)
  453. }
  454. } else if session.Statement.UseCascade {
  455. table := session.Engine.autoMapType(*fieldValue)
  456. if table != nil {
  457. if len(table.PrimaryKeys) > 1 {
  458. panic("unsupported composited primary key cascade")
  459. }
  460. var pk = make(core.PK, len(table.PrimaryKeys))
  461. switch rawValueType.Kind() {
  462. case reflect.Int64:
  463. pk[0] = vv.Int()
  464. case reflect.Int:
  465. pk[0] = int(vv.Int())
  466. case reflect.Int32:
  467. pk[0] = int32(vv.Int())
  468. case reflect.Int16:
  469. pk[0] = int16(vv.Int())
  470. case reflect.Int8:
  471. pk[0] = int8(vv.Int())
  472. case reflect.Uint64:
  473. pk[0] = vv.Uint()
  474. case reflect.Uint:
  475. pk[0] = uint(vv.Uint())
  476. case reflect.Uint32:
  477. pk[0] = uint32(vv.Uint())
  478. case reflect.Uint16:
  479. pk[0] = uint16(vv.Uint())
  480. case reflect.Uint8:
  481. pk[0] = uint8(vv.Uint())
  482. case reflect.String:
  483. pk[0] = vv.String()
  484. default:
  485. panic("unsupported primary key type cascade")
  486. }
  487. if !isPKZero(pk) {
  488. // !nashtsai! TODO for hasOne relationship, it's preferred to use join query for eager fetch
  489. // however, also need to consider adding a 'lazy' attribute to xorm tag which allow hasOne
  490. // property to be fetched lazily
  491. structInter := reflect.New(fieldValue.Type())
  492. newsession := session.Engine.NewSession()
  493. defer newsession.Close()
  494. has, err := newsession.Id(pk).NoCascade().Get(structInter.Interface())
  495. if err != nil {
  496. return err
  497. }
  498. if has {
  499. v := structInter.Elem().Interface()
  500. fieldValue.Set(reflect.ValueOf(v))
  501. } else {
  502. return errors.New("cascade obj is not exist!")
  503. }
  504. }
  505. } else {
  506. session.Engine.LogError("unsupported struct type in Scan: ", fieldValue.Type().String())
  507. }
  508. }
  509. case reflect.Ptr:
  510. // !nashtsai! TODO merge duplicated codes above
  511. //typeStr := fieldType.String()
  512. switch fieldType {
  513. // following types case matching ptr's native type, therefore assign ptr directly
  514. case core.PtrStringType:
  515. if rawValueType.Kind() == reflect.String {
  516. x := vv.String()
  517. hasAssigned = true
  518. fieldValue.Set(reflect.ValueOf(&x))
  519. }
  520. case core.PtrBoolType:
  521. if rawValueType.Kind() == reflect.Bool {
  522. x := vv.Bool()
  523. hasAssigned = true
  524. fieldValue.Set(reflect.ValueOf(&x))
  525. }
  526. case core.PtrTimeType:
  527. if rawValueType == core.PtrTimeType {
  528. hasAssigned = true
  529. var x time.Time = rawValue.Interface().(time.Time)
  530. fieldValue.Set(reflect.ValueOf(&x))
  531. }
  532. case core.PtrFloat64Type:
  533. if rawValueType.Kind() == reflect.Float64 {
  534. x := vv.Float()
  535. hasAssigned = true
  536. fieldValue.Set(reflect.ValueOf(&x))
  537. }
  538. case core.PtrUint64Type:
  539. if rawValueType.Kind() == reflect.Int64 {
  540. var x uint64 = uint64(vv.Int())
  541. hasAssigned = true
  542. fieldValue.Set(reflect.ValueOf(&x))
  543. }
  544. case core.PtrInt64Type:
  545. if rawValueType.Kind() == reflect.Int64 {
  546. x := vv.Int()
  547. hasAssigned = true
  548. fieldValue.Set(reflect.ValueOf(&x))
  549. }
  550. case core.PtrFloat32Type:
  551. if rawValueType.Kind() == reflect.Float64 {
  552. var x float32 = float32(vv.Float())
  553. hasAssigned = true
  554. fieldValue.Set(reflect.ValueOf(&x))
  555. }
  556. case core.PtrIntType:
  557. if rawValueType.Kind() == reflect.Int64 {
  558. var x int = int(vv.Int())
  559. hasAssigned = true
  560. fieldValue.Set(reflect.ValueOf(&x))
  561. }
  562. case core.PtrInt32Type:
  563. if rawValueType.Kind() == reflect.Int64 {
  564. var x int32 = int32(vv.Int())
  565. hasAssigned = true
  566. fieldValue.Set(reflect.ValueOf(&x))
  567. }
  568. case core.PtrInt8Type:
  569. if rawValueType.Kind() == reflect.Int64 {
  570. var x int8 = int8(vv.Int())
  571. hasAssigned = true
  572. fieldValue.Set(reflect.ValueOf(&x))
  573. }
  574. case core.PtrInt16Type:
  575. if rawValueType.Kind() == reflect.Int64 {
  576. var x int16 = int16(vv.Int())
  577. hasAssigned = true
  578. fieldValue.Set(reflect.ValueOf(&x))
  579. }
  580. case core.PtrUintType:
  581. if rawValueType.Kind() == reflect.Int64 {
  582. var x uint = uint(vv.Int())
  583. hasAssigned = true
  584. fieldValue.Set(reflect.ValueOf(&x))
  585. }
  586. case core.PtrUint32Type:
  587. if rawValueType.Kind() == reflect.Int64 {
  588. var x uint32 = uint32(vv.Int())
  589. hasAssigned = true
  590. fieldValue.Set(reflect.ValueOf(&x))
  591. }
  592. case core.Uint8Type:
  593. if rawValueType.Kind() == reflect.Int64 {
  594. var x uint8 = uint8(vv.Int())
  595. hasAssigned = true
  596. fieldValue.Set(reflect.ValueOf(&x))
  597. }
  598. case core.Uint16Type:
  599. if rawValueType.Kind() == reflect.Int64 {
  600. var x uint16 = uint16(vv.Int())
  601. hasAssigned = true
  602. fieldValue.Set(reflect.ValueOf(&x))
  603. }
  604. case core.Complex64Type:
  605. var x complex64
  606. err := json.Unmarshal([]byte(vv.String()), &x)
  607. if err != nil {
  608. session.Engine.LogError(err)
  609. } else {
  610. fieldValue.Set(reflect.ValueOf(&x))
  611. }
  612. hasAssigned = true
  613. case core.Complex128Type:
  614. var x complex128
  615. err := json.Unmarshal([]byte(vv.String()), &x)
  616. if err != nil {
  617. session.Engine.LogError(err)
  618. } else {
  619. fieldValue.Set(reflect.ValueOf(&x))
  620. }
  621. hasAssigned = true
  622. } // switch fieldType
  623. // default:
  624. // session.Engine.LogError("unsupported type in Scan: ", reflect.TypeOf(v).String())
  625. } // switch fieldType.Kind()
  626. // !nashtsai! for value can't be assigned directly fallback to convert to []byte then back to value
  627. if !hasAssigned {
  628. data, err := value2Bytes(&rawValue)
  629. if err == nil {
  630. session.bytes2Value(table.GetColumn(key), fieldValue, data)
  631. } else {
  632. session.Engine.LogError(err.Error())
  633. }
  634. }
  635. }
  636. }
  637. return nil
  638. }
  639. func (session *Session) queryPreprocessByMap(sqlStr *string, paramMap interface{}) {
  640. re := regexp.MustCompile(`[?](\w+)`)
  641. query := *sqlStr
  642. names := make(map[string]int)
  643. var i int
  644. query = re.ReplaceAllStringFunc(query, func(src string) string {
  645. names[src[1:]] = i
  646. i += 1
  647. return "?"
  648. })
  649. for _, filter := range session.Engine.dialect.Filters() {
  650. query = filter.Do(query, session.Engine.dialect, session.Statement.RefTable)
  651. }
  652. *sqlStr = query
  653. session.Engine.logSQL(*sqlStr, paramMap)
  654. }